рд╕реБрдкрд░ рдорд╛рд░рд┐рдпреЛ рдмреНрд░рджрд░реНрд╕ рдХреНрд▓реЛрди рдЧреЗрдо рд▓рд┐рдЦрдирд╛ (рднрд╛рдЧ 2)

рдЫрд╡рд┐ рдХреИрд╕реЗ рд╕реБрдкрд░ рдорд╛рд░рд┐рдпреЛ рдмреНрд░рджрд░реНрд╕ рдХреА рддрд░рд╣ рдЕрдкрдиреЗ рдЦреБрдж рдХреЗ platformer рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдЯреНрдпреВрдЯреЛрд░рд┐рдпрд▓ рдХреА рдПрдХ рд╢реНрд░реГрдВрдЦрд▓рд╛ рдХреЗ рджреВрд╕рд░реЗ рднрд╛рдЧ рдореЗрдВ рдЖрдкрдХрд╛ рд╕реНрд╡рд╛рдЧрдд рд╣реИ!
рдкрд╣рд▓реЗ рднрд╛рдЧ рдореЗрдВ, рд╣рдордиреЗ рдЯрд╛рдЗрд▓ рдореИрдк рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдПрдХ рд╕рд░рд▓ рднреМрддрд┐рдХреА рдЗрдВрдЬрди рд▓рд┐рдЦрд╛ рдерд╛ред
рджреВрд╕рд░реЗ (рдФрд░ рдЕрдВрддрд┐рдо) рднрд╛рдЧ рдореЗрдВ, рд╣рдо рдХреЛрд▓рд┐рдпреЛ рдХреЛ рд╣рд┐рд▓рдирд╛ рдФрд░ рдХреВрджрдирд╛ рд╕рд┐рдЦрд╛рдПрдВрдЧреЗ - рдХрд┐рд╕реА рднреА рдкреНрд▓реЗрдЯрдлрд╝реЙрд░реНрдорд░ рдХрд╛ рд╕рдмрд╕реЗ рдордЬрд╝реЗрджрд╛рд░ рд╣рд┐рд╕реНрд╕рд╛!

рд╣рдо рдПрдХ рд╕реНрддрд░ рдкрд░ рдЦрддрд░реЛрдВ рд╕реЗ рдЯрдХрд░рд╛рд╡ рдХреЛ рдЯреНрд░реИрдХ рдХрд░рдирд╛ рд╕реАрдЦреЗрдВрдЧреЗ, рдЬреАрдд рдФрд░ рд╣рд╛рд░ рдХреЛ рд╕рдВрднрд╛рд▓реЗрдВрдЧреЗ; рдорд╣рд╛рди рдзреНрд╡рдирд┐ рдкреНрд░рднрд╛рд╡ рдФрд░ рд╕рдВрдЧреАрдд рдЬреЛрдбрд╝реЗрдВ!

рджреВрд╕рд░рд╛ рднрд╛рдЧ рдкрд╣рд▓реЗ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдмрд╣реБрдд рдЖрд╕рд╛рди (рдФрд░ рдЫреЛрдЯрд╛) рд╣реИ - рдкрд┐рдЫрд▓реА рдмрд╛рд░ рдХрдбрд╝реА рдореЗрд╣рдирдд рдХреЗ рдмрд╛рдж рдПрдХ рдЫреЛрдЯрд╛ рдЖрд░рд╛рдо! рддреЛ рдЕрдкрдиреЗ рдХреЛрджреЛ рдХреБрдВрдЧ рдлреВ рдХреЛ рдЪрд╛рд▓реВ рдХрд░реЗрдВ рдФрд░ рдЖрдирдВрдж рд▓реЗрдВ!

рдХреЛрд▓рд┐рдпреЛ рд▓реЗ рдЬрд╛рдПрдБ


рд╣рдорд╛рд░реЗ рдЖрдВрджреЛрд▓рди рдмрд╣реБрдд рд╕рд░рд▓ рд╣реЛрдВрдЧреЗ: рдмрд╕ рдЖрдЧреЗ рдмрдврд╝рдирд╛ рдФрд░ рдХреВрджрдирд╛ - рдЬреИрд╕реЗ 1-рдмрд┐рдЯ рдирд┐рдВрдЬрд╛ рдореЗрдВред рдпрджрд┐ рдЦрд┐рд▓рд╛рдбрд╝реА рд╕реНрдХреНрд░реАрди рдХреЗ рдмрд╛рдИрдВ рдУрд░ рдЫреВрддрд╛ рд╣реИ, рддреЛ рдХреЛрд▓рд┐рдпреЛ рдЖрдЧреЗ рдмрдврд╝рддрд╛ рд╣реИред рдпрджрд┐ рдЦрд┐рд▓рд╛рдбрд╝реА рд╕реНрдХреНрд░реАрди рдХреЗ рджрд╛рдИрдВ рдУрд░ рд╕реНрдкрд░реНрд╢ рдХрд░рддрд╛ рд╣реИ, рддреЛ рдХреЛрд▓рд┐рдпреЛ рдХреВрджрддрд╛ рд╣реИред
рдЖрдкрдиреЗ рдЗрд╕реЗ рд╕рд╣реА рдкрд╛рдпрд╛: рдХреЛрд▓рд┐рдпреЛ рд╡рд╛рдкрд╕ рдирд╣реАрдВ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ! рдЕрд╕рд▓реА рдХреЛрдЖрд▓рд╛ рдЦрддрд░реЗ рд╕реЗ рдкреАрдЫреЗ рдирд╣реАрдВ рд╣рдЯрддреЗ!
рдЬреИрд╕реЗ рд╣реА рдХреЛрд▓рд┐рдпреЛ рдЖрдЧреЗ рдмрдврд╝рддрд╛ рд╣реИ, рд╣рдореЗрдВ рдПрдХ рд╡реИрд░рд┐рдПрдмрд▓ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ рдЬрд┐рд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреЛрдЖрд▓рд╛ рдХреА рд╕реНрдерд┐рддрд┐ рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд▓реЗрдпрд░ рдХреНрд▓рд╛рд╕ рдореЗрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдирд┐рдореНрди рдХреЛ рдкреНрд▓реЗрдпрд░ рд╡рд░реНрдЧ рдореЗрдВ рдЬреЛрдбрд╝реЗрдВ:

Player.h рдореЗрдВ :

@property (nonatomic, assign) BOOL forwardMarch; @property (nonatomic, assign) BOOL mightAsWellJump; 

рдФрд░ Player.m рдореЗрдВ рд╕рдм рдХреБрдЫ рд╕рдВрд╢реНрд▓реЗрд╖рд┐рдд рдХрд░реЗрдВ:

 @synthesize forwardMarch = _forwardMarch, mightAsWellJump = _mightAsWellJump; 

рдЕрдм GameLevelLayer рдореЗрдВ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдЯрдЪ рд╣реИрдВрдбрд▓рд┐рдВрдЧ рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЛ рдЬреЛрдбрд╝реЗрдВ :

рдореБрдЭреЗ рдХреНрд▓рд┐рдХ рдХрд░реЗрдВ
 - (void)ccTouchesBegan:(NSSet *)touches withEvent:(UIEvent *)event { for (UITouch *t in touches) { CGPoint touchLocation = [self convertTouchToNodeSpace:t]; if (touchLocation.x > 240) { player.mightAsWellJump = YES; } else { player.forwardMarch = YES; } } } - (void)ccTouchesMoved:(NSSet *)touches withEvent:(UIEvent *)event { for (UITouch *t in touches) { CGPoint touchLocation = [self convertTouchToNodeSpace:t]; //   CGPoint previousTouchLocation = [t previousLocationInView:[t view]]; CGSize screenSize = [[CCDirector sharedDirector] winSize]; previousTouchLocation = ccp(previousTouchLocation.x, screenSize.height - previousTouchLocation.y); if (touchLocation.x > 240 && previousTouchLocation.x <= 240) { player.forwardMarch = NO; player.mightAsWellJump = YES; } else if (previousTouchLocation.x > 240 && touchLocation.x <=240) { player.forwardMarch = YES; player.mightAsWellJump = NO; } } } - (void)ccTouchesEnded:(NSSet *)touches withEvent:(UIEvent *)event { for (UITouch *t in touches) { CGPoint touchLocation = [self convertTouchToNodeSpace:t]; if (touchLocation.x < 240) { player.forwardMarch = NO; } else { player.mightAsWellJump = NO; } } } 

рдКрдкрд░ рджрд┐рдП рдЧрдП рдХреЛрдб рдХреЛ рд╕рдордЭрдирд╛ рдмрд╣реБрдд рдЖрд╕рд╛рди рд╣реИред рдпрджрд┐ рд╕реНрдХреНрд░реАрди рдЯрдЪ рдХрд╛ рдПрдХреНрд╕-рд╕рдордиреНрд╡рдп 240 (рдЖрдзреА рд╕реНрдХреНрд░реАрди) рд╕реЗ рдХрдо рд╣реИ, рддреЛ рд╣рдо рдЖрдЧреЗ рдХреЗ рдЪрд░ рдХреЛ YES рдкрд░ рд╕реЗрдЯ рдХрд░рддреЗ рд╣реИрдВред рдЕрдиреНрдпрдерд╛ (рдпрджрд┐ X рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ 240 рд╕реЗ рдЕрдзрд┐рдХ рд╣реИ) рддреЛ рд╣рдо рдЪрд░ рдореЗрдпрд░реЛрдВ рдХреЛ рдорд╛рди рдкреНрд░рджрд╛рди рдХрд░рддреЗ рд╣реИрдВред
рдЫреВрдирд╛ рдереЛрдбрд╝рд╛ рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рддрд░реАрдХрд╛ рд╣реИред рд╣рдореЗрдВ рдЪрд░ рдХреЗ рдореВрд▓реНрдп рдХреЛ рдХреЗрд╡рд▓ рддрднреА рдмрджрд▓рдирд╛ рд╣реЛрдЧрд╛ рдЬрдм рд╕реНрдкрд░реНрд╢ рд╕реНрдХреНрд░реАрди рдХреЗ рдордзреНрдп рдХреЛ рдкрд╛рд░ рдХрд░ рдЬрд╛рдПред рдЗрд╕рд▓рд┐рдП рд╣рдореЗрдВ рдкрд┐рдЫрд▓реЗ рдЯрдЪ рдХреЛ рднреА рдзреНрдпрд╛рди рдореЗрдВ рд░рдЦрдирд╛ рдЪрд╛рд╣рд┐рдП - рдкрд┐рдЫрд▓рд╛ рдЯрдЪ рдЪрд░ред рджреВрд╕рд░реЗ рд╢рдмреНрджреЛрдВ рдореЗрдВ, рд╣рдо рдмрд╕ рдЬрд╛рдБрдЪ рдХрд░рддреЗ рд╣реИрдВ рдХрд┐ рдХрд┐рд╕ рддрд░рдл рд╕реЗ рдЪреМрд░рд╛рд╣рд╛ рд╣реБрдЖ рдФрд░ рдХреНрд░рдорд╢рдГ рдмреВрд▓рд┐рдпрди рдЪрд░ рдХреЗ рдореВрд▓реНрдпреЛрдВ рдХреЛ рдмрджрд▓рддреЗ рд╣реИрдВред
рд╣рдо рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдХрд┐ рдЬрдм рдХреЛрдИ рдЦрд┐рд▓рд╛рдбрд╝реА рд╕реНрдХреНрд░реАрди рдХреЗ рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рдХреНрд╖реЗрддреНрд░ рдХреЛ рдЫреВрдирд╛ рдмрдВрдж рдХрд░ рджреЗ, рддреЛ рдХреЗрд╡рд▓ рдЖрд╡рд╢реНрдпрдХ рдмреВрд▓рд┐рдпрди рдЪрд░ рдмрдВрдж рд╣реЛ рдЬрд╛рддреЗ рд╣реИрдВред
рд╣рд╛рд▓рд╛рдВрдХрд┐, рдпрд╣ рд╕реНрдкрд░реНрд╢ рдХреЗ рдЙрдЪрд┐рдд рд╕рдВрдЪрд╛рд▓рди рдХреЗ рд▓рд┐рдП рдХреБрдЫ рдФрд░ рдЪреАрдЬреЛрдВ рдХреЛ рдмрджрд▓рдиреЗ рдХреЗ рд▓рд╛рдпрдХ рд╣реИред Init рд╡рд┐рдзрд┐ рдореЗрдВ рдирд┐рдореНрди рдкрдВрдХреНрддрд┐ рдЬреЛрдбрд╝реЗрдВ:

  self.isTouchEnabled = YES; 

рд╣рдореЗрдВ AppDelegate.m рдореЗрдВ рдорд▓реНрдЯреАрдЯрдЪ рд╕рдХреНрд╖рдо рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ (рдЕрдЪрд╛рдирдХ рд╣рдорд╛рд░рд╛ рдЦрд┐рд▓рд╛рдбрд╝реА рдЙрд╕реА рд╕рдордп рдХреВрджрдирд╛ рдФрд░ рдЖрдЧреЗ рдмрдврд╝рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реИ)ред рд▓рд╛рдЗрди рд╕реЗ рдкрд╣рд▓реЗ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдЬреЛрдбрд╝реЗрдВ [рд╕рдВрдЪрд╛рд▓рдХ_ рдкреБрд╢рд╕реЗрдХреЗрди: [рдЧреЗрдорд▓реЗрд╡рд▓рд░ рджреГрд╢реНрдп]]; :

  [glView setMultipleTouchEnabled:YES]; 

рдЕрдм рдЬрдм рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдкреНрд▓реЗрдпрд░ рдХреНрд▓рд╛рд╕ рдХреЗ рдСрдмреНрдЬреЗрдХреНрдЯ рдореЗрдВ рд╡реИрд░рд┐рдПрдмрд▓ рдХрд╛ рдореВрд▓реНрдп рд╣реИ, рддреЛ рд╣рдо рдЕрдкрдбреЗрдЯ рдкрджреНрдзрддрд┐ рдореЗрдВ рдХреБрдЫ рдХреЛрдб рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВ рддрд╛рдХрд┐ рдХреЛрд▓рд┐рдпреЛ рд╣рд┐рд▓ рд╕рдХреЗрдВред рдЪрд▓рд┐рдП рдЖрдЧреЗ рдмрдврд╝рддреЗ рд╣реИрдВред Player.m рдореЗрдВ рдЕрджреНрдпрддрди рд╡рд┐рдзрд┐ рдХреЛ рдирд┐рдореНрди рдореЗрдВ рдмрджрд▓реЗрдВ:

рдореБрдЭреЗ рдХреНрд▓рд┐рдХ рдХрд░реЗрдВ
 -(void)update:(ccTime)dt { CGPoint gravity = ccp(0.0, -450.0); CGPoint gravityStep = ccpMult(gravity, dt); CGPoint forwardMove = ccp(800.0, 0.0); CGPoint forwardStep = ccpMult(forwardMove, dt); //1 self.velocity = ccpAdd(self.velocity, gravityStep); self.velocity = ccp(self.velocity.x * 0.90, self.velocity.y); //2 if (self.forwardMarch) { self.velocity = ccpAdd(self.velocity, forwardStep); } //3 CGPoint minMovement = ccp(0.0, -450.0); CGPoint maxMovement = ccp(120.0, 250.0); self.velocity = ccpClamp(self.velocity, minMovement, maxMovement); //4 CGPoint stepVelocity = ccpMult(self.velocity, dt); self.desiredPosition = ccpAdd(self.position, stepVelocity); } 

рдЪрд▓рд┐рдП рдЗрд╕ рдХреЛрдб рдХреЛ рдЪрд░рдг рджрд░ рдЪрд░рдг рд▓реЗрддреЗ рд╣реИрдВ:

  1. рд╣рдо рдлрд╝реЙрд░рд╡рд░реНрдбрдореЛрд╡ рдкрд╛рд╡рд░ рдХреЛ рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ, рдЬреЛ рддрдм рд▓рд╛рдЧреВ рд╣реЛрддрд╛ рд╣реИ рдЬрдм рдЦрд┐рд▓рд╛рдбрд╝реА рд╕реНрдХреНрд░реАрди рдХреЛ рдЫреВрддрд╛ рд╣реИред рдореБрдЭреЗ рдпрд╛рдж рджрд┐рд▓рд╛рдПрдВ рдХрд┐ рд╣рдо рдирд┐рд░рдВрддрд░ рдЧрддрд┐ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрд╕ рджрд░ (800 рдЕрдВрдХ рдкреНрд░рддрд┐ рд╕реЗрдХрдВрдб) рдХреЛ рдлреНрд░реЗрдо рджрд░ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдмрджрд▓рддреЗ рд╣реИрдВред
  2. рдпрд╣рд╛рдВ рд╣рдо рдШрд░реНрд╖рдг рдЬреЛрдбрд╝рддреЗ рд╣реИрдВред рд╣рдо рднреМрддрд┐рдХреА рдХрд╛ рдЙрдкрдпреЛрдЧ рд╡реИрд╕реЗ рд╣реА рдХрд░рддреЗ рд╣реИрдВ рдЬреИрд╕реЗ рд╣рдордиреЗ рдЧреБрд░реБрддреНрд╡рд╛рдХрд░реНрд╖рдг рдХреЗ рд╕рд╛рде рдХрд┐рдпрд╛ рдерд╛ред рд╣рд░ рдлреНрд░реЗрдо рдореЗрдВ рдлреЛрд░реНрд╕реЗрд╕ рд▓рдЧрд╛рдИ рдЬрд╛рдПрдВрдЧреАред рдЬрдм рд╕рддреНрддрд╛ рдЪрд▓рддреА рд╣реИ, рд╣рдо рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдХрд┐ рдЦрд┐рд▓рд╛рдбрд╝реА рд░реБрдХ рдЬрд╛рдПред рд╣рдо 0.90 рдХреЗ рдмрд▓ рдХреЗ рд╕рд╛рде рдШрд░реНрд╖рдг рд▓рд╛рдЧреВ рдХрд░рддреЗ рд╣реИрдВред рджреВрд╕рд░реЗ рд╢рдмреНрджреЛрдВ рдореЗрдВ, рд╣рдо рдкреНрд░рддреНрдпреЗрдХ рдлреНрд░реЗрдо рдореЗрдВ 10% рдХреА рдЧрддрд┐ рдХреЛ рдХрдо рдХрд░рддреЗ рд╣реИрдВред
  3. рддреАрд╕рд░реЗ рдЦрдВрдб рдореЗрдВ, рд╣рдо рдЬрд╛рдВрдЪрддреЗ рд╣реИрдВ рдХрд┐ рдЦрд┐рд▓рд╛рдбрд╝реА рд╕реНрдХреНрд░реАрди рдХреЛ рдЫреВ рд░рд╣рд╛ рд╣реИ рдпрд╛ рдирд╣реАрдВ, рдпрджрд┐ рдЖрд╡рд╢реНрдпрдХ рд╣реЛ, рддреЛ рдлрд╝реЙрд░рд╡рд░реНрдбрд╕реНрдЯреЗрдк рдХрд╛ рдмрд▓ред
  4. рдЦрдВрдб рдЪрд╛рд░ рдореЗрдВ, рд╣рдордиреЗ рд╕реАрдорд╛рдПрдБ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХреА рд╣реИрдВред рдЕрдзрд┐рдХрддрдо рдЦрд┐рд▓рд╛рдбрд╝реА рдХреА рдЧрддрд┐ рдХреЛ рд╕реАрдорд┐рдд рдХрд░реЗрдВред рджреЛрдиреЛрдВ рдХреНрд╖реИрддрд┐рдЬ (рджреМрдбрд╝рдиреЗ рдХреА рдЧрддрд┐) рдФрд░ рдКрд░реНрдзреНрд╡рд╛рдзрд░ (рдХреВрдж рдЧрддрд┐, рдЧреБрд░реБрддреНрд╡рд╛рдХрд░реНрд╖рдг рдЧрддрд┐)ред
    рдШрд░реНрд╖рдг рдмрд▓ рдФрд░ рд╕реАрдорд╛рдПрдВ рд╣рдореЗрдВ рдЦреЗрд▓ рдореЗрдВ рдкреНрд░рдХреНрд░рд┐рдпрд╛рдУрдВ рдХреА рдЧрддрд┐ рдХреЛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреА рд╣реИрдВред рдЗрди рд╕реАрдорд╛рдУрдВ рдХрд╛ рд╣реЛрдирд╛ рд╕рдорд╕реНрдпрд╛ рдХреЛ рдкрд╣рд▓реЗ рдЯреНрдпреВрдЯреЛрд░рд┐рдпрд▓ рд╕реЗ рдмрд╣реБрдд рддреЗрдЬрд╝ рдЧрддрд┐ рд╕реЗ рд░реЛрдХрддрд╛ рд╣реИред
    рд╣рдо рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдХрд┐ рдЦрд┐рд▓рд╛рдбрд╝реА рдПрдХ рдпрд╛ рдЕрдзрд┐рдХ рд╕реЗрдХрдВрдб рдореЗрдВ рдЕрдзрд┐рдХрддрдо рдЧрддрд┐ рддрдХ рдкрд╣реБрдВрдЪ рдЬрд╛рдПред рдЗрд╕ рдкреНрд░рдХрд╛рд░, рдХреЛрдЕрд▓рд╛ рдХреЗ рдЖрдВрджреЛрд▓рди рдЕрднреА рднреА рд╕реНрд╡рд╛рднрд╛рд╡рд┐рдХ рджрд┐рдЦреЗрдВрдЧреЗ рдФрд░, рдПрдХ рд╣реА рд╕рдордп рдореЗрдВ, рдирд┐рдпрдВрддреНрд░рдг рдореЗрдВ рджреЗ рджреЗрдВрдЧреЗред рд╣рдордиреЗ рдЕрдзрд┐рдХрддрдо рдЧрддрд┐ рдХреЗ рд▓рд┐рдП 120 (рд╕реНрдХреНрд░реАрди рдкреНрд░рддрд┐ рд╕реЗрдХрдВрдб рдХреА рдЪреМрдбрд╝рд╛рдИ рдХрд╛ рдПрдХ рдЪреМрдерд╛рдИ) рдХреА рд╕реАрдорд╛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХреА рд╣реИред
    рдпрджрд┐ рд╣рдо рдЕрдкрдиреЗ рдЦрд┐рд▓рд╛рдбрд╝реА рдХреЗ рддреНрд╡рд░рдг рдкрдЯреНрдЯреА рдХреЛ рдмрдврд╝рд╛рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рд╣рдореЗрдВ рдХреНрд░рдорд╢рдГ рджреЛрдиреЛрдВ рдореВрд▓реНрдпреЛрдВ рдХреЛ рдмрдврд╝рд╛рдирд╛ рд╣реЛрдЧрд╛: рдлреЙрд░рд╡рд░реНрдбрдо рдФрд░ рдШрд░реНрд╖рдг рдмрд▓ (0.90)ред рдЕрдЧрд░ рд╣рдо рдЦрд┐рд▓рд╛рдбрд╝реА рдХреА рдЕрдзрд┐рдХрддрдо рдЧрддрд┐ рдХреЛ рдмрдврд╝рд╛рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рд╣рдореЗрдВ рд╕рд┐рд░реНрдл 120 рдХреЗ рдореВрд▓реНрдп рдореЗрдВ рд╡реГрджреНрдзрд┐ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рд╣рдо рдХреВрджрдиреЗ рдХреА рдЧрддрд┐ рдХреЛ рднреА 250 рдФрд░ рдЧрд┐рд░рд╛рд╡рдЯ рдХреА рдЧрддрд┐ рдХреЛ 450 рддрдХ рд╕реАрдорд┐рдд рдХрд░рддреЗ рд╣реИрдВред

рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдЪрд▓рд╛рдПрдВред рдпрджрд┐ рдЖрдк рд╕реНрдХреНрд░реАрди рдХреЗ рдмрд╛рдИрдВ рдУрд░ рдХреНрд▓рд┐рдХ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдХреЛрд▓рд┐рдпреЛ рд╣рд┐рд▓рдирд╛ рд╢реБрд░реВ рдХрд░ рджреЗрдирд╛ рдЪрд╛рд╣рд┐рдПред рд╣рдорд╛рд░реА рдХреЛрдЖрд▓рд╛ рдЪрд╛рд▓ рддреЗрдЬ рджреЗрдЦреЛ!

рдЫрд╡рд┐

рдЖрдЧреЗ рд╣рдо рдХреЛрдЖрд▓рд╛ рдХреВрджреЗрдВрдЧреЗ!

рд╣рдорд╛рд░реЗ рдЦрд╕рдЦрд╕ тАЛтАЛрдЙрд╕реЗ рдХрд░ рджреЗрдЧрд╛ ... рдХреВрдж, рдХреВрдж!


рдЬрдВрдкрд┐рдВрдЧ рдХрд┐рд╕реА рднреА рдкреНрд▓реЗрдЯрдлрд╝реЙрд░реНрдо рдЧреЗрдо рдХрд╛ рдПрдХ рдЕрднрд┐рдиреНрди рд╣рд┐рд╕реНрд╕рд╛ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдмрд╣реБрдд рдордЬрд╝рд╛ рдЖрддрд╛ рд╣реИред рд╣рдореЗрдВ рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдХрд┐ рдХреВрдж рдЪрд┐рдХрдиреА рдФрд░ рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдХреИрд▓рд┐рдмреНрд░реЗрдЯреЗрдб рд╣реИред рдЗрд╕ рдЯреНрдпреВрдЯреЛрд░рд┐рдпрд▓ рдореЗрдВ, рд╣рдо рдпрд╣рд╛рдВ рд╡рд░реНрдгрд┐рдд рд╕реЛрдирд┐рдХ рд╣реЗрдЬ рд╣реЙрдЧ рдЬреЙрдЧ рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ ред
рдпрджрд┐ (self.forwardMarch) { рд╕реЗ рдкрд╣рд▓реЗ рдЕрджреНрдпрддрди рд╡рд┐рдзрд┐ рдореЗрдВ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХреЛ рдЬреЛрдбрд╝реЗрдВ:

 CGPoint jumpForce = ccp(0.0, 310.0); if (self.mightAsWellJump && self.onGround) { self.velocity = ccpAdd(self.velocity, jumpForce); } 

рдпрджрд┐ рд╣рдо рдЕрднреА рд░реБрдХрддреЗ рд╣реИрдВ рдФрд░ рдкрд░рд┐рдпреЛрдЬрдирд╛ рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рд╣рдореЗрдВ рдХреНрд▓рд╛рд╕рд┐рдХ рдЕрдЯрд╛рд░реА-рд╢реИрд▓реА рдХреА рдЫрд▓рд╛рдВрдЧ рдорд┐рд▓реЗрдЧреАред рд╕рднреА рдХреВрдж рд╕рдорд╛рди рдКрдБрдЪрд╛рдИ рд╡рд╛рд▓реЗ рд╣реЛрдВрдЧреЗред рд╣рдо рдХреЛрдЖрд▓рд╛ рдкрд░ рдмрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдЗрд╕реЗ рджреВрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЧреБрд░реБрддреНрд╡рд╛рдХрд░реНрд╖рдг рдХреА рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░рддреЗ рд╣реИрдВред
рдЖрдзреБрдирд┐рдХ рдкреНрд▓реЗрдЯрдлрд╝реЙрд░реНрдорд░реЛрдВ рдореЗрдВ, рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХрд╛ рдХреВрдж рдкрд░ рдЕрдзрд┐рдХ рдирд┐рдпрдВрддреНрд░рдг рд╣реЛрддрд╛ рд╣реИред рд╣рдо рдорд╛рд░рд┐рдпреЛ рдмреНрд░реЛрд╕ рдпрд╛ рд╕реЛрдирд┐рдХ рдХреА рд╢реИрд▓реА рдореЗрдВ рдирд┐рдпрдВрддреНрд░рд┐рдд, рдмрд┐рд▓реНрдХреБрд▓ рдЕрд╡рд╛рд╕реНрддрд╡рд┐рдХ (рд▓реЗрдХрд┐рди рд▓рд╛рдирдд рдЕрдЬреАрдм) рдХреВрджрдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред
рд╣рдорд╛рд░реЗ рд▓рдХреНрд╖реНрдп рдХреЛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рдХрдИ рддрд░реАрдХреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рд╣рдо рд╕реЛрдирд┐рдХ рдХреА рдЫрд▓рд╛рдВрдЧ рдХреЛ рдПрдХ рдЖрдзрд╛рд░ рдХреЗ рд░реВрдк рдореЗрдВ рд▓реЗрдВрдЧреЗред рдЬрдм рдХреЛрдИ рдЦрд┐рд▓рд╛рдбрд╝реА рд╕реНрдХреНрд░реАрди рдХреЛ рдЫреВрдирд╛ рдмрдВрдж рдХрд░ рджреЗрддрд╛ рд╣реИ, рддреЛ рдХреВрдж рдХреА рддрд╛рдХрдд рдХрдо рд╣реЛрдиреЗ рд▓рдЧрддреА рд╣реИред рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХреЗ рд╕рд╛рде рдЙрдкрд░реЛрдХреНрдд рдХреЛрдб рдмрджрд▓реЗрдВ:

  CGPoint jumpForce = ccp(0.0, 310.0); float jumpCutoff = 150.0; if (self.mightAsWellJump && self.onGround) { self.velocity = ccpAdd(self.velocity, jumpForce); } else if (!self.mightAsWellJump && self.velocity.y > jumpCutoff) { self.velocity = ccp(self.velocity.x, jumpCutoff); } 

рдпрд╣ рдХреЛрдб рдПрдХ рдФрд░ рдЕрддрд┐рд░рд┐рдХреНрдд рдХрджрдо рдЙрдард╛рддрд╛ рд╣реИред рдЬрдм рдЦрд┐рд▓рд╛рдбрд╝реА рд╕реНрдХреНрд░реАрди рдХреЛ рдЫреВрдирд╛ рдмрдВрдж рдХрд░ рджреЗрддрд╛ рд╣реИ (self.mightAsWellJump рдХрд╛ рдорд╛рди рдирд╣реАрдВ рдмрди рдЬрд╛рддрд╛ рд╣реИ), рддреЛ рдЦреЗрд▓ рдХреЛрд▓рд┐рдпреЛ рдХреА рдЧрддрд┐ рдХреА рдЬрд╛рдБрдЪ рдХрд░рддрд╛ рд╣реИред рдпрджрд┐ рдпрд╣ рдорд╛рди рд╣рдорд╛рд░реА рд╕реАрдорд╛ рд╕реЗ рдЕрдзрд┐рдХ рд╣реИ, рддреЛ рдЦреЗрд▓ рдЪрд░ рдЧрддрд┐ рдХрд╛ рдореВрд▓реНрдп рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рддрд╛ рд╣реИред
рдЗрд╕ рдкреНрд░рдХрд╛рд░, рд╕реНрдХреНрд░реАрди рдХреЗ рдПрдХ рдкрд▓ рдХреЗ рд╕реНрдкрд░реНрд╢ рдХреЗ рд╕рд╛рде, рдХреЛрдЖрд▓рд╛ рдХреВрдж рдХреВрдж рд╕реЗ рдЕрдзрд┐рдХ рдирд╣реАрдВ рд╣реЛрдЧрд╛, рд▓реЗрдХрд┐рди рд╕реНрдХреНрд░реАрди рдкрд░ рдПрдХ рд▓рдВрдмреЗ рдкреНрд░реЗрд╕ рдХреЗ рд╕рд╛рде, рдХреЛрдЖрд▓рд╛ рдЙрдЪреНрдЪ рдФрд░ рдЙрдЪреНрдЪ рдХреВрдж рдЬрд╛рдПрдЧрд╛ред
рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдЪрд▓рд╛рдПрдВред рдЦреЗрд▓ рдХреБрдЫ рд╕рд╛рд░реНрдердХ рдХреА рддрд░рд╣ рд▓рдЧ рд░рд╣рд╛ рд╣реИ! рдЕрдм, рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ рд╕рдВрднрд╛рд╡рдирд╛ рд╣реИ, рдЖрдкрдХреЛ рджреЛрдиреЛрдВ "рдбрд┐рд╡рд╛рдЗрд╕" рдХреЗ рд╕рдВрдЪрд╛рд▓рди рдХреА рдЬрд╛рдВрдЪ рдХреЗ рд▓рд┐рдП рдПрдХ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдбрд┐рд╡рд╛рдЗрд╕ (рдпрджрд┐ рдЖрдкрдиреЗ рдкрд╣рд▓реЗ рд╕реЗ рдРрд╕рд╛ рдирд╣реАрдВ рдХрд┐рдпрд╛ рд╣реИ) рдкрд░ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред

рдЫрд╡рд┐

рд╣рдордиреЗ рдХреЛрд▓рд┐рдпреЛ рдХреЛ рджреМрдбрд╝рдиреЗ рдФрд░ рдХреВрджрдиреЗ рдХреЗ рд▓рд┐рдП рдмрдирд╛рдпрд╛, рд▓реЗрдХрд┐рди рд╡рд╣ рд╕реНрдХреНрд░реАрди рдХреЗ рдХрд┐рдирд╛рд░реЗ рд╕реЗ рддреЗрдЬреА рд╕реЗ рднрд╛рдЧрддрд╛ рд╣реИред рдЗрд╕реЗ рдареАрдХ рдХрд░рдиреЗ рдХрд╛ рд╕рдордп рдЖ рдЧрдпрд╛ рд╣реИ!
рд╕реЗрд▓ рдорд╛рдирдЪрд┐рддреНрд░ рдЯреНрдпреВрдЯреЛрд░рд┐рдпрд▓ рд╕реЗ GameLevelLayer.m рдХреЗ рд▓рд┐рдП рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╕реНрдирд┐рдкреЗрдЯ рдЬреЛрдбрд╝реЗрдВ:

рдореБрдЭреЗ рдХреНрд▓рд┐рдХ рдХрд░реЗрдВ
 - (void)setViewpointCenter:(CGPoint) position { CGSize winSize = [[CCDirector sharedDirector] winSize]; int x = MAX(position.x, winSize.width / 2); int y = MAX(position.y, winSize.height / 2); x = MIN(x, (map.mapSize.width * map.tileSize.width) - winSize.width / 2); y = MIN(y, (map.mapSize.height * map.tileSize.height) - winSize.height/2); CGPoint actualPosition = ccp(x, y); CGPoint centerOfView = ccp(winSize.width/2, winSize.height/2); CGPoint viewPoint = ccpSub(centerOfView, actualPosition); map.position = viewPoint; } 

рдпрд╣ рдХреЛрдб рд╕реНрдХреНрд░реАрди рдХреЛ рдкреНрд▓реЗрдпрд░ рдХреА рд╕реНрдерд┐рддрд┐ рдореЗрдВ рд▓реЙрдХ рдХрд░ рджреЗрддрд╛ рд╣реИред рдпрджрд┐ рдХреЛрд▓рд┐рдпреЛ рд╕реНрддрд░ рдХреЗ рдЕрдВрдд рддрдХ рдкрд╣реБрдВрдЪрддрд╛ рд╣реИ, рддреЛ рд╕реНрдХреНрд░реАрди рдХреЛрдПрд▓реЗ рдкрд░ рдХреЗрдВрджреНрд░рд┐рдд рд╣реЛрдирд╛ рдмрдВрдж рд╣реЛ рдЬрд╛рддреА рд╣реИ рдФрд░ рд╕реНрдХреНрд░реАрди рдХреЗ рдЪреЗрд╣рд░реЗ рдХреЗ рд╕реНрддрд░ рдХреЛ рдареАрдХ рдХрд░рддреА рд╣реИред
рдпрд╣ рдзреНрдпрд╛рди рджреЗрдиреЗ рдпреЛрдЧреНрдп рд╣реИ рдХрд┐ рдЕрдВрддрд┐рдо рдкрдВрдХреНрддрд┐ рдореЗрдВ рд╣рдо рдЦрд┐рд▓рд╛рдбрд╝реА рдХреЛ рдирд╣реАрдВ, рдмрд▓реНрдХрд┐ рдХрд╛рд░реНрдб рдХреЛ рдЖрдЧреЗ рдмрдврд╝рд╛ рд░рд╣реЗ рд╣реИрдВред рдпрд╣ рд╕рдВрднрд╡ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдЦрд┐рд▓рд╛рдбрд╝реА рдирдХреНрд╢реЗ рдХрд╛ рд╡рдВрд╢рдЬ рд╣реИред рдЗрд╕рд▓рд┐рдП рдЬрдм рдЦрд┐рд▓рд╛рдбрд╝реА рджрд╛рдИрдВ рдУрд░ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдХрд╛рд░реНрдб рдмрд╛рдИрдВ рдУрд░ рдЪрд▓рддрд╛ рд╣реИ рдФрд░ рдЦрд┐рд▓рд╛рдбрд╝реА рд╕реНрдХреНрд░реАрди рдХреЗ рдХреЗрдВрджреНрд░ рдореЗрдВ рд░рд╣рддрд╛ рд╣реИред
рдЕрдзрд┐рдХ рд╡рд┐рд╕реНрддреГрдд рд╡рд┐рд╡рд░рдг рдХреЗ рд▓рд┐рдП, рдЗрд╕ рдЯреНрдпреВрдЯреЛрд░рд┐рдпрд▓ рдкрд░ рдЬрд╛рдПрдБред
рд╣рдореЗрдВ рдЕрдкрдбреЗрдЯ рд╡рд┐рдзрд┐ рдореЗрдВ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХреЙрд▓ рдХреЛ рдЬреЛрдбрд╝рдирд╛ рд╣реЛрдЧрд╛:

  [self setViewpointCenter:player.position]; 

рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдЪрд▓рд╛рдПрдВред рдХреЛрдЖрд▓рд┐рдУ рдкреВрд░реЗ рд╕реНрддрд░ рд╕реЗ рдЪрд▓ рд╕рдХрддрд╛ рд╣реИ!

рдЫрд╡рд┐

рд╣рд╛рд░ рдХреА рдкреАрдбрд╝рд╛


рджреЛ рдкрд░рд┐рдгрд╛рдо рд╣реИрдВ: рдпрд╛ рддреЛ рдЬреАрдд рдпрд╛ рд╣рд╛рд░ред
рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рд╣рдо рд╣рд╛рд░ рдХреЗ рдкрд░рд┐рджреГрд╢реНрдп рд╕реЗ рдирд┐рдкрдЯреЗрдВрдЧреЗред рд╣рдорд╛рд░реЗ рд╕реНрддрд░ рдкрд░ рдЦрддрд░реЗ рд╣реИрдВред рдпрджрд┐ рдЦрд┐рд▓рд╛рдбрд╝реА рдЦрддрд░реЗ рдореЗрдВ рд╣реИ, рддреЛ рдЦреЗрд▓ рд╕рдорд╛рдкреНрдд рд╣реЛ рдЬрд╛рддрд╛ рд╣реИред
рдЪреВрдВрдХрд┐ рдЦрддрд░реЗ рддрдп рдХреЛрд╢рд┐рдХрд╛рдПрдВ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рд╣рдо рдЙрдирдХреЗ рд╕рд╛рде рдкрд┐рдЫрд▓реЗ рдЯреНрдпреВрдЯреЛрд░рд┐рдпрд▓ рд╕реЗ рдмрд╛рдзрд╛рдУрдВ рдХреЗ рд░реВрдк рдореЗрдВ рдХрд╛рдо рдХрд░реЗрдВрдЧреЗред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдЯрдХрд░рд╛рд╡ рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рдиреЗ рдХреЗ рдмрдЬрд╛рдп, рд╣рдо рдмрд╕ рдЦреЗрд▓ рдХреЛ рд╕рдорд╛рдкреНрдд рдХрд░ рджреЗрдВрдЧреЗред рд╣рдо рд╕рдлрд▓рддрд╛ рдХреА рд░рд╛рд╣ рдкрд░ рд╣реИрдВ - рдмрд╕ рдереЛрдбрд╝рд╛ рд╕рд╛ рдмрдЪрд╛ рд╣реИ!
GameLevelLayer.m рдХреЗ рд▓рд┐рдП рдирд┐рдореНрди рд╡рд┐рдзрд┐ рдЬреЛрдбрд╝реЗрдВ:

 - (void)handleHazardCollisions:(Player *)p { NSArray *tiles = [self getSurroundingTilesAtPosition:p.position forLayer:hazards ]; for (NSDictionary *dic in tiles) { CGRect tileRect = CGRectMake([[dic objectForKey:@"x"] floatValue], [[dic objectForKey:@"y"] floatValue], map.tileSize.width, map.tileSize.height); CGRect pRect = [p collisionBoundingBox]; if ([[dic objectForKey:@"gid"] intValue] && CGRectIntersectsRect(pRect, tileRect)) { [self gameOver:0]; } } } 

рдЙрдкрд░реЛрдХреНрдд рд╕рднреА рдХреЛрдб рдЖрдкрдХреЛ рдкрд░рд┐рдЪрд┐рдд рд╣реЛрдиреЗ рдЪрд╛рд╣рд┐рдП, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рд╕рд┐рд░реНрдл checkAndResolveCollisions рд╡рд┐рдзрд┐ рд╕реЗ рдХреЙрдкреА рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдПрдХрдорд╛рддреНрд░ рдирд╡рд╛рдЪрд╛рд░ рдЧреЗрдордУрд╡рд░ рд╡рд┐рдзрд┐ рд╣реИред рдпрджрд┐ рдЦрд┐рд▓рд╛рдбрд╝реА рд╣рд╛рд░ рдЬрд╛рддрд╛ рд╣реИ рддреЛ рд╣рдо рдЙрд╕реЗ 0 рднреЗрдЬрддреЗ рд╣реИрдВ, рдФрд░ рдпрджрд┐ рд╡рд╣ рдЬреАрддрд╛ рд╣реИ рддреЛ 1ред
рд╣рдо рджреАрд╡рд╛рд░реЛрдВ рдХреА рдкрд░рдд рдХреЗ рдмрдЬрд╛рдп рдЦрддрд░реЛрдВ рдХреА рдкрд░рдд рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рд╣рдореЗрдВ рдЪрд░ CCTMXLayer * рдЦрддрд░реЛрдВ рдХреА рдШреЛрд╖рдгрд╛ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ ; рдирд┐рд╖реНрдкрд╛рджрди рдпреЛрдЧреНрдп рдХреА рд╢реБрд░реБрдЖрдд рдореЗрдВ @ interface ред рдЗрд╕реЗ рдЗрдирд┐рдЯ рд╡рд┐рдзрд┐ рдореЗрдВ рдЬреЛрдбрд╝реЗрдВ (рджреАрд╡рд╛рд░реЛрдВ рдХреА рдкрд░рдд рдХреЗ рд▓рд┐рдП рдЪрд░ рдШреЛрд╖рд┐рдд рдХрд░рдиреЗ рдХреЗ рддреБрд░рдВрдд рдмрд╛рдж):

  hazards = [map layerNamed:@"hazards"]; 

рдХреЗрд╡рд▓ рдПрдХ рд╣реА рдЪреАрдЬрд╝ рдмрдЪреА рд╣реИ рдЬреЛ рдЕрджреНрдпрддрди рд╡рд┐рдзрд┐ рдореЗрдВ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХреЛрдб рдЬреЛрдбрд╝ рд░рд╣реА рд╣реИ:

 - (void)update:(ccTime)dt { [player update:dt]; [self handleHazardCollisions:player]; [self checkForAndResolveCollisions:player]; [self setViewpointCenter:player.position]; } 

рдЕрдм, рдпрджрд┐ рдХреЛрдИ рдЦрд┐рд▓рд╛рдбрд╝реА рдЦрддрд░реЛрдВ рдХреА рдкрд░рдд рд╕реЗ рдХрд┐рд╕реА рднреА рдЦрддрд░рдирд╛рдХ рд╕реЗрд▓ рдореЗрдВ рдЙрдбрд╝ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рд╣рдо рдЧреЗрдордСрд╡рд░ рдХрд╣реЗрдВрдЧреЗред рдпрд╣ рд╡рд┐рдзрд┐ рдЖрдкрдХреЗ рджреНрд╡рд╛рд░рд╛ рдЦреЛрдП рдЧрдП рд╕рдВрджреЗрд╢ рдХреЗ рд╕рд╛рде "рдкреБрдирдГ рдЖрд░рдВрдн рдХрд░реЗрдВ" рдмрдЯрди рдХреЛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░реЗрдЧреА (рдпрд╛ рдЬреАрдд рдЧрдИ - рдпрд╣ рднреА рд╣реЛрддрд╛ рд╣реИ):

рдореБрдЭреЗ рдХреНрд▓рд┐рдХ рдХрд░реЗрдВ
 - (void)gameOver:(BOOL)won { gameOver = YES; NSString *gameText; if (won) { gameText = @"You Won!"; } else { gameText = @"You have Died!"; } CCLabelTTF *diedLabel = [[CCLabelTTF alloc] initWithString:gameText fontName:@"Marker Felt" fontSize:40]; diedLabel.position = ccp(240, 200); CCMoveBy *slideIn = [[CCMoveBy alloc] initWithDuration:1.0 position:ccp(0, 250)]; CCMenuItemImage *replay = [[CCMenuItemImage alloc] initWithNormalImage:@"replay.png" selectedImage:@"replay.png" disabledImage:@"replay.png" block:^(id sender) { [[CCDirector sharedDirector] replaceScene:[GameLevelLayer scene]]; }]; NSArray *menuItems = [NSArray arrayWithObject:replay]; CCMenu *menu = [[CCMenu alloc] initWithArray:menuItems]; menu.position = ccp(240, -100); [self addChild:menu]; [self addChild:diedLabel]; [menu runAction:slideIn]; } 

рдкрд╣рд▓реА рдкрдВрдХреНрддрд┐ рдЧреЗрдордСрд╡рд░ рдЪрд░ рдШреЛрд╖рд┐рдд рдХрд░рддреА рд╣реИред рдХреЛрд▓рд┐рдпреЛ рдХреА рд╕реНрдерд┐рддрд┐ рдореЗрдВ рдХреЛрдИ рднреА рдмрджрд▓рд╛рд╡ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдкрдбреЗрдЯ рд╡рд┐рдзрд┐ рдХреЛ рд░реЛрдХрдиреЗ рдХреЗ рд▓рд┐рдП рд╣рдо рдЗрд╕ рдЪрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗред рд╢рд╛рдмреНрджрд┐рдХ рд░реВрдк рд╕реЗ рдПрдХ рдорд┐рдирдЯ рдореЗрдВ рд╣рдо рдЗрд╕реЗ рдХрд░ рд▓реЗрдВрдЧреЗред
рдЕрдЧрд▓рд╛, рдХреЛрдб рдкрд╛рда (рд▓реЗрдмрд▓) рдмрдирд╛рддрд╛ рд╣реИ рдФрд░ рдЗрд╕реЗ рдЬреАрддрд╛ рдпрд╛ рд╣рд╛рд░рд╛ рд╣реБрдЖ рдорд╛рди рджреЗрддрд╛ рд╣реИред рд╣рдо рдПрдХ "рд░рд┐рд╕реНрдЯрд╛рд░реНрдЯ" рдмрдЯрди рднреА рдмрдирд╛рддреЗ рд╣реИрдВред
рдпреЗ рдмреНрд▓реЙрдХ-рдЖрдзрд╛рд░рд┐рдд CCMenu рдСрдмреНрдЬреЗрдХреНрдЯ рдореЗрдердб рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рдЖрд╕рд╛рди рд╣реИрдВред рд╣рдорд╛рд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рд╣рдо рдмрд╕ рд╕реНрддрд░ рдХреЛ рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдкрдиреЗ рд╕реНрддрд░ рдХреЛ рдЗрд╕рдХреА рдПрдХ рдкреНрд░рддрд┐ рдХреЗ рд╕рд╛рде рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрд┐рдд рдХрд░рддреЗ рд╣реИрдВред рд╣рдо CCAction рдФрд░ CCMove рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреЗрд╡рд▓ рдЦреВрдмрд╕реВрд░рддреА рд╕реЗ рдмрдЯрди рдХреЛ рдЪреЗрддрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд░рддреЗ рд╣реИрдВред
рдПрдХ рдФрд░ рдЪреАрдЬ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмреВрд▓рд┐рдпрди рд╡реИрд░рд┐рдПрдмрд▓ рдЧреЗрдордСрд╡рд░ рдХреЛ GameLevelLayer рдХреНрд▓рд╛рд╕ рдореЗрдВ рдЬреЛрдбрд╝рдирд╛ рд╣реИред рдпрд╣ рдПрдХ рд╕реНрдерд╛рдиреАрдп рдЪрд░ рд╣реЛрдЧрд╛, рдХреНрдпреЛрдВрдХрд┐ рд╣рдо рдЗрд╕реЗ рдХрдХреНрд╖рд╛ рдХреЗ рдмрд╛рд╣рд░ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░реЗрдВрдЧреЗред GameLevelLayer.m рдлрд╝рд╛рдЗрд▓ рдХреА рд╢реБрд░реБрдЖрдд рдореЗрдВ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХреЛ @ interface рдореЗрдВ рдЬреЛрдбрд╝реЗрдВ:

 CCTMXLayer *hazards; BOOL gameOver; 

рдЕрджреНрдпрддрди рд╡рд┐рдзрд┐ рдХреЛ рдирд┐рдореНрдирд╛рдиреБрд╕рд╛рд░ рдмрджрд▓реЗрдВ:

 - (void)update:(ccTime)dt { if (gameOver) { return; } [player update:dt]; [self checkForAndResolveCollisions:player]; [self handleHazardCollisions:player]; [self setViewpointCenter:player.position]; } 

рдЧреЗрдо рд▓реЙрдиреНрдЪ рдХрд░реЗрдВ, рд╕реНрдЯрдбреЗрдб рдлреНрд▓реЛрд░ рдвреВрдВрдвреЗрдВ рдФрд░ рдЙрд╕ рдкрд░ рдХреВрджреЗрдВ! рдЖрдкрдХреЛ рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рд╕реЗ рджреЗрдЦрдирд╛ рдЪрд╛рд╣рд┐рдП:

рдЫрд╡рд┐

рдмрд╕ рдЗрд╕реЗ рдЕрдХреНрд╕рд░ рджреЛрд╣рд░рд╛рдПрдВ рдирд╣реАрдВ, рдЕрдиреНрдпрдерд╛ рдкрд╢реБ рдЕрдзрд┐рд╡рдХреНрддрд╛рдУрдВ рдХреЗ рд╕рд╛рде рд╕рдорд╕реНрдпрд╛рдПрдВ рджрд┐рдЦрд╛рдИ рджреЗ рд╕рдХрддреА рд╣реИрдВ! :]

рдореМрдд рдХреЗ рдШрд╛рдЯ рдЙрддрд╛рд░ рджрд┐рдпрд╛


рдЕрдм рдХреЛрд╢рд┐рдХрд╛рдУрдВ рдХреЗ рдмреАрдЪ рдПрдХ рдЫреЗрдж рдореЗрдВ рдЧрд┐рд░рдиреЗ рдХрд╛ рдПрдХ рдкрд░рд┐рджреГрд╢реНрдп рдЬреЛрдбрд╝реЗрдВред рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рд╣рдо рдЦреЗрд▓ рдХреЛ рд╕рдорд╛рдкреНрдд рдХрд░рддреЗ рд╣реИрдВред
рдЕрднреА, рдЬрдм рдпрд╣ рдХреНрд░реИрд╢ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдХреЛрдб "TMXLayer: рдЕрдорд╛рдиреНрдп рд╕реНрдерд┐рддрд┐" рдХреЗ рд╕рд╛рде рдХреНрд░реИрд╢ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИред (рдбрд░!) рдпрд╣ рд╡рд╣ рдЬрдЧрд╣ рд╣реИ рдЬрд╣рд╛рдБ рд╣рдореЗрдВ рд╣рд╕реНрддрдХреНрд╖реЗрдк рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред
рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХреЛрдб рдХреЛ GameLevelLayer.m рдореЗрдВ, getSurroundingTilesAtPosition рдореЗрдВ рдЬреЛрдбрд╝реЗрдВ: рдкрджреНрдзрддрд┐, рдЯрд╛рдЗрд▓рдЧрд╛рдЗрдб рд▓рд╛рдЗрди рд╕реЗ рдкрд╣рд▓реЗ :

 if (tilePos.y > (map.mapSize.height - 1)) { //fallen in a hole [self gameOver:0]; return nil; } 

рдпрд╣ рдХреЛрдб рдЧреЗрдордСрд╡рд░ рдХрд╛рд░реНрд░рд╡рд╛рдИ рдХреЛ рдЯреНрд░рд┐рдЧрд░ рдХрд░реЗрдЧрд╛ рдФрд░ рдХреЛрд╢рд┐рдХрд╛рдУрдВ рдХреА рдПрдХ рд╕рд░рдгреА рдмрдирд╛рдиреЗ рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЛ рд░реЛрдХ рджреЗрдЧрд╛ред рд╣рдореЗрдВ рднреА рдЪреЗрдХ рдореЗрдВ рд╕рднреА рдХреЛрд╢рд┐рдХрд╛рдУрдВ рд╕реЗ рдЧреБрдЬрд░рдиреЗ рд╕реЗ рд▓реВрдк рдХреЛ рд░реЛрдХрдиреЗ рдХреА рдЬрд░реВрд░рдд рд╣реИред NSArray * рдЯрд╛рдЗрд▓реНрд╕ = [рдЖрддреНрдо getSurroundingTilesAtPosition: p.position forLayer: wall] рдХреЗ рдмрд╛рдж рдХреЛрдб рдХрд╛ рдПрдХ рдмреНрд▓реЙрдХ рдЬреЛрдбрд╝реЗрдВ ; :

  if (gameOver) { return; } 

рдпрд╣ рд▓реВрдк рдХреА рдЪреБрдиреМрддреА рдФрд░ рдЦреЗрд▓ рдХреЗ рдЕрдирд╛рд╡рд╢реНрдпрдХ рдХреНрд░реИрд╢ рдХреЛ рд░реЛрдХ рджреЗрдЧрд╛ред
рдЕрдм рдЧреЗрдо рд▓реЙрдиреНрдЪ рдХрд░реЗрдВред рд░рд╕рд╛рддрд▓ рдЦреЛрдЬреЗрдВ рдЬрд┐рд╕рдореЗрдВ рдЖрдк рдХреВрдж рд╕рдХрддреЗ рд╣реИрдВ, рдФрд░ ... рдХреЛрдИ рдЫрдВрдЯрдиреА рдирд╣реАрдВ! рдЦреЗрд▓ рдЗрдЪреНрдЫрд╛рдиреБрд╕рд╛рд░ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред

рдЫрд╡рд┐

рдЬреАрдд!


рдЕрдм, рдЗрд╕ рдорд╛рдорд▓реЗ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░реЗрдВ рдЬрдм рд╣рдорд╛рд░рд╛ рдХреЛрд▓рд┐рдпреЛ рдЦреЗрд▓ рдЬреАрддрддрд╛ рд╣реИ!

рдЫрд╡рд┐

рд╣рдо рд╕рднреА рдЕрдкрдиреЗ рдХреЛрдЕрд▓рд╛ рдХреА рдПрдХреНрд╕-рд╕реНрдерд┐рддрд┐ рдХрд╛ рдкрд╛рд▓рди рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдПрдХ рдЬреАрдд рд╕рдВрджреЗрд╢ рдХреЗ рд╕рд╛рде рдПрдХ рд╕реНрдХреНрд░реАрди рджрд┐рдЦрд╛рддреЗ рд╣реИрдВ рдпрджрд┐ рдпрд╣ рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рдирд┐рд╢рд╛рди рдХреЛ рдкрд╛рд░ рдХрд░рддрд╛ рд╣реИред рдЗрд╕ рд╕реНрддрд░ рдХреА рд▓рдВрдмрд╛рдИ 3400 рдкрд┐рдХреНрд╕реЗрд▓ рд╣реИред рд╣рдо рдЬреАрддрдиреЗ рд╡рд╛рд▓реЗ рдЪрд┐рд╣реНрди рдХреЛ 3130 рдкрд┐рдХреНрд╕реЗрд▓ рдХреА рджреВрд░реА рдкрд░ рд▓рдЧрд╛рдПрдВрдЧреЗред
GameLevelLayer.m рдореЗрдВ рдПрдХ рдирдИ рд╡рд┐рдзрд┐ рдЬреЛрдбрд╝реЗрдВ рдФрд░ рдЕрдкрдбреЗрдЯ рд╡рд┐рдзрд┐ рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд░реЗрдВ:

 - (void)checkForWin { if (player.position.x > 3130.0) { [self gameOver:1]; } } 

 - (void)update:(ccTime)dt { [player update:dt]; [self handleHazardCollisions:player]; [self checkForWin]; [self checkForAndResolveCollisions:player]; [self setViewpointCenter:player.position]; } 

рджреМрдбрд╝реЛ, рдЬреАрддрдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░реЛред рдпрджрд┐ рдпрд╣ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рддреЛ рдЖрдкрдХреЛ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рджреЗрдЦрдирд╛ рдЪрд╛рд╣рд┐рдП:

рдЫрд╡рд┐

рдорд╣рд╛рди рд╕рдВрдЧреАрдд рдФрд░ рдзреНрд╡рдирд┐ рдкреНрд░рднрд╛рд╡


рдпрд╣ рдорд╣рд╛рди рд╕рдВрдЧреАрдд рдФрд░ рдзреНрд╡рдирд┐ рдкреНрд░рднрд╛рд╡ рдХреЗ рд▓рд┐рдП рд╕рдордп рд╣реИ!
рдЪрд▓рд┐рдП рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВред GameLevelLayer.m рдФрд░ Player.m рдХреА рд╢реБрд░реБрдЖрдд рдореЗрдВ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдЬреЛрдбрд╝реЗрдВ:

 #import "SimpleAudioEngine.h" 

рдЕрдм GameLevelLayer рдлрд╝рд╛рдЗрд▓ рдХреЗ init рд╡рд┐рдзрд┐ рдореЗрдВ рдирд┐рдореНрди рдкрдВрдХреНрддрд┐ рдЬреЛрдбрд╝реЗрдВред

  [[SimpleAudioEngine sharedEngine] playBackgroundMusic:@"level1.mp3"]; 

рд╣рдордиреЗ рдЕрднреА рдХреБрдЫ рдЕрдЪреНрдЫреЗ рдЧреЗрдо рдореНрдпреВрдЬрд╝рд┐рдХ рд╢реБрд░реВ рдХрд┐рдП рд╣реИрдВред рд╕рдВрдЧреАрдд рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП Incompetech.com рдХреЗ рдХреЗрд╡рд┐рди рдХрд╛ рдзрдиреНрдпрд╡рд╛рдж ( рднрдВрдЧреБрд░ рд░реАрд▓ )ред рдЙрд╕рдХреЗ рдкрд╛рд╕ рд╕реАрд╕реА рд▓рд╛рдЗрд╕реЗрдВрд╕ рд╡рд╛рд▓реЗ рд╕рдВрдЧреАрдд рдХрд╛ рдПрдХ рдкреВрд░рд╛ рдмрд╛рджрд▓ рд╣реИ!
рдЕрдм рдХреВрджрдиреЗ рдХреА рдЖрд╡рд╛рдЬрд╝ рдЬреЛрдбрд╝реЗрдВред Player.m рдкрд░ рдЬрд╛рдПрдВ рдФрд░ рдЕрдкрдбреЗрдЯ рд╡рд┐рдзрд┐ рдХреЗ рдЬрдВрдк рдХреЛрдб рдореЗрдВ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдЬреЛрдбрд╝реЗрдВ:

 if (self.mightAsWellJump && self.onGround) { self.velocity = ccpAdd(self.velocity, jumpForce); [[SimpleAudioEngine sharedEngine] playEffect:@"jump.wav"]; } else if (!self.mightAsWellJump && self.velocity.y > jumpCutoff) { self.velocity = ccp(self.velocity.x, jumpCutoff); } 

рдФрд░ рдЕрдВрдд рдореЗрдВ, рд╣рд╛рд░ рдХреА рдЖрд╡рд╛рдЬ рдЦреЗрд▓рддреЗ рд╣реИрдВ рдЬрдм рдХреЛрд▓рд┐рдпреЛ рдПрдХ рдЦрддрд░рдирд╛рдХ рд╕реЗрд▓ рдХреЛ рдЫреВрддрд╛ рд╣реИ рдпрд╛ рдПрдХ рдЫреЗрдж рдореЗрдВ рдЧрд┐рд░рддрд╛ рд╣реИред GameLevelLayer.m рдлрд╝рд╛рдЗрд▓ рдХреА рдЧреЗрдордСрд╡рд░ рдкрджреНрдзрддрд┐ рдХреЗ рд▓рд┐рдП рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдЬреЛрдбрд╝реЗрдВ:

 - (void)gameOver { gameOver = YES; [[SimpleAudioEngine sharedEngine] playEffect:@"hurt.wav"]; CCLabelTTF *diedLabel = [[CCLabelTTF alloc] initWithString:@"You have Died!" fontName:@"Marker Felt" fontSize:40]; diedLabel.position = ccp(240, 200); 

рд▓реЙрдиреНрдЪ рдХрд░реЗрдВ рдФрд░ рдирдИ рдЕрдЪреНрдЫреА рдзреБрдиреЛрдВ рдХрд╛ рдЖрдирдВрдж рд▓реЗрдВред
рд╡рд╣ рд╕рдм рд╣реИ! рдЖрдкрдиреЗ рдПрдХ рдкреНрд▓реЗрдЯрдлрд╝реЙрд░реНрдорд░ рд▓рд┐рдЦрд╛! рдЖрдк рдорд╣рд╛рди рд╣реИрдВ!

рдФрд░ рдпрд╣рд╛рдБ рд╣рдорд╛рд░реА рдкреВрд░реНрдг рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХрд╛ рд╕реНрд░реЛрдд рдХреЛрдб рд╣реИ ред


рдЕрдиреБрд╡рд╛рджрдХ рдХрд╛ рдиреЛрдЯ

рдореИрдВрдиреЗ рд╕рдордп-рд╕рдордп рдкрд░ raywenderlich.com рд╕реЗ рдЯреНрдпреВрдЯреЛрд░рд┐рдпрд▓ рдЯреНрд░рд╛рдВрд╕рд▓реЗрдЯ рдХрд░рдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛ред
рдореЗрд░рд╛ рдЕрдЧрд▓рд╛ рд▓рдХреНрд╖реНрдп Box2D рдФрд░ Cocos2D рдкрд░ рдЖрдзрд╛рд░рд┐рдд Fruit Ninja рдЬреИрд╕рд╛ рдЕрдкрдирд╛ рдЧреЗрдо рдХреИрд╕реЗ рдмрдирд╛рдирд╛ рд╣реИ, рдЗрд╕ рдкрд░ рдЯреНрдпреВрдЯреЛрд░рд┐рдпрд▓ рдХреА рдПрдХ рд╢реНрд░реГрдВрдЦрд▓рд╛ рдХрд╛ рдЕрдиреБрд╡рд╛рдж рдХрд░рдирд╛ рд╣реИред
рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдореЗрдВ рд▓рд┐рдЦреЗрдВ рдпрджрд┐ рдпрд╣ рдЗрд╕рдХреЗ рд▓рд╛рдпрдХ рд╣реИред рдпрджрд┐ рд╕реНрдерд╛рдирд╛рдВрддрд░рдг рдорд╛рдВрдЧ рдореЗрдВ рд╣реИ, рддреЛ рдореИрдВ рдЕрдиреБрд╡рд╛рдж рдХрд░реВрдВрдЧрд╛ред
рдкрд╛рдП рдЧрдП рд╕рднреА рдЕрд╢реБрджреНрдзрд┐рдпреЛрдВ рдФрд░ рдЯрд╛рдЗрдкреЛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ, рдХреГрдкрдпрд╛ рдЗрдмреНрд░рд╛рд╣реАрдо рдпрд╛ рдпрд╣рд╛рдБ рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдореЗрдВ рд▓рд┐рдЦреЗрдВред
рдореБрдЭреЗ рдЯреНрдпреВрдЯреЛрд░рд┐рдпрд▓ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕рднреА рд╕рд╡рд╛рд▓реЛрдВ рдХреЗ рдЬрд╡рд╛рдм рджреЗрдиреЗ рдореЗрдВ рдЦреБрд╢реА рд╣реЛрдЧреА!

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


All Articles