рдЕрд▓реНрдк рд╡рд┐рд░рд╛рдо рдХреЗ рдмрд╛рдж, рд╣рдо рдЕрдкрдирд╛
рд╡рд┐рдХрд╛рд╕ рдЬрд╛рд░реА рд░рдЦреЗрдВрдЧреЗред рдЖрдЬ рд╣рдо рдЗрд╕ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЗ рд▓рд┐рдП рдПрдХ рдЫреЛрдЯрд╛ рд╕рд╛ рдзреНрд╡рдирд┐ рдкреНрд░рднрд╛рд╡ рдЬреЛрдбрд╝реЗрдВрдЧреЗ, рдЬрдм рдЧреЗрдВрдж рдЦреЗрд▓ рдХреЗ рдореИрджрд╛рди рдкрд░ рдХреБрдЫ рд╣рд┐рдЯ рдХрд░рддреА рд╣реИред рдореИрдВрдиреЗ рдкрд╣рд▓реЗ рд╣реА SoundEngine рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд▓рд┐рдЦрд╛ рдерд╛ (рдЬрд┐рд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рд╣рдо рдЖрдЬ рдХрд░реЗрдВрдЧреЗ)ред рдЗрд╕ рдХрд╛рд░рдг рд╕реЗ, рдЖрдЬ рдореИрдВ рдЖрдкрдХреЛ рдЙрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЗрддрдирд╛ рдирд╣реАрдВ рдмрддрд╛рдКрдВрдЧрд╛, рд▓реЗрдХрд┐рди рдЗрд╕рдХреЗ рдЙрдкрдпреЛрдЧ рд╕реЗ рдЙрд╕ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдкрд░ рдХреНрдпрд╛ рдкреНрд░рднрд╛рд╡ рдкрдбрд╝реЗрдЧрд╛ рдЬреЛ рд╣рдо рд╡рд┐рдХрд╕рд┐рдд рдХрд░ рд░рд╣реЗ рд╣реИрдВред
SoundEngine рдкрд░рд┐рдпреЛрдЬрдирд╛ рдореЗрдВ рд╢рд╛рдорд┐рд▓ рдХрд░рдиреЗ рдХрд╛ рдореБрдЦреНрдп (рдФрд░ рдореЗрд░реЗ рд▓рд┐рдП рдХреБрдЫ рдЕрдкреНрд░рддреНрдпрд╛рд╢рд┐рдд) рдкрд░рд┐рдгрд╛рдо IwGl рд╕реЗ IwGx рдкрд░ рд╕реНрд╡рд┐рдЪ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдереАред рддрдереНрдп рдпрд╣ рд╣реИ рдХрд┐ рд╕рд╛рдЙрдВрдбрдлрд╛рдЗрдирди рдзреНрд╡рдирд┐ рдкреНрд░рднрд╛рд╡реЛрдВ рдХрд╛ рд╡рд┐рд╡рд░рдг рдбрд╛рдЙрдирд▓реЛрдб рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП IwResManager рд╕рдмрд╕рд┐рд╕реНрдЯрдо рдХреА рдХреНрд╖рдорддрд╛рдУрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред рд╡рд┐рд╡рд░рдг рд╕реНрд╡рдпрдВ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рд╣реИ:
sounds.groupCIwResGroup { name "sounds" "./sounds/contact.wav" CIwSoundSpec { name "contact" data "contact" vol 0.9 loop false } CIwSoundGroup { name "sound_effects" maxPolyphony 8 killOldest true addSpec "contact" } }
рдкрд░рд┐рдпреЛрдЬрдирд╛ рдореЗрдВ IwResManager рдХреЛ рд╢рд╛рдорд┐рд▓ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдЗрд╕ рддрдереНрдп рдХреА рдУрд░ рдЬрд╛рддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдмрд╕ рд╕рдВрдХрд▓рди рдмрдВрдж рдХрд░ рджреЗрддрд╛ рд╣реИ:
IwGeom рдХреЛ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдореЗрдВ рдЬреЛрдбрд╝рдиреЗ рд╕реЗ рднреА рдереЛрдбрд╝реА рдорджрдж рдорд┐рд▓рддреА рд╣реИ:
рд╕реНрдерд┐рддрд┐ рдХреЛ рд╕реБрдзрд╛рд░рдиреЗ рдХреЗ рд▓рд┐рдП рдлрд▓рд╣реАрди рдкреНрд░рдпрд╛рд╕реЛрдВ рдХреЗ рдмрд╛рдж, рдореИрдВрдиреЗ IwGl рдХреЗ рдЙрдкрдпреЛрдЧ рдХреЛ рдЫреЛрдбрд╝рдиреЗ рдФрд░ IwGx рдкрд░ рд╕реНрд╡рд┐рдЪ рдХрд░рдиреЗ рдХрд╛ рдирд┐рд░реНрдгрдп рд▓рд┐рдпрд╛ред рдХрд┐рд╕реА рднреА рдорд╛рдорд▓реЗ рдореЗрдВ рдореИрдВ рдЬреЛрд░ рдирд╣реАрдВ рджреЗрддрд╛ рдХрд┐ рдпрд╣ рдПрдХрдорд╛рддреНрд░ рд╕рдВрднрд╡ рд╕рдорд╛рдзрд╛рди рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдореБрдЭреЗ рд╕рдмрд╕реЗ рдЙрдЪрд┐рдд рд▓рдЧрд╛ред
рд╣рдореЗрд╢рд╛ рдХреА рддрд░рд╣, mkb рдлрд╝рд╛рдЗрд▓ рд╕реЗ рд╢реБрд░реВ рдХрд░реЗрдВ:
arcanoid.mkb #!/usr/bin/env mkb options { module_path="../yaml" module_path="../box2d" + module_path="$MARMALADE_ROOT/examples" } subprojects { - iwgl + iwgx + iwresmanager + SoundEngine yaml box2d } includepath { ./source/Main ./source/Model } files { [Main] (source/Main) Main.cpp Main.h Quads.cpp Quads.h TouchPad.cpp TouchPad.h Desktop.cpp Desktop.h IO.cpp IO.h World.cpp World.h + ResourceManager.cpp + ResourceManager.h [Model] (source/Model) IBox2DItem.h Board.cpp Board.h Bricks.cpp Bricks.h Ball.cpp Ball.h Handle.cpp Handle.h + [Data] + (data) + sounds.group } assets { (data) level.json + (data-ram/data-gles1, data/data-gles1) + sounds.group.bin }
рд▓реЛрдб рд╣реЛ рд░рд╣рд╛ рд╣реИ рдФрд░ рдЦреЗрд▓ рд╕рдВрд╕рд╛рдзрдиреЛрдВ рдПрдХ рдирдП (рдФрд░ рдЕрдм рддрдХ рдмрд╣реБрдд рд╕рд░рд▓) рдореЙрдбреНрдпреВрд▓ рджреНрд╡рд╛рд░рд╛ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛:
ResourceManager.h #ifndef _RESOURCEMANAGER_H_ #define _RESOURCEMANAGER_H_ #include <map> #include <string> #include "s3e.h" #include "IwResManager.h" #include "IwSound.h" #define SOUND_GROUP "sounds" using namespace std; class ResourceManager { private: bool checkSound() {return true;} public: void init(); void release(); void update(); void fireSound(const char* name); }; extern ResourceManager rm; #endif // _RESOURCEMANAGER_H_
ResourceManager.cpp #include "ResourceManager.h" ResourceManager rm; void ResourceManager::init() { IwSoundInit(); IwResManagerInit(); #ifdef IW_BUILD_RESOURCES IwGetResManager()->AddHandler(new CIwResHandlerWAV); #endif IwGetResManager()->LoadGroup("sounds.group"); } void ResourceManager::release() { IwResManagerTerminate(); IwSoundTerminate(); } void ResourceManager::update() { IwGetSoundManager()->Update(); } void ResourceManager::fireSound(const char* name) { if (!checkSound()) return; CIwResGroup* resGroup = IwGetResManager()->GetGroupNamed(SOUND_GROUP); CIwSoundSpec* SoundSpec = (CIwSoundSpec*)resGroup->GetResNamed(name, IW_SOUND_RESTYPE_SPEC); CIwSoundInst* SoundInstance = SoundSpec->Play(); }
рд╡рд┐рд╢реНрд╡ рдореЙрдбреНрдпреВрд▓ рд╕реЗ рдзреНрд╡рдирд┐ рдкреНрд░рднрд╛рд╡ рдХреЛ рд╕рдХреНрд░рд┐рдп рдХрд░рдирд╛ рд╕рд░рд▓ рдФрд░ рдЖрд╕рд╛рди рд╣реЛрдЧрд╛:
World.cpp #include "s3e.h" +#include "ResourceManager.h" #include "World.h" #include "Ball.h" ... void World::PostSolve(b2Contact* contact, const b2ContactImpulse* impulse) { impact(contact->GetFixtureA()->GetBody()); impact(contact->GetFixtureB()->GetBody()); isContacted = true; + rm.fireSound(CONTACT_SOUND); }
рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдпреЗ рд╕рднреА рдкрд░рд┐рд╡рд░реНрддрди рд╣реИрдВ рдЬреЛ рдзреНрд╡рдирд┐ рдкреНрд░рднрд╛рд╡реЛрдВ рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рдереЗред рдЕрдм рд╣рдореЗрдВ IwGl рд╕реЗ IwGx рдореЗрдВ рд╕рдВрдХреНрд░рдордг рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рдХрдИ рдмрджрд▓рд╛рд╡ рдХрд░рдиреЗ рд╣реИрдВред
Desktop.cpp #include "Desktop.h" #include "IwGx.h" #include "s3e.h" Desktop desktop; void Desktop::init() { IwGxInit(); IwGxLightingOff(); width = IwGxGetScreenWidth(); height = IwGxGetScreenHeight(); IwGxSetColClear(0, 0, 0, 0); vSize = 0; duration = 1000 / 60; } void Desktop::release() { IwGxTerminate(); } void Desktop::update() { IwGxClear(IW_GX_COLOUR_BUFFER_F | IW_GX_DEPTH_BUFFER_F); CIwMaterial* pMat = IW_GX_ALLOC_MATERIAL(); IwGxSetMaterial(pMat); } void Desktop::refresh() { IwGxFlush(); IwGxSwapBuffers(); s3eDeviceYield(duration); } int Desktop::toRSize(int x) const { if (vSize == 0) return x; return (x * width) / vSize; }
Quads.h #ifndef _QUADS_H_ #define _QUADS_H_ #include "IwGX.h" #define MAX_VERTS 2000 class Quads { private: CIwSVec2 verts[MAX_VERTS]; CIwColour cols[MAX_VERTS]; int vertc; public: void update() {vertc = 0;} void refresh(); void setVert(int x, int y, int r, int g, int b, int a); }; extern Quads quads; #endif
Quads.cpp #include "Quads.h" #include "s3e.h" Quads quads; void Quads::refresh() { IwGxSetVertStreamScreenSpace(verts, vertc); IwGxSetColStream(cols, vertc); IwGxDrawPrims(IW_GX_TRI_LIST, NULL, vertc); } void Quads::setVert(int x, int y, int r, int g, int b, int a) { if (vertc >= MAX_VERTS) return; verts[vertc].x = x; verts[vertc].y = y; cols[vertc].r = r; cols[vertc].g = g; cols[vertc].b = b; cols[vertc].a = a; vertc++; }
Bricks.h #ifndef _BRICKS_H_ #define _BRICKS_H_ #include "IwGX.h" #include "s3e.h" #include "Desktop.h" #include "World.h" #include "IBox2DItem.h" #define BRICK_HALF_WIDTH 20 #define BRICK_HALF_HEIGHT 10 #include <vector> using namespace std; class Bricks: public IBox2DItem { private: struct SBrick { SBrick(int x, int y): x(x), y(y), body(NULL), isBroken(false), hw(BRICK_HALF_WIDTH), hh(BRICK_HALF_HEIGHT) {} SBrick(const SBrick& p): x(px), y(py), body(p.body), isBroken(p.isBroken), hw(p.hw), hh(p.hh) {} int x, y, hw, hh; int isBroken; b2Body* body; }; vector<SBrick>* bricks; virtual bool impact(b2Body* b); public: Bricks(): bricks() {} void init(); void release(); void refresh(); void clear(){bricks->clear();} void add(SBrick& b); typedef vector<SBrick>::iterator BIter; friend class Board; }; #endif // _BRICKS_H_
Bricks.cpp #include "Bricks.h" #include "Quads.h" void Bricks::init() { bricks = new vector<SBrick>(); } void Bricks::release() { delete bricks; } void Bricks::refresh() { for (BIter p = bricks->begin(); p != bricks->end(); ++p) { if (p->isBroken) continue; quads.setVert(p->x - p->hw, p->y - p->hh, 0x00, 0xff, 0x50, 0xff); quads.setVert(p->x - p->hw, p->y + p->hh, 0x00, 0xff, 0x50, 0xff); quads.setVert(p->x + p->hw, p->y - p->hh, 0x00, 0xff, 0x50, 0xff); quads.setVert(p->x + p->hw, p->y + p->hh, 0x00, 0xff, 0x50, 0xff); quads.setVert(p->x + p->hw, p->y - p->hh, 0x00, 0xff, 0x50, 0xff); quads.setVert(p->x - p->hw, p->y + p->hh, 0x00, 0xff, 0x50, 0xff); } } bool Bricks::impact(b2Body* b) { for (BIter p = bricks->begin(); p != bricks->end(); ++p) { if (p->body == b) { p->isBroken = true; return true; } } return false; } void Bricks::add(SBrick& b) { b.body = world.addBrick(bx, by, b.hw, b.hh, (IBox2DItem*)this); bricks->push_back(b); }
рдпрд╣рд╛рдВ рдЖрдкрдХреЛ рддреНрд░рд┐рднреБрдЬреЛрдВ рдореЗрдВ рддрд┐рд░рдЫреЗ рдЖрдШрд╛рдд рдХреЗ рдХреНрд░рдо рдкрд░ рдзреНрдпрд╛рди рджреЗрдирд╛ рдЪрд╛рд╣рд┐рдПред рдкрд╣рд▓реА рдЪреАрдЬ рдЬреЛ рдореИрдВрдиреЗ рджреЗрдЦреА, IwGl рд╕реЗ IwGx рдкрд░ рд╕реНрд╡рд┐рдЪ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рдИрдВрдЯреЛрдВ рдХреЗ рдХреЛрдпрд▓реЗ-рдХрд╛рд▓реЗ рдЖрдВрдХрдбрд╝реЗ рдФрд░ рдзреАрд░реЗ рдмреИрдВрдЧрдиреА рдкреГрд╖реНрдарднреВрдорд┐ рдкрд░ рдПрдХ рдЧреЗрдВрдж рдереАред рдореИрдВ "рдЕрдВрджрд░ рд╕реЗ" рдмрд┐рд▓реНрдХреБрд▓ рдЙрди рд╕рднреА рддреНрд░рд┐рдХреЛрдгреЛрдВ рдХреЛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдореЗрдВ рдХрд╛рдордпрд╛рдм рд░рд╣рд╛ рдЬреЛ рдореЗрд░реЗ рдкрд╛рд╕ рдереЗред
рд╕реНрдореГрддрд┐ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рд╡рд╛рд▓реА рджреВрд╕рд░реА рдорд╣рддреНрд╡рдкреВрд░реНрдг рдмрд╛рдд рд╣реИред рдореБрдЭреЗ рдирд╣реАрдВ рдкрддрд╛ рдХрд┐ IwGx рдореЗрдореЛрд░реА рдХреЗ рд╕рд╛рде рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЕрдВрдЧреВрдареЗ рдХрд╛ рдПрдХ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдирд┐рдпрдо рд╣реИ рдЬреЛ рдореИрдВ рдЖрдпрд╛ рдерд╛ред рдЧрддрд┐рд╢реАрд▓ рд░реВрдк рд╕реЗ рдЖрд╡рдВрдЯрд┐рдд рд╕рднреА рдореЗрдореЛрд░реА (рдПрд╕рдЯреАрдПрд▓ рдореЗрдВ) рдХреЛ рддрдм рддрдХ рдореБрдХреНрдд рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП рдЬрдм рддрдХ рдХрд┐ IwGxTerminate рдирд╣реАрдВ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ (рдЕрдиреНрдпрдерд╛ рдпрд╣ рдирд╖реНрдЯ рд╣реЛ рдЬрд╛рдПрдЧрд╛)ред рдЗрд╕ рдХрд╛рд░рдг рд╕реЗ, рдИрдВрдЯ рд╡реЗрдХреНрдЯрд░ рд╡реЗрдХреНрдЯрд░ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рдВрдХреЗрддрдХ рдмрди рдЧрдпрд╛ рд╣реИред рд╢рд╛рдпрдж рдпрд╣ рд╕рдмрд╕реЗ рд╕реБрд░реБрдЪрд┐рдкреВрд░реНрдг рд╕рдорд╛рдзрд╛рди рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдЗрд╕рдиреЗ рдЖрд╡рд╢реНрдпрдХ рдкрд░рд┐рд╡рд░реНрддрди рдХреА рдиреНрдпреВрдирддрдо рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ рдкреНрд░рд╡реЗрд╢ рдХрд┐рдпрд╛ред
рдЗрд╕реА рддрд░рд╣, рд╣рдо рд╢реЗрд╖ рдореЙрдбреНрдпреВрд▓ рдХреЛ рдмрджрд▓рддреЗ рд╣реИрдВ:
Ball.h #ifndef _BALL_H_ #define _BALL_H_ #include <vector> #include "s3e.h" #include "Desktop.h" #include "World.h" #include "IBox2DItem.h" #define MAX_SEGMENTS 7 #define BALL_RADIUS 15 using namespace std; class Ball: public IBox2DItem { private: struct Offset { Offset(int dx, int dy): dx(dx), dy(dy) {} Offset(const Offset& p): dx(p.dx), dy(p.dy) {} int dx, dy; }; vector<Offset>* offsets; int x; int y; b2Body* body; public: void init(); void release(); void refresh(); virtual void setXY(int X, int Y); typedef vector<Offset>::iterator OIter; }; #endif // _BALL_H_
Ball.cpp #include "Ball.h" #include "Desktop.h" #include "Quads.h" #include <math.h> void Ball::init(){ x = desktop.getWidth() / 2; y = desktop.getHeight()/ 2; offsets = new vector<Offset>(); float delta = - PI / (float)MAX_SEGMENTS; float angle = delta / 2.0f; float r = (float)desktop.toRSize(BALL_RADIUS); for (int i = 0; i < MAX_SEGMENTS * 2; i++) { offsets->push_back(Offset((int16)(cos(angle) * r), (int16)(sin(angle) * r))); angle = angle + delta; offsets->push_back(Offset((int16)(cos(angle) * r), (int16)(sin(angle) * r))); } body = world.addBall(x, y, (int)r, (IBox2DItem*)this); } void Ball::release() { delete offsets; } void Ball::setXY(int X, int Y) { x = X; y = Y; } void Ball::refresh() { OIter o = offsets->begin(); int r = desktop.toRSize(BALL_RADIUS); for (int i = 0; i < MAX_SEGMENTS * 2; i++) { quads.setVert(x + (r / 4), y + (r / 4), 0xff, 0xff, 0xff, 0xff); quads.setVert(x + o->dx, y + o->dy, 0x00, 0x00, 0x00, 0x00); o++; quads.setVert(x + o->dx, y + o->dy, 0x00, 0x00, 0x00, 0x00); o++; } }
Handle.h #ifndef _HANDLE_H_ #define _HANDLE_H_ #include "IwGX.h" #include "s3e.h" #include "Desktop.h" #include "World.h" #include "IBox2DItem.h" #define HANDLE_COLOR 0xffff3000 #define HANDLE_H_WIDTH 40 #define HANDLE_H_HEIGHT 10 class Handle: public IBox2DItem { private: int x; int y; int touchId; public: void init(); void refresh(); void update(); virtual void setXY(int X, int Y); }; #endif
Handle.cpp #include "Handle.h" #include "Quads.h" #include "TouchPad.h" void Handle::init() { x = desktop.getWidth() / 2; y = desktop.getHeight(); touchId = -1; } void Handle::setXY(int X, int Y) { x = X; y = Y; } void Handle::refresh() { int hw = desktop.toRSize(HANDLE_H_WIDTH); int hh = desktop.toRSize(HANDLE_H_HEIGHT); quads.setVert(x - hw, y - hh, 0x00, 0x30, 0xff, 0xff); quads.setVert(x - hw, y + hh, 0x00, 0x30, 0xff, 0xff); quads.setVert(x + hw, y - hh, 0x00, 0x30, 0xff, 0xff); quads.setVert(x + hw, y + hh, 0x00, 0x30, 0xff, 0xff); quads.setVert(x + hw, y - hh, 0x00, 0x30, 0xff, 0xff); quads.setVert(x - hw, y + hh, 0x00, 0x30, 0xff, 0xff); world.addHandle(x, y, desktop.toRSize(HANDLE_H_WIDTH), desktop.toRSize(HANDLE_H_HEIGHT), (IBox2DItem*)this); } void Handle::update() { Touch* t = NULL; if (touchId > 0) { t = touchPad.getTouchByID(touchId); } else { t = touchPad.getTouchPressed(); } if (t != NULL) { touchId = t->id; world.moveHandle(t->x, t->y); } else { touchId = -1; } }
рдмреЛрд░реНрдб рдореЗрдВ, рд╣рдо рдХреЗрд╡рд▓ рджреЛ рд╡реИрдХреНрдЯрд░ (рд╕реНрдХреЛрдк рдФрд░ рдкреНрд░рдХрд╛рд░) рдХреЛ рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрд┐рдд рдХрд░рддреЗ рд╣реИрдВ рдЬреЛ рдХрд┐ рд╡реИрдХреНрдЯрд░ рдХреЛ рдЗрдВрдЧрд┐рдд рдХрд░рддреЗ рд╣реИрдВред рдЕрдЧрд▓рд╛, рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдЪрд▓рд╛рдПрдБ рдФрд░ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░реЗрдВ рдХрд┐ рд╕рдм рдХреБрдЫ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ:
рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдореИрдВрдиреЗ рдИрдВрдЯреЛрдВ рд╕реЗ рдЧреНрд░реЗрдбрд┐рдПрдВрдЯ рдлрд┐рд▓ рдХреЛ рд╣рдЯрд╛ рджрд┐рдпрд╛ред рдИрдорд╛рдирджрд╛рд░реА рд╕реЗ, рдпрд╣ рд╕рд┐рд░реНрдл рдЗрд╕рдХреЗ рд╕рд╛рде рдЫреЗрдбрд╝рдЫрд╛рдбрд╝ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рдЖрд▓рд╕реА рдерд╛, рдпрд╣ рджреЗрдЦрддреЗ рд╣реБрдП рдХрд┐ рд╡реИрд╕реЗ рднреА, рдмрдирд╛рд╡рдЯ рд╕рднреА рд╡рд╕реНрддреБрдУрдВ рдкрд░ рдЦреАрдВрдЪреА рдЬрд╛рдПрдЧреА (рдЕрдиреНрдпрдерд╛, рдХрд┐рд╕реА рдХреЛ рднреА рдХрд┐рд╕реА рднреА рдкреНрд░рд╕реНрддреБрддрд┐ рдХрд╛ рд╕рдкрдирд╛ рдирд╣реАрдВ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП)ред