IOS рдХреЗ рд▓рд┐рдП Cocos2d рдврд╛рдВрдЪреЗ рдкрд░ рдПрдХ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдмрдирд╛рдирд╛

рдирдорд╕реНрдХрд╛рд░, рд╣рд░рд╛рдордЬрд┐рддреА!

рдореЗрд░рд╛ рдкрд╣рд▓рд╛ рдЧреЗрдо iPhone SDK рдиреЗ рдПрдХ рдкреЗрд╢рд╛рдм рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рд▓рдбрд╝рдХреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд▓рд┐рдЦрд╛ рдерд╛, рдпрд╣ 3G рдФрд░ 3GS рдкрд░ рдмрд╣реБрдд рдзреАрдорд╛ рдерд╛ред рджреВрд╕рд░рд╛ рдПрдХ рдкреНрд░реЛрд╕реЗрд╕рд░ рдкрд░ рдХрдо рд▓реЛрдб рдХреЗ рд╕рд╛рде рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рдЬрдмрдХрд┐ рдореИрдВрдиреЗ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА cocos2d рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реБрдирд╛ рдерд╛, рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рджрд╕реНрддрд╛рд╡реЗрдЬ рдкрдврд╝рдиреЗ рдХреЗ рдмрд╛рдж, рдореИрдВрдиреЗ рдПрд╕рдбреАрдХреЗ рдореЗрдВ рдЬрд╛рдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛, рдЕрдм рд╡рд╛рдкрд╕ рдирд╣реАрдВ рд▓реМрдЯрд╛ рдФрд░ рдЗрд╕ рдордВрдЪ рдХреЗ рд▓рд┐рдП рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рд╢реБрд░реВ рдХрд░ рджреАред рдЗрд╕ рд▓реЗрдЦ рдореЗрдВ рдореИрдВ cocos2d рдХреЛ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдиреЗ рдХрд╛ рддрд░реАрдХрд╛ рдирд╣реАрдВ рдмрддрд╛рдКрдВрдЧрд╛, рдпрд╣ рдпрд╣рд╛рдВ рд╡рд░реНрдгрд┐рдд рд╣реИ , рдореИрдВ рдЗрд╕ рдкреЛрд╕реНрдЯ рдХреЗ рд╕рд╛рде рдирд╣реАрдВ рджреЛрд╣рд░рд╛рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░реВрдВрдЧрд╛ред рдореИрдВ рдХреЗрд╡рд▓ рдПрдХ рд╕реНрдерд┐рд░ 1.0.1 рд╕рдВрд╕реНрдХрд░рдг рдЬреЛрдбрд╝ рд╕рдХрддрд╛ рд╣реВрдВред рдЗрд╕ рд▓реЗрдЦ рдореЗрдВ рдореИрдВ рдЖрдкрдХреЛ рдмрддрд╛рдКрдВрдЧрд╛ рдХрд┐ рдкрд░рддреЛрдВ рдХреЗ рдмреАрдЪ рдореЗрдиреВ, рдПрдиреАрдореЗрд╢рди рдФрд░ рд╕рдВрдХреНрд░рдордг рдХреИрд╕реЗ рдмрдирд╛рдПрдВред

рддреЛ рдмрд╛рдд рд╣реИред

рд╣рдо cocos2d рдкрд░ рдПрдХ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдмрдирд╛рддреЗ рд╣реИрдВ, рдЗрд╕реЗ iPad рдкрд░ рдУрд░рд┐рдПрдВрдЯ рдХрд░рддреЗ рд╣реИрдВ, HelloWorldLayer.m рдлрд╛рдЗрд▓ рдкрд░ рдЬрд╛рддреЗ рд╣реИрдВ рдФрд░ - (id) рдЗрдирд┐рдЯ рдореЗрдердб рдореЗрдВ рдмреИрдХрдЧреНрд░рд╛рдЙрдВрдб рдХреЗ рд▓рд┐рдП рд╕реНрдкреНрд░рд╛рдЗрдЯ рдмрдирд╛рддреЗ рд╣реИрдВ:

 -(id) init { if( (self=[super init])) { //    ,     CGSize size = [[CCDirector sharedDirector] winSize]; // backgroung CCSprite * background = [CCSprite spriteWithFile:@"clean bg.png"]; //     background.position = ccp(size.width/2, size.height/2); //    CCLayer        , //   z:-1 [self addChild:background z:-1]; } return self; } 

рдореИрдВ рдЬреЛрдбрд╝ рд╕рдХрддрд╛ рд╣реВрдВ рдХрд┐ рдЬрдм рд╣рдо рдкрд░рдд рдореЗрдВ рд╣рдорд╛рд░реЗ рд╕реНрдкреНрд░рд╛рдЗрдЯ рдХреЛ рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ, рддреЛ рдЖрдк рдПрдХ рдЯреИрдЧ рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВ: [self addChild:background z:-1 tag:100]; рдпрд╣ рдЗрд╕рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рддрд╛рдХрд┐ рдЖрдк рд╕реНрдкреНрд░рд╛рдЗрдЯ рдХреЛ рдХрд┐рд╕реА рдЕрдиреНрдп рд╡рд┐рдзрд┐ рдпрд╛ рд╡рд░реНрдЧ рдореЗрдВ рдЯреИрдЧ рдХрд░ рд╕рдХреЗрдВ, рдпрд╣ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ: CCSprite *spr = (CCSprite *)[self getChildByTag:100]; рдлрд┐рд░ рдЗрд╕ рд╕реНрдкреНрд░рд╛рдЗрдЯ рдХреЗ рд╕рд╛рде рдЬреЛ рдЖрдк рдЪрд╛рд╣рддреЗ рд╣реИрдВ рд╡рд╣ рдХрд░реЗрдВред

рдЕрдЧрд▓рд╛, рдпрд╣рд╛рдВ рд╣рдо рдореЗрдиреВ рдмрдирд╛рддреЗ рд╣реИрдВ:

 //   //   CCMenuItemImage * image = [CCMenuItemImage itemFromNormalImage:@"new_game.png" selectedImage:@"new_game.png" target:self selector:@selector(perehod_v_igru)]; //    (   , //     ) image.position = ccp(0, 50); //  font CCMenuItemFont * font = [CCMenuItemFont itemFromString:@"" target:self selector:@selector(options)]; font.position = ccp(0, -50); //  //     CCMenu * menu = [CCMenu menuWithItems:image, font, nil]; //   menu.position = ccp(size.width /2 , size.height/2); //   [self addChild:menu]; 


Cocos2d рдореЗрдиреВ iPhone SDK рдмрдЯрди рдХрд╛ рдПрдХ рд╡рд┐рдХрд▓реНрдк рд╣реИ, рдпрд╣рд╛рдВ рд╣рдордиреЗ 2 рдкреНрд░рдХрд╛рд░ рдХреА рдХреЛрд╢рд┐рдХрд╛рдУрдВ (рдЪрд┐рддреНрд░ рдФрд░ рд╢рд┐рд▓рд╛рд▓реЗрдЦ) рдХреЛ рджреЗрдЦрд╛, рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рд╡реЗ рдХреБрдЫ рддрд░реАрдХреЛрдВ рдХрд╛ рдЙрд▓реНрд▓реЗрдЦ рдХрд░рддреЗ рд╣реИрдВ, рд╣рдорд╛рд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ рдпреЗ рдЕрдиреНрдп рдкрд░рддреЛрдВ рдХреЗ рд▓рд┐рдП рд╕рдВрдХреНрд░рдордг рд╣реИрдВ:

 -(void)perehod_v_igru { //        [[CCDirector sharedDirector] replaceScene:[CCTransitionPageTurn transitionWithDuration:1 scene:[Game node]]]; } 


рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рд╕рдордп рдХреЗ рд▓рд┐рдП рд╕рдВрдХреНрд░рдордг рдПрдХ рдкрд░рдд рд╕реЗ рджреВрд╕рд░реА рдкрд░рдд рдореЗрдВ рд╕рдВрдХреНрд░рдордг рдХреЗ рдкреНрд░рднрд╛рд╡ рдХреЗ рд▓рд┐рдП рдЬрд┐рдореНрдореЗрджрд╛рд░ рд╣реИред

 -(void)options { //     [[CCDirector sharedDirector] pushScene:[Options node]]; } 


рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рдЕрд╕реНрдерд╛рдпреА рд░реВрдк рд╕реЗ рдкрд░рдд рдХреЛ рдУрд╡рд░рд▓реЗ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП pushScene рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

рд╣рдо рд╡рд┐рдХрд▓реНрдк рдлрд╛рдЗрд▓ рдмрдирд╛рддреЗ рд╣реИрдВ, + N рдХрдорд╛рдВрдб рджрдмрд╛рддреЗ рд╣реИрдВ:

рдЫрд╡рд┐

рдЫрд╡рд┐

рдЫрд╡рд┐

рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рдкрд┐рдЫрд▓реЗ рд╕реНрдХреНрд░реАрдирд╢реЙрдЯ рдореЗрдВ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рд╣рдо рдПрдХ рдХрд╕реНрдЯрдо рд▓реЗрдпрд░ рдмрдирд╛рддреЗ рд╣реИрдВ, рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ рдпрд╣ рдХрд╛рд▓рд╛ рд╣реИ, рд▓реЗрдХрд┐рди RGB рдореЗрдВ рдЦреЗрд▓рдиреЗ рдХреЗ рдмрд╛рдж рдЖрдк рдХреЛрдИ рднреА рд░рдВрдЧ рд╕реЗрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

рдЗрд╕рдХреЗ рдмрд╛рдж, CCMenu рдмрдирд╛рдПрдБ рдФрд░ рд╡рд┐рдзрд┐ рдореБрдЦреНрдп рдореЗрдиреВ рдореЗрдВ obatno рд▓реМрдЯрд╛рддреА рд╣реИ:

 -(id) init { // RGB     if ((self = [super initWithColor:ccc4(255, 0, 0, 155)])) { CGSize size = [[CCDirector sharedDirector] winSize]; CCMenuItemFont * font = [CCMenuItemFont itemFromString:@" " target:self selector:@selector(backItem)]; font.position = ccp(0, 0); CCMenu * menu = [CCMenu menuWithItems: font, nil]; menu.position = ccp(size.width /2 , size.height/2); [self addChild:menu]; } return self; } -(void)backItem{ //     [[CCDirector sharedDirector] popScene]; } 


popScene рд╡рд░реНрддрдорд╛рди рдкрд░рдд рдХреЛ рд╣рдЯрд╛ рджреЗрддрд╛ рд╣реИред рдЗрд╕ рдкрд░рдд рдХреЗ рдиреАрдЪреЗ рд╕рд╛рд╡рдзрд╛рди рд░рд╣реЗрдВ рдХреЛрдИ рдЕрдиреНрдп рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рдЬреИрд╕рд╛ рдХрд┐ рдКрдкрд░ рд╡рд░реНрдгрд┐рдд рд╣реИ, рд╣рдо рд╕рд┐рд░реНрдл рдПрдХ рдкрд░рдд рд▓рд╛рдЧреВ рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рдЕрдиреНрдпрдерд╛ рдпрд╣ рдПрдХ рддреНрд░реБрдЯрд┐ рдкреИрджрд╛ рдХрд░реЗрдЧрд╛ред

рдЕрдЧрд▓рд╛, рдПрдХ рдЧреЗрдо рд▓реЗрдпрд░ рдмрдирд╛рдПрдВ:

рдЫрд╡рд┐

рдЫрд╡рд┐

рдЫрд╡рд┐

рдПрдХ рдкреГрд╖реНрдарднреВрдорд┐ рдмрдирд╛рдПрдБ рдФрд░ Game.m рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдПрдХ рдФрд░ рд╕реНрдкреНрд░рд╛рдЗрдЯ рдмрдирд╛рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдПрдХ рджреЗрд░реА рд╕реЗрдЯ рдХрд░реЗрдВ:

 -(id) init { if( (self=[super init])) { CGSize size = [[CCDirector sharedDirector] winSize]; // background CCSprite * background = [CCSprite spriteWithFile:@"clean bg.png"]; //anchorPoint        ,   //background.anchorPoint = ccp(0.5f,0.5f);       //     anchorPoint = ccp(1, 1);      //  ,  (0, 0)    background.anchorPoint = ccp(1, 1); background.position = ccp(size.width, size.height); [self addChild:background z:-1]; //     0,5  [self performSelector:@selector(sozdanie_CCSprite) withObject:self afterDelay:0.5]; } return self; } 


рдпрд╣рд╛рдБ рдореИрдВрдиреЗ рдПрдВрдХрд░рд╡рд░реНрдХ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рд╣реИ, рдлрд┐рд░ рд╣рдо рдЗрд╕рдХрд╛ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдЖрд╡реЗрджрди рджреЗрдЦреЗрдВрдЧреЗ:

 -(void)sozdanie_CCSprite { //      background CCSprite * tarakan = [CCSprite spriteWithFile:@"tarakan0.png"]; tarakan.position = ccp(512, 100); tarakan.anchorPoint = ccp(0,0); [self addChild:tarakan]; //Actions //           id move = [CCMoveBy actionWithDuration:2 position:ccp(0, 500)]; //     id accel = [CCEaseInOut actionWithAction:move rate:5]; //  id rotate = [CCRotateBy actionWithDuration:2.0f angle:360]; //  [tarakan runAction:[CCSequence actions:accel, rotate, nil]]; //  [self performSelector:@selector(animation) withObject:self afterDelay:3.5]; } 


рдпрд╣рд╛рдБ рд╣рдо рдПрдХ рддрд┐рд▓рдЪрдЯреНрдЯрд╛ рдкрд░ рд╡рд┐рднрд┐рдиреНрди рдХреНрд░рд┐рдпрд╛рдУрдВ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддреЗ рд╣реИрдВред рдЬрдм рд╣рдо рд╕рдВрдХрд▓рд┐рдд рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рджреЗрдЦрддреЗ рд╣реИрдВ рдХрд┐ рдХреЙрдХрд░реЛрдЪ рддреНрд╡рд░рдг рдХреЗ рд╕рд╛рде рдЪрд▓рддрд╛ рд╣реИ, рдФрд░ рдлрд┐рд░ рдШреВрдорддрд╛ рд╣реИ, рдЬрдмрдХрд┐ рдзреБрд░реА рдмрд┐рдВрджреБ рдирд┐рдЪрд▓реЗ рдмрд╛рдПрдВ рдХреЛрдиреЗ рдореЗрдВ рд╣реИ, рдпрд╣ рдПрдВрдХрд░рдкреЙрдЗрдВрдЯ рд╣реИ рдЬрд┐рд╕реЗ рд╣рдордиреЗ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд┐рдпрд╛ рд╣реИ (0, 0)ред рд╣рдордиреЗ рдХреЙрдХрд░реЛрдЪ рдХреЗ рдЖрдВрджреЛрд▓рди рдХрд╛ рд╕рдВрдХреЗрдд рджрд┐рдпрд╛, CCMoveBy рдЖрдВрджреЛрд▓рди рдХреЗ рд▓рд┐рдП рдЬрд┐рдореНрдореЗрджрд╛рд░ рд╣реИ, CCEaseInOut рдЖрдВрджреЛрд▓рди рдХреЗ рджреМрд░рд╛рди рддреНрд╡рд░рдг рдФрд░ рдордВрджреА рдХреА рдЪрд┐рдХрдирд╛рдИ рдХреЗ рд▓рд┐рдП рдЬрд┐рдореНрдореЗрджрд╛рд░ рд╣реИ, рдФрд░ CCRotateBy рд░реЛрдЯреЗрд╢рди рдХреЗ рд▓рд┐рдП рдЬрд┐рдореНрдореЗрджрд╛рд░ рд╣реИред рд╣рдо рдпрд╣рд╛рдВ CCSequence рдХрд╛ рдЙрдкрдпреЛрдЧ рднреА рджреЗрдЦрддреЗ рд╣реИрдВ, рдЗрд╕ рдХрдорд╛рдВрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдмрджрд▓реЗ рдореЗрдВ рд╕реНрдкреНрд░рд╛рдЗрдЯ рдкрд░ рдХрд╛рд░реНрд░рд╡рд╛рдИ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

рдФрд░ рдЖрдЦрд┐рд░реА, рджреЗрд░реА рдХреЗ рдмрд╛рдж рдПрдХ рдПрдиреАрдореЗрд╢рди рдмрдирд╛рдПрдВ:

 -(void)animation { CGSize size = [[CCDirector sharedDirector] winSize]; // plist       [[CCSpriteFrameCache sharedSpriteFrameCache] addSpriteFramesWithFile:@"tarakan.plist" textureFile:@"tarakan.png"]; //CCSpriteBatchNode     cocos2d,       //    //       CCSpriteBatchNode * bowSheet = [CCSpriteBatchNode batchNodeWithFile:@"tarakan.png"]; NSString *topbird = @"tarakan"; NSMutableArray *walkAnimFrames = [NSMutableArray array]; //    for(int i = 1; i <= 4; ++i) { CCSpriteFrame *frame = [[CCSpriteFrameCache sharedSpriteFrameCache] spriteFrameByName: topbird stringByAppendingString:[ NSString stringWithFormat:@"%d.png", i]]]; [walkAnimFrames addObject:frame]; } //          CCAnimation *walkAnim = [CCAnimation animationWithFrames:walkAnimFrames delay:0.1f]; NSString *bowFrame = [topbird stringByAppendingString:@"1.png"]; //     CCSprite * bow = [CCSprite spriteWithSpriteFrameName:bowFrame]; bow.position = ccp(size.width/2 , -100); [bowSheet addChild:bow]; //CCAnimate    CCAnimation //        CCAnimate CCAnimate * bowAnim = [[CCAnimate actionWithAnimation:walkAnim restoreOriginalFrame:YES] retain]; [self addChild:bowSheet]; //   id walkAction = [CCRepeat actionWithAction:bowAnim times:5]; //  id da = [CCMoveBy actionWithDuration:2 position:ccp(0, 600)]; //     [bow runAction:[CCSpawn actions:da, walkAction, nil]]; } 


рдореИрдВрдиреЗ рдЗрд╕рдореЗрдВ рд╕реЗ рдЕрдзрд┐рдХрд╛рдВрд╢ рдкрд░ рдЯрд┐рдкреНрдкрдгреА рдХреА, рдореИрдВ рдЬреЛрдбрд╝реВрдВрдЧрд╛ рдХрд┐ рдореИрдВрдиреЗ zwoptexapp.com рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдмрдирд╛рд╡рдЯ рдмрдирд╛рдИ рд╣реИ, рдпрд╣ рдореБрдлрд╝реНрдд рд╣реИ, рд╡рд╣рд╛рдВ рдореБрдЭреЗ рдкреНрд▓рд┐рд╕реНрдЯ рдФрд░ рдкреАрдПрдирдЬреА рдлрд╛рдЗрд▓реЗрдВ рдорд┐рд▓реАрдВ, рдЙрдиреНрд╣реЗрдВ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдореЗрдВ рдЦреАрдВрдЪ рд▓рд┐рдпрд╛ред рдпрд╣ рд╡рд╣реА рд╣реИ рдЬреЛ tarakan.plist рдлрд╝рд╛рдЗрд▓ рдХреА рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИ:

рдЫрд╡рд┐

рдФрд░ рдЗрд╕рд▓рд┐рдП tarakan.png рдлрд╝рд╛рдЗрд▓:

рдЫрд╡рд┐

рдпрд╣ рднреА рджреЗрдЦрд╛ рдЬрд╛рддрд╛ рд╣реИ рдХрд┐ CCSequence рдХреЗ рдмрдЬрд╛рдп рдХрд╛рд░реНрд░рд╡рд╛рдИ рд▓рд╛рдЧреВ рдХрд░рддреЗ рд╕рдордп, CCSpawn рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рдпрд╣ рдЖрджреЗрд╢ рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдХрд┐ рд╕реНрдкреНрд░рд╛рдЗрдЯ рдкрд░ рдХрд╛рд░реНрд░рд╡рд╛рдИ рдПрдХ рд╕рд╛рде рдЪрд▓рддреА рд╣реИред

рдЕрдХреНрд╕рд░ рдореИрдВ cocos2d рдкрд░ рдПрдирд┐рдореЗрд╢рди рдмрдирд╛рдиреЗ рдХреЗ рд╕рд╛рде рдордВрдЪреЛрдВ рдХреА рд╕рдорд╕реНрдпрд╛рдУрдВ рдХреЛ рджреЗрдЦрддрд╛ рд╣реВрдВ, рдЗрд╕рд▓рд┐рдП рдореИрдВрдиреЗ рдЗрд╕реЗ рдЗрд╕ рд▓реЗрдЦ рдореЗрдВ рд╢рд╛рдорд┐рд▓ рдХрд┐рдпрд╛ред рдореБрдЭреЗ рдЙрдореНрдореАрдж рд╣реИ рдХрд┐ рдпрд╣ рд▓реЗрдЦ рдХрд┐рд╕реА рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧреА рд╣реЛрдЧрд╛ред

рдпрд╣рд╛рдВ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдбрд╛рдЙрдирд▓реЛрдб рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ ред

Source: https://habr.com/ru/post/In126422/


All Articles