рдХреИрд╕реЗ рдПрдХ рдЯреЙрд╡рд░ рд░рдХреНрд╖рд╛ рдЦреЗрд▓ рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП

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

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

рдЖрдЗрд╡рд░реА рдЯреЙрд╡рд░ рд╕реЗ рджреЗрдЦреЗрдВ

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

рдЫрд╡рд┐

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

рд╕рдВрд╕рд╛рдзрди рдХреА рддреИрдпрд╛рд░реА

рдЦрд╛рд▓реА Cocos2D рдЯреЗрдореНрдкрд▓реЗрдЯ рдФрд░ рдкрд╛рда рдХреЗ рджреМрд░рд╛рди рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ рдЕрдзрд┐рдХрд╛рдВрд╢ рд╕рдВрд╕рд╛рдзрдиреЛрдВ рд╕реЗ рдпреБрдХреНрдд, рдЖрдкрдХреЗ рд▓рд┐рдП рдПрдХ рд╕реНрдЯрд╛рд░реНрдЯ-рдЕрдк рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдкрд╣рд▓реЗ рд╣реА рддреИрдпрд╛рд░ рдХрд┐рдпрд╛ рдЬрд╛ рдЪреБрдХрд╛ рд╣реИред
рд╕реНрдЯрд╛рд░реНрдЯ-рдЕрдк рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдореЗрдВ рдореВрд▓ Cocos2D 1.1 рдЯреЗрдореНрдкреНрд▓реЗрдЯ рд╢рд╛рдорд┐рд▓ рд╣реИ, рдЬреЛ HelloWorldLayer рдФрд░ рд╕реНрдХреНрд░реАрди рдХреЗ рдмреАрдЪ рдореЗрдВ рдПрдХ рд▓рд╛рдЗрди рдпреБрдХреНрдд рдПрдХ рдХрд╛рд░реНрдпрд╢реАрд▓ рдЕрдиреБрдкреНрд░рдпреЛрдЧ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИред рд╣рдо HelloWorldLayer рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░реЗрдВрдЧреЗ, рдХреНрдпреЛрдВрдХрд┐ рд╣рдо рдЕрдкрдирд╛ рд╕реНрд╡рдпрдВ рдХрд╛ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдмрдирд╛рдПрдВрдЧреЗ, рдФрд░ рдлрд┐рд░ рднреА рдЗрд╕ рд╡рд░реНрдЧ рдХреЛ рдкреНрд░рджрд╛рди рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рддрд╛рдХрд┐ рдЖрдк рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░ рд╕рдХреЗрдВ рдХрд┐ рд╕рдм рдХреБрдЫ рдЗрд╕ рд╕реНрддрд░ рдкрд░ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред
Xcode рдореЗрдВ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдЦреЛрд▓реЗрдВ, рдЙрд╕реЗ рд╕рдВрдХрд▓рд┐рдд рдХрд░реЗрдВ рдФрд░ рдЪрд▓рд╛рдПрдВред рдкрд╛рда "рд╣реИрд▓реЛ рд╡рд░реНрд▓реНрдб" рдХреЛ рдкрд░рд┐рдпреЛрдЬрдирд╛ рд╕реЗ рд╣рдЯрд╛ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЖрдкрдХреЛ рдмрд╕ рдПрдХ рдмреНрд▓реИрдХ рд╕реНрдХреНрд░реАрди рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ рд╣реЛрдЧрд╛ рдФрд░ рд╕реНрдЯрд╛рд░реНрдЯрдЕрдк рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЗ рджреМрд░рд╛рди рддреНрд░реБрдЯрд┐рдпрд╛рдВ рдирд╣реАрдВ рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдПред
рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреА рд╕рдВрд░рдЪрдирд╛ рдкрд░ рдПрдХ рдирдЬрд╝рд░ рдбрд╛рд▓реЗрдВред рдЯреЙрд╡рд░рдбрд┐рдлрд╝реЗрдВрд╕ рдлрд╝реЛрд▓реНрдбрд░ рдХреЗ рдЕрдВрджрд░ рдЖрдк рдкрд╛рдПрдВрдЧреЗ:

рдЕрдм рдЖрдк рдирдХреНрд╢реЗ рдХреЛ рдЕрдиреБрдХреВрд▓рд┐рдд рдХрд░рдирд╛ рд╢реБрд░реВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдЯреЙрд╡рд░ рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ!

рдЯреЙрд╡рд░ рд╕реНрдерд╛рдкрдирд╛

рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рджреГрд╢реНрдп рдореЗрдВ рдПрдХ рдкреГрд╖реНрдарднреВрдорд┐ рдЫрд╡рд┐ рдЬреЛрдбрд╝реЗрдВред HelloWorldLayer.m рдХреА рдХрдХреНрд╖рд╛ рдЦреЛрд▓реЗрдВ рдФрд░ рдпрджрд┐ init рд╡рд┐рдзрд┐ рдореЗрдВ рдЗрд╕ рд╕реНрдерд┐рддрд┐ рдХреЗ рдЕрдВрджрд░ рдХреЛрдб рдХреА рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдкрдВрдХреНрддрд┐рдпрд╛рдБ рдЬреЛрдбрд╝реЗрдВ:

// 1 -  self.isTouchEnabled = YES; CGSize wins = [CCDirector sharedDirector].winSize; // 2 -   CCSprite * background = [CCSprite spriteWithFile:@"Bg.png"]; [self addChild:background]; [background setPosition:ccp(wins.width/2,wins.height/2)]; 

рдЕрдиреБрднрд╛рдЧ # 1 рдореЗрдВ рдкрд╣рд▓реА рдкрдВрдХреНрддрд┐ рдкрд░рдд рдХреЛ рд╕реНрдкрд░реНрд╢ рдШрдЯрдирд╛рдУрдВ рдХреЛ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреА рд╣реИред рдЕрдиреБрднрд╛рдЧ # 2 рдореЗрдВ рдмрд╛рдХреА рдХреЛрдб рд╣рдорд╛рд░реЗ рджреГрд╢реНрдп рдореЗрдВ рдПрдХ рдкреГрд╖реНрдарднреВрдорд┐ рд╕реНрдкреНрд░рд╛рдЗрдЯ рдЬреЛрдбрд╝рддрд╛ рд╣реИред
рдкреГрд╖реНрдарднреВрдорд┐ рдХреА рдЫрд╡рд┐ рдпрд╣ рджреЗрдЦрдиреЗ рдореЗрдВ рдорджрдж рдХрд░рддреА рд╣реИ рдХрд┐ рдЦрд┐рд▓рд╛рдбрд╝реА рдХрд╣рд╛рдВ рдЯреЙрд╡рд░ рд╕реНрдерд╛рдкрд┐рдд рдХрд░ рд╕рдХрддрд╛ рд╣реИред рдЕрдм рдЖрдкрдХреЛ рд╕реНрдХреНрд░реАрди рдкрд░ рдХреБрдЫ рдмрд┐рдВрджреБрдУрдВ рдХреЛ рд╕реЗрдЯ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдЬрд┐рд╕реЗ рдЫреВрдиреЗ рд╕реЗ рдЦрд┐рд▓рд╛рдбрд╝реА рдЯрд╛рд╡рд░реЛрдВ рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдЧрд╛ред
рд╣рдорд╛рд░реЗ рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рдЕрд░реНрде рдХреЛ рд╕рдВрд░рдХреНрд╖рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╕рднреА рдмрд┐рдВрджреБ ".plist" рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рд╕реНрдерд┐рдд рд╣реЛрдВрдЧреЗ, рдЬрд┐рд╕рдореЗрдВ рдЙрдиреНрд╣реЗрдВ рдЖрд╕рд╛рдиреА рд╕реЗ рдмрджрд▓рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред TowerPosition.plist рд╕рдВрд╕рд╛рдзрди рдлрд╝реЛрд▓реНрдбрд░ рдореЗрдВ рд╕реНрдерд┐рдд рд╣реИ рдФрд░ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЕрдВрджрд░ рдЯрд╛рд╡рд░реЛрдВ рдХреЗ рдирд┐рд░реНрдорд╛рдг рдХреЗ рд▓рд┐рдП рдХрдИ рд╕реНрдерд╛рди рд╣реИрдВред
рдЗрд╕ рдлрд╝рд╛рдЗрд▓ рдХреЛ рдмреНрд░рд╛рдЙрдЬрд╝ рдХрд░реЗрдВ, рдЖрдкрдХреЛ рдРрд╕реЗ рд╢рдмреНрджрдХреЛрд╢реЛрдВ рдХреА рдПрдХ рд╕рд░рдгреА рдорд┐рд▓реЗрдЧреА рдЬрд┐рд╕рдореЗрдВ рдХреЗрд╡рд▓ рджреЛ рдХреБрдВрдЬрд┐рдпрд╛рдБ рд╣реИрдВ: "x" рдФрд░ "y"ред рдкреНрд░рддреНрдпреЗрдХ рд╢рдмреНрджрдХреЛрд╢ рд╕реНрдХреНрд░реАрди рдкрд░ рдЕрдкрдиреЗ рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рджреНрд╡рд╛рд░рд╛ рдЯреЙрд╡рд░ рдХреА рд╕реНрдерд┐рддрд┐ рдХрд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд░рддрд╛ рд╣реИред рдЕрдм рдЖрдкрдХреЛ рдЗрд╕ рдлрд╝рд╛рдЗрд▓ рдХреЛ рдкрдВрдЬреАрдХреГрдд рдХрд░рдиреЗ рдФрд░ рдорд╛рдирдЪрд┐рддреНрд░ рдкрд░ рдЯрд╛рд╡рд░реЛрдВ рдХреЗ рд▓рд┐рдП рдЖрдзрд╛рд░ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред
HelloWorldLayer.h рдЦреЛрд▓реЗрдВ рдФрд░ рдирд┐рдореНрди рдЪрд░ (рд▓рд╛рдЗрди рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЗ рдмрд╛рдж рдШреБрдВрдШрд░рд╛рд▓реЗ рдХреЛрд╖реНрдардХ рдХреЗ рдЕрдВрджрд░) рдЬреЛрдбрд╝реЗрдВред

 NSMutableArray * towerBases; 

HelloWorldLayer.m рдХреЗ рд▓рд┐рдП рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдкрд░рд┐рд╡рд░реНрддрди рдХрд░реЗрдВ:
рдХреЛрдб
 //    "init" -(void)loadTowerPositions { NSString* plistPath = [[NSBundle mainBundle] pathForResource:@"TowersPosition" ofType:@"plist"]; NSArray * towerPositions = [NSArray arrayWithContentsOfFile:plistPath]; towerBases = [[NSMutableArray alloc] initWithCapacity:10]; for(NSDictionary * towerPos in towerPositions) { CCSprite * towerBase = [CCSprite spriteWithFile:@"open_spot.png"]; [self addChild:towerBase]; [towerBase setPosition:ccp([[towerPos objectForKey:@"x"] intValue],[[towerPos objectForKey:@"y"] intValue])]; [towerBases addObject:towerBase]; } } // init,      #2 // 3 -    [self loadTowerPositions]; // dealloc,     (  super) [towerBases release]; 

рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛ рд╕рдВрдХрд▓рд┐рдд рдХрд░реЗрдВ рдФрд░ рдЪрд▓рд╛рдПрдВ, рдЖрдк рд╕рдбрд╝рдХ рдХреЗ рдХрд┐рдирд╛рд░реЛрдВ рдкрд░ рд╡рд░реНрдЧреЛрдВ рдХреЛ рджреЗрдЦреЗрдВрдЧреЗ, рд╡реЗ рдЯреЙрд╡рд░ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЖрдзрд╛рд░ рдХреЗ рд░реВрдк рдореЗрдВ рдХрд╛рдо рдХрд░реЗрдВрдЧреЗред

рдЫрд╡рд┐

рдЕрдм рдпреЗ рдЖрдзрд╛рд░ рддреИрдпрд╛рд░ рд╣реИрдВ, рдЪрд▓реЛ рдХреБрдЫ рдЯрд╛рд╡рд░реЛрдВ рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдХрд░реЗрдВ!
рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, HelloWorldLayer.h рдЦреЛрд▓реЗрдВ рдФрд░ рдШреБрдВрдШрд░рд╛рд▓реЗ рдмреНрд░реЗрд╕ рдХреЛ рдмрдВрдж рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдкрдВрдХреНрддрд┐ рдЬреЛрдбрд╝реЗрдВ:

 @property (nonatomic,retain) NSMutableArray *towers; 

@ рд╡рд░реНрдЬрди рд▓рд╛рдЗрди рдХреЗ рдиреАрдЪреЗ HelloWorldLayer.m рдореЗрдВ рдЯреЙрд╡рд░ рд╡реЗрд░рд┐рдПрдмрд▓ рдХреЛ рд╕рд┐рдВрдереЗрд╕рд╛рдЗрдЬрд╝ рдХрд░реЗрдВ:

 @synthesize towers; 

рдЗрд╕рдХреЗ рдмрд╛рдж, рдПрдХ рдирдпрд╛ рд╡рд░реНрдЧ рдмрдирд╛рдПрдВ рдЬреЛ рдЯрд╛рд╡рд░реЛрдВ рдХрд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд░реЗрдЧрд╛ред IOS \ рдХреЛрдХреЛ рдЯрдЪ \ рдСрдмреНрдЬреЗрдХреНрдЯрд┐рд╡-рд╕реА рдЯреЗрдореНрдкрд▓реЗрдЯ рд╕реЗ рдПрдХ рдирдИ рдлрд╝рд╛рдЗрд▓ рдЬреЛрдбрд╝реЗрдВред рдХреНрд▓рд╛рд╕ рдЯреЙрд╡рд░ рдХреЛ рдирд╛рдо рджреЗрдВ, рдФрд░ рдЗрд╕реЗ CCNode рдХрд╛ рдЙрдкрд╡рд░реНрдЧ рдмрдирд╛рдПрдВ ред
рдЯреЙрд╡рд░ рдХреА рд╕рд╛рдордЧреНрд░реА рдХреЛ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХреЗ рд╕рд╛рде рдмрджрд▓реЗрдВ:
рдХреЛрдб
 #import "cocos2d.h" #import "HelloWorldLayer.h" #define kTOWER_COST 300 @class HelloWorldLayer, Enemy; @interface Tower: CCNode { int attackRange; int damage; float fireRate; } @property (nonatomic,assign) HelloWorldLayer *theGame; @property (nonatomic,assign) CCSprite *mySprite; +(id)nodeWithTheGame:(HelloWorldLayer*)_game location:(CGPoint)location; -(id)initWithTheGame:(HelloWorldLayer *)_game location:(CGPoint)location; @end 

рдЗрд╕рдХреЗ рдмрд╛рдж рдЯреЙрд╡рд░ рдХреА рд╕рд╛рдордЧреНрд░реА рдХреЛ рдЗрд╕рдХреЗ рд╕рд╛рде рдмрджрд▓реЗрдВ:
рдХреЛрдб
 #import "Tower.h" @implementation Tower @synthesize mySprite,theGame; +(id) nodeWithTheGame:(HelloWorldLayer*)_game location:(CGPoint)location { return [[[self alloc] initWithTheGame:_game location:location] autorelease]; } -(id) initWithTheGame:(HelloWorldLayer *)_game location:(CGPoint)location { if( (self=[super init])) { theGame = _game; attackRange = 70; damage = 10; fireRate = 1; mySprite = [CCSprite spriteWithFile:@"tower.png"]; [self addChild:mySprite]; [mySprite setPosition:location]; [theGame addChild:self]; [self scheduleUpdate]; } return self; } -(void)update:(ccTime)dt { } -(void)draw { glColor4f(255, 255, 255, 255); ccDrawCircle(mySprite.position, attackRange, 360, 30, false); [super draw]; } -(void)dealloc { [super dealloc]; } @end 

рдЯреЙрд╡рд░ рд╡рд░реНрдЧ рдореЗрдВ рдХрдИ рдЪрд░ рд╣реЛрддреЗ рд╣реИрдВ: рдПрдХ рд╕реНрдкреНрд░рд╛рдЗрдЯ рдЯреЙрд╡рд░ рдХрд╛ рдПрдХ рджреГрд╢реНрдп рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рд╣реИ, рдЖрд╕рд╛рди рдкрд╣реБрдВрдЪ рдХреЗ рд▓рд┐рдП рдореВрд▓ рдкрд░рдд рдХреЗ рд▓рд┐рдП рдПрдХ рд▓рд┐рдВрдХ рд╣реИ, рдФрд░ рддреАрди рдЪрд░ рд╣реИрдВ:

рдЗрди рддреАрди рдЪрд░ рдХреЗ рд╕рд╛рде, рдЖрдк рд╡рд┐рднрд┐рдиреНрди рдкреНрд░рдХрд╛рд░ рдХреЗ рд╣рдорд▓реЛрдВ рдХреЗ рд╕рд╛рде рд╡рд┐рд╢рд╛рд▓ рдкреНрд░рдХрд╛рд░ рдХреЗ рдЯреЙрд╡рд░ рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВред рдФрд░ рдЕрдВрдд рдореЗрдВ, рдХреЛрдб рдореЗрдВ рдкрд░реАрдХреНрд╖рдг рдореЗрдВ рдЖрд╕рд╛рдиреА рдХреЗ рд▓рд┐рдП рдПрдХ рдЯреЙрд╡рд░ рдХреЗ рд╣рдорд▓реЗ рдХреЗ рддреНрд░рд┐рдЬреНрдпрд╛ рдХрд╛ рдкреНрд░рддрд┐рдкрд╛рджрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╡рд┐рдзрд┐ рд╣реИред
рдпрд╣ рдЦрд┐рд▓рд╛рдбрд╝реА рдХреЛ рдЯрд╛рд╡рд░ рдЬреЛрдбрд╝рдиреЗ рджреЗрдиреЗ рдХрд╛ рд╕рдордп рд╣реИ!
HelloWorldLayer.m рдЦреЛрд▓реЗрдВ рдФрд░ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдкрд░рд┐рд╡рд░реНрддрди рдХрд░реЗрдВ:
рдХреЛрдб
 //  : #import "Tower.h" //dealloc: [towers release]; //  dealloc   : -(BOOL)canBuyTower { return YES; } - (void)ccTouchesBegan:(NSSet *)touches withEvent:(UIEvent *)event { for( UITouch *touch in touches ) { CGPoint location = [touch locationInView: [touch view]]; location = [[CCDirector sharedDirector] convertToGL: location]; for(CCSprite * tb in towerBases) { if([self canBuyTower] && CGRectContainsPoint([tb boundingBox],location) && !tb.userData) { //    . Tower * tower = [Tower nodeWithTheGame:self location:tb.position]; [towers addObject:tower]; tb.userData = tower; } } } } 

ccTouchesBegan : рд╕реНрдХреНрд░реАрди рдЯрдЪ рдХреЛ рдХреИрдкреНрдЪрд░ рдХрд░рддрд╛ рд╣реИред рдХреЛрдб рддрдм рдЯреЙрд╡рд░ рдмреЗрд╕ рд╕рд░рдгреА рдкрд░ рдкреБрдирд░рд╛рд╡реГрддреНрдд рд╣реЛрддрд╛ рд╣реИ рдФрд░ рдпрд╣ рджреЗрдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдЬрд╛рдВрдЪрддрд╛ рд╣реИ рдХрд┐ рдХреНрдпрд╛ рдЯреЙрд╡рд░ рдмреЗрд╕ рдореЗрдВ рд╕реЗ рдХрд┐рд╕реА рдореЗрдВ рд╕реНрдкрд░реНрд╢ рдмрд┐рдВрджреБ рд╣реИред
рд▓реЗрдХрд┐рди рдЗрд╕рд╕реЗ рдкрд╣рд▓реЗ рдХрд┐ рдЯрд╛рд╡рд░реЛрдВ рдХреЛ рдмрдирд╛рдпрд╛ рдЬрд╛ рд╕рдХреЗ, рдЖрдкрдХреЛ рджреЛ рдЪреАрдЬреЛрдВ рдХреА рдЬрд╛рдВрдЪ рдХрд░рдиреА рд╣реЛрдЧреА:
  1. рдХреНрдпрд╛ рдХреЛрдИ рдЦрд┐рд▓рд╛рдбрд╝реА рдЗрд╕ рддрд░рд╣ рдХреА рдЦреБрд╢реА рджреЗ рд╕рдХрддрд╛ рд╣реИ? CanBuyTower рд╡рд┐рдзрд┐ рдпрд╣ рдЬрд╛рдВрдЪ рдХрд░реЗрдЧреА рдХрд┐ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рдкрд╛рд╕ рдЯрд╛рд╡рд░ рдЦрд░реАрджрдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд╕реЛрдирд╛ рд╣реИ рдпрд╛ рдирд╣реАрдВред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдЗрд╕ рд╕рдордп, рдЦрд┐рд▓рд╛рдбрд╝реА рдХреЗ рдкрд╛рд╕ рдлреЛрд░реНрдЯ рдиреЙрдХреНрд╕ рдХрд╛ рд╕рд╛рд░рд╛ рд╕реЛрдирд╛ рд╣реИ рдФрд░ рдпрд╣ рд╡рд┐рдзрд┐ рд╣рдореЗрд╢рд╛ YES рдХреЛ рд▓реМрдЯрд╛рдПрдЧреАред
  2. рдХреНрдпрд╛ рдЦрд┐рд▓рд╛рдбрд╝реА рдирд┐рд░реНрдорд╛рдг рдХреЗ рдирд┐рдпрдореЛрдВ рдХрд╛ рдЙрд▓реНрд▓рдВрдШрди рдХрд░рддрд╛ рд╣реИ? рдпрджрд┐ tb.UserData рдирд┐рд░реНрджрд┐рд╖реНрдЯ рд╣реИ, рддреЛ рдПрдХ рдЯреЙрд╡рд░ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЙрд╕ рдЬрдЧрд╣ рдкрд░ рдЦрдбрд╝рд╛ рд╣реИ рдФрд░ рдЖрдк рдПрдХ рдирдпрд╛ рдирд┐рд░реНрдорд╛рдг рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

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

рдЫрд╡рд┐
рд▓реЗрдХрд┐рди "рдмрджрдорд╛рд╢реЛрдВ" рдХреЗ рдмрд┐рдирд╛ рдпрд╣ рд╕рдм рд╣рдерд┐рдпрд╛рд░ рдХреНрдпреЛрдВ, рдЪрд▓реЛ рдЙрдиреНрд╣реЗрдВ рдкрд╛рд░реНрдЯреА рдореЗрдВ рдмреБрд▓рд╛рдУ!

рдЦреЗрд▓ рдиреАрддрд┐: рджреБрд╢реНрдорди, рд▓рд╣рд░реЗрдВ рдФрд░ рд░рд╛рд╕реНрддреЗ

рдЗрд╕рд╕реЗ рдкрд╣рд▓реЗ рдХрд┐ рд╣рдо рджреБрд╢реНрдорди рдкреИрджрд╛ рдХрд░реЗрдВ, рдЪрд▓реЛ рдЙрдирдХреЗ рд▓рд┐рдП рдорд╛рд░реНрдЧ рдкреНрд░рд╢рд╕реНрдд рдХрд░реЗрдВред рджреБрд╢реНрдорди рдорд╛рд░реНрдЧ рд╕реЗ рдорд╛рд░реНрдЧ рдХрд╛ рдЕрдиреБрд╕рд░рдг рдХрд░реЗрдВрдЧреЗ, рдЬреЛ рдЕрдирд┐рд╡рд╛рд░реНрдп рд░реВрдк рд╕реЗ рдРрд╕реЗ рдмрд┐рдВрджреБ рд╣реИрдВ рдЬреЛ рдЖрдкрд╕ рдореЗрдВ рдЬреБрдбрд╝реЗ рд╣реБрдП рд╣реИрдВ рдФрд░ рдЖрдкрдХреА рджреБрдирд┐рдпрд╛ рдореЗрдВ рджреБрд╢реНрдордиреЛрдВ рдХреА рдЖрд╡рд╛рдЬрд╛рд╣реА рдХрд╛ рдорд╛рд░реНрдЧ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рддреЗ рд╣реИрдВред рджреБрд╢реНрдорди рдкрд╣рд▓реЗ рд╡реЗрдкреЙрдЗрдВрдЯ рдкрд░ рджрд┐рдЦрд╛рдИ рджреЗрдВрдЧреЗ, рд╕реВрдЪреА рдореЗрдВ рдЕрдЧрд▓реЗ рдХреА рддрд▓рд╛рд╢ рдХрд░реЗрдВрдЧреЗ, рдЗрд╕реЗ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░реЗрдВрдЧреЗ, рдФрд░ рдЗрд╕рд▓рд┐рдП рдпрд╣ рддрдм рддрдХ рджреЛрд╣рд░рд╛рдПрдЧрд╛ рдЬрдм рддрдХ рдХрд┐ рд╡реЗ рдЕрдВрддрд┐рдо рддрдХ рдирд╣реАрдВ рдкрд╣реБрдВрдЪрддреЗ - рдЖрдкрдХрд╛ рдЖрдзрд╛рд░! рдРрд╕рд╛ рд╣реЛрдиреЗ рдкрд░ рдЖрдкрдХреЛ рдиреБрдХрд╕рд╛рди рд╣реЛрдЧрд╛ред
IOS \ рдХреЛрдХреЛ рдЯрдЪ \ рдСрдмреНрдЬреЗрдХреНрдЯрд┐рд╡-рд╕реА рдХреНрд▓рд╛рд╕ рдЯреЗрдореНрдкрд▓реЗрдЯ рд╕реЗ рдПрдХ рдирдИ рдлрд╝рд╛рдЗрд▓ рдмрдирд╛рдХрд░ рд╡реЗрдкрд╛рдЗрдВрдЯреНрд╕ рдХреА рдПрдХ рд╕реВрдЪреА рдмрдирд╛рдПрдВред рд╡реЗрдкреЙрдЗрдВрдЯ рдХреНрд▓рд╛рд╕ рдХреЛ рдирд╛рдо рджреЗрдВ рдФрд░ рдЗрд╕реЗ CCNode рдХрд╛ рдЙрдкрд╡рд░реНрдЧ рдмрдирд╛рдПрдВ ред
рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХреЗ рд╕рд╛рде Waypoint.h рдХреА рд╕рд╛рдордЧреНрд░реА рдХреЛ рдмрджрд▓реЗрдВ:
рдХреЛрдб
 #import "cocos2d.h" #import "HelloWorldLayer.h" @interface Waypoint: CCNode { HelloWorldLayer *theGame; } @property (nonatomic,readwrite) CGPoint myPosition; @property (nonatomic,assign) Waypoint *nextWaypoint; +(id)nodeWithTheGame:(HelloWorldLayer*)_game location:(CGPoint)location; -(id)initWithTheGame:(HelloWorldLayer *)_game location:(CGPoint)location; @end 

рдЕрдЧрд▓рд╛, Waypoint.m рдХреА рд╕рд╛рдордЧреНрд░реА рдХреЛ рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрд┐рдд рдХрд░реЗрдВ:
рдХреЛрдб
 #import "Waypoint.h" @implementation Waypoint @synthesize myPosition, nextWaypoint; +(id)nodeWithTheGame:(HelloWorldLayer*)_game location:(CGPoint)location { return [[[self alloc] initWithTheGame:_game location:location] autorelease]; } -(id)initWithTheGame:(HelloWorldLayer *)_game location:(CGPoint)location { if( (self=[super init])) { theGame = _game; [self setPosition:CGPointZero]; myPosition = location; [theGame addChild:self]; } return self; } -(void)draw { glColor4f(0, 255, 0, 255); ccDrawCircle(myPosition, 6, 360, 30, false); ccDrawCircle(myPosition, 2, 360, 30, false); if(nextWaypoint) ccDrawLine(myPosition, nextWaypoint.myPosition); [super draw]; } -(void)dealloc { [super dealloc]; } @end 

рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдХреЛрдб рдПрдХ waypoint рдСрдмреНрдЬреЗрдХреНрдЯ рдмрдирд╛рддрд╛ рд╣реИ, HelloWorldLayer рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рд╕рдВрджрд░реНрднрд┐рдд рдХрд░рддрд╛ рд╣реИ рдФрд░ CGPoint рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддрд╛ рд╣реИ, рдЬреЛ рдХрд┐ waypoint рдХреА рд╕реНрдерд┐рддрд┐ рд╣реИред
рдкреНрд░рддреНрдпреЗрдХ рд╡реЗрдкреЙрдЗрдВрдЯ рдореЗрдВ рдЕрдЧрд▓реЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд▓рд┐рдВрдХ рд╣реЛрддрд╛ рд╣реИ, рдпрд╣ рд╡реЗрдкреЙрдЗрдВрдЯ рдХреА рдПрдХ рд▓рд┐рдВрдХреНрдб рд╕реВрдЪреА рдмрдирд╛рддрд╛ рд╣реИред рдкреНрд░рддреНрдпреЗрдХ рд╡реЗрдкреЙрдЗрдВрдЯ рд╕реВрдЪреА рдореЗрдВ "рдкрддрд╛" рдХрд░рддрд╛ рд╣реИред рдЗрд╕ рддрд░рд╣, рдЖрдк рджреБрд╢реНрдордиреЛрдВ рдХреЛ рдЙрдирдХреЗ рдЕрдВрддрд┐рдо рд▓рдХреНрд╖реНрдп рддрдХ рд▓реЗ рдЬрд╛ рд╕рдХрддреЗ рд╣реИрдВ рдЬреЛ рд╡реЗрдкреЙрдЗрдВрдЯ рдХреА рд╢реНрд░реГрдВрдЦрд▓рд╛ рдХреЗ рд╕рд╛рде рдЖрдЧреЗ рдмрдврд╝ рд░рд╣реЗ рд╣реИрдВред
рдЕрдВрдд рдореЗрдВ, рд░реЗрдВрдбрд░рд┐рдВрдЧ рд╡рд┐рдзрд┐ рд╣рдореЗрдВ рджрд┐рдЦрд╛рддреА рд╣реИ рдХрд┐ рд╡реЗрдкрд╛рдЗрдВрдЯреНрд╕ рдХрд╣рд╛рдБ рд╣реИрдВ рдФрд░ рдкрд░реАрдХреНрд╖рдг рдЙрджреНрджреЗрд╢реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рдЙрдирдХреЗ рдмреАрдЪ рдПрдХ рдХрдиреЗрдХреНрд╢рди рд░реЗрдЦрд╛ рдЦреАрдВрдЪрддрд╛ рд╣реИред
Waypoint рдХреА рдПрдХ рд╕реВрдЪреА рдмрдирд╛рдПрдБред HelloWorldLayer.h рдЦреЛрд▓реЗрдВ рдФрд░ рдирд┐рдореНрди рдЪрд░ рдЬреЛрдбрд╝реЗрдВ:
рдХреЛрдб
 @property (nonatomic,retain) NSMutableArray *waypoints; 

HelloWorldLayer.m рдХреЗ рд▓рд┐рдП рдирд┐рдореНрди рдХреЛрдб рдЬреЛрдбрд╝реЗрдВ:

 //   : #import "Waypoint.h" //  synthesise @synthesize waypoints; //    init -(void)addWaypoints { waypoints = [[NSMutableArray alloc] init]; Waypoint * waypoint1 = [Waypoint nodeWithTheGame:self location:ccp(420,35)]; [waypoints addObject:waypoint1]; Waypoint * waypoint2 = [Waypoint nodeWithTheGame:self location:ccp(35,35)]; [waypoints addObject:waypoint2]; waypoint2.nextWaypoint =waypoint1; Waypoint * waypoint3 = [Waypoint nodeWithTheGame:self location:ccp(35,130)]; [waypoints addObject:waypoint3]; waypoint3.nextWaypoint =waypoint2; Waypoint * waypoint4 = [Waypoint nodeWithTheGame:self location:ccp(445,130)]; [waypoints addObject:waypoint4]; waypoint4.nextWaypoint =waypoint3; Waypoint * waypoint5 = [Waypoint nodeWithTheGame:self location:ccp(445,220)]; [waypoints addObject:waypoint5]; waypoint5.nextWaypoint =waypoint4; Waypoint * waypoint6 = [Waypoint nodeWithTheGame:self location:ccp(-40,220)]; [waypoints addObject:waypoint6]; waypoint6.nextWaypoint =waypoint5; } //    init: // 4 - Add waypoints [self addWaypoints]; // dealloc [waypoints release]; 

рдЦреЗрд▓ рдХреЛ рд╕рдВрдХрд▓рд┐рдд рдХрд░реЗрдВ рдФрд░ рдЪрд▓рд╛рдПрдВ:

рдЫрд╡рд┐

рдирдХреНрд╢реЗ рдкрд░ рдЫрд╣ рддрд░реАрдХреЗ рд╣реИрдВ, рджреБрд╢реНрдорди рдЗрд╕ рдкрде рдХрд╛ рдЕрдиреБрд╕рд░рдг рдХрд░реЗрдВрдЧреЗред рдЗрд╕рд╕реЗ рдкрд╣рд▓реЗ рдХрд┐ рдЖрдк рдЕрдкрдиреЗ рджреЛрд╕реНрддреЛрдВ рдХреЛ рдЧреЗрдо рдЦреЛрдиреЗ рджреЗрдВ, рдЖрдкрдХреЛ рдХреБрдЫ рд╕рд╣рд╛рдпрдХ рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЛ рдЬреЛрдбрд╝рдирд╛ рд╣реЛрдЧрд╛ред
рдЖрд░рдВрдн рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣реЗрдбрд░ рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рд╡рд┐рдзрд┐рдпреЛрдВ рдХрд╛ рд╡рд┐рд╡рд░рдг рдЬреЛрдбрд╝реЗрдВ рддрд╛рдХрд┐ рдЕрдиреНрдп рд╡рд░реНрдЧ рдХрдВрдкрд╛рдЗрд▓рд░ рд╕реЗ рдЪреЗрддрд╛рд╡рдиреА рдХреЗ рдмрд┐рдирд╛ рдЗрди рд╡рд┐рдзрд┐рдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХреЗрдВред
HelloWorldLayer.h рдЦреЛрд▓реЗрдВ рдФрд░ " рд╕рдорд╛рдкреНрддрд┐ " рдкрдВрдХреНрддрд┐ рд╕реЗ рдкрд╣рд▓реЗ рдирд┐рдореНрди рд╡рд┐рдзрд┐ рд╡рд┐рд╡рд░рдг рдЬреЛрдбрд╝реЗрдВ:
рдХреЛрдб
 -(BOOL)circle:(CGPoint)circlePoint withRadius:(float)radius collisionWithCircle:(CGPoint)circlePointTwo collisionCircleRadius:(float)radiusTwo; void ccFillPoly(CGPoint *poli, int points, BOOL closePolygon); 

рдЗрд╕рдХреЗ рдмрд╛рдж, HelloWorldLayer.m рдЦреЛрд▓реЗрдВ рдФрд░ рдлрд╝рд╛рдЗрд▓ рдХреЗ рдЕрдВрдд рдореЗрдВ ( рдЕрдВрдд рд╕реЗ рдкрд╣рд▓реЗ) рдирд┐рдореНрди рдкрдВрдХреНрддрд┐рдпрд╛рдБ рдЬреЛрдбрд╝реЗрдВ:

 void ccFillPoly( CGPoint *poli, int points, BOOL closePolygon ) { //   GL: GL_TEXTURE_2D, GL_VERTEX_ARRAY, GL_COLOR_ARRAY, GL_TEXTURE_COORD_ARRAY //  : GL_VERTEX_ARRAY, //  : GL_TEXTURE_2D, GL_TEXTURE_COORD_ARRAY, GL_COLOR_ARRAY glDisable(GL_TEXTURE_2D); glDisableClientState(GL_TEXTURE_COORD_ARRAY); glDisableClientState(GL_COLOR_ARRAY); glVertexPointer(2, GL_FLOAT, 0, poli); if( closePolygon ) glDrawArrays(GL_TRIANGLE_FAN, 0, points); else glDrawArrays(GL_LINE_STRIP, 0, points); // restore default state glEnableClientState(GL_COLOR_ARRAY); glEnableClientState(GL_TEXTURE_COORD_ARRAY); glEnable(GL_TEXTURE_2D); } -(BOOL)circle:(CGPoint) circlePoint withRadius:(float) radius collisionWithCircle:(CGPoint) circlePointTwo collisionCircleRadius:(float) radiusTwo { float xdif = circlePoint.x - circlePointTwo.x; float ydif = circlePoint.y - circlePointTwo.y; float distance = sqrt(xdif*xdif+ydif*ydif); if(distance <= radius+radiusTwo) return YES; return NO; } 

рдЯрдХрд░рд╛рдиреЗ рдХреА рд╡рд┐рдзрд┐ рдЬрдм рджреЛ рд╕рд░реНрдХрд▓ рдЯрдХрд░рд╛рддреА рд╣реИ рдпрд╛ рдХрд╛рдЯрддреА рд╣реИ рддреЛ рд╣рдореЗрдВ рдкрддрд╛ рд▓рдЧрд╛рдиреЗ рдореЗрдВ рдорджрдж рдХрд░реЗрдЧреАред рдЗрд╕рд╕реЗ рдпрд╣ рд╕рдордЭрдиреЗ рдореЗрдВ рдорджрдж рдорд┐рд▓реЗрдЧреА рдХрд┐ рдХреНрдпрд╛ рджреБрд╢реНрдорди рд░рд╛рд╕реНрддреЗ рдореЗрдВ рдкрд╣реБрдВрдЪ рдЧрдпрд╛ рд╣реИ, рд╕рд╛рде рд╣реА рд╕рд╛рде рдЯреЙрд╡рд░ рдХреЗ рд╣рдорд▓реЗ рдХреА рддреНрд░рд┐рдЬреНрдпрд╛ рдХреЗ рднреАрддрд░ рджреБрд╢реНрдордиреЛрдВ рдХреА рдкрд╣рдЪрд╛рди рдХрд░рддрд╛ рд╣реИред
CcFillPoly рд╡рд┐рдзрд┐ OpenGL рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рднрд░реЗ рд╣реБрдП рдмрд╣реБрднреБрдЬ рдЦреАрдВрдЪрддреА рд╣реИред Cocos2d рдореЗрдВ, рдЖрдк рдХреЗрд╡рд▓ рдЦрд╛рд▓реА рдмрд╣реБрднреБрдЬ рдЦреАрдВрдЪ рд╕рдХрддреЗ рд╣реИрдВред CcFillPoly рд╡рд┐рдзрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рджреБрд╢реНрдорди рдХреЗ рд╕реНрд╡рд╛рд╕реНрдереНрдп рд╕рд▓рд╛рдЦреЛрдВ рдХреЛ рдЦреАрдВрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред
рдпрд╣ рджреБрд╢реНрдордиреЛрдВ рдХреЛ рдЬрд╛рдиреЗ рджреЗрдиреЗ рдХрд╛ рд╕рдордп рд╣реИред
HelloWorldLayer.h рдЦреЛрд▓реЗрдВ рдФрд░ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХреЛрдб рдЬреЛрдбрд╝реЗрдВ:
рдХреЛрдб
 //    int wave; CCLabelBMFont *ui_wave_lbl; //    property @property (nonatomic,retain) NSMutableArray *enemies; 

HelloWorldLayer.m рдХреЗ рд▓рд┐рдП рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдкрд░рд┐рд╡рд░реНрддрди рдХрд░реЗрдВ:

 // Synthesize enemies @synthesize enemies; //  dealloc [enemies release]; 

рдпрд╣ рдПрдХ рд╡рд░реНрдЧ рдмрдирд╛рдиреЗ рдХрд╛ рд╕рдордп рд╣реИ рдЬрд┐рд╕рдореЗрдВ рджреБрд╢реНрдордиреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕рднреА рдЬрд╛рдирдХрд╛рд░реА рд╣реЛрдЧреА рдФрд░ рд╕реНрдХреНрд░реАрди рдкрд░ рдЙрдирдХреЗ рдЖрдВрджреЛрд▓рди рдХреЛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдПрдХ рдирдпрд╛ iOS \ рдХреЛрдХреЛ рдЯрдЪ \ Objective-C рдлрд╝рд╛рдЗрд▓ рдмрдирд╛рдПрдБред рд╡рд░реНрдЧ рд╢рддреНрд░реБ рдХрд╛ рдирд╛рдо рдмрддрд╛рдПрдВ рдФрд░ рдЗрд╕реЗ CCNode рдХрд╛ рдЙрдкрд╡рд░реНрдЧ рдмрдирд╛рдПрдВ ред
Enemy.h рдХреА рд╕рд╛рдордЧреНрд░реА рдХреЛ рдмрджрд▓реЗрдВ:
рдХреЛрдб
 #import "cocos2d.h" #import "HelloWorldLayer.h" #import "GameConfig.h" @class HelloWorldLayer, Waypoint, Tower; @interface Enemy: CCNode { CGPoint myPosition; int maxHp; int currentHp; float walkingSpeed; Waypoint *destinationWaypoint; BOOL active; } @property (nonatomic,assign) HelloWorldLayer *theGame; @property (nonatomic,assign) CCSprite *mySprite; +(id)nodeWithTheGame:(HelloWorldLayer*)_game; -(id)initWithTheGame:(HelloWorldLayer *)_game; -(void)doActivate; -(void)getRemoved; @end 

рдЕрдм рджреБрд╢реНрдорди рдХреА рд╕рд╛рдордЧреНрд░реАред
рдХреЛрдб
 #import "Enemy.h" #import "Tower.h" #import "Waypoint.h" #import "SimpleAudioEngine.h" #define HEALTH_BAR_WIDTH 20 #define HEALTH_BAR_ORIGIN -10 @implementation Enemy @synthesize mySprite, theGame; +(id)nodeWithTheGame:(HelloWorldLayer*)_game { return [[[self alloc] initWithTheGame:_game] autorelease]; } -(id)initWithTheGame:(HelloWorldLayer *)_game { if ((self=[super init])) { theGame = _game; maxHp = 40; currentHp = maxHp; active = NO; walkingSpeed = 0.5; mySprite = [CCSprite spriteWithFile:@"enemy.png"]; [self addChild:mySprite]; Waypoint * waypoint = (Waypoint *)[theGame.waypoints objectAtIndex:([theGame.waypoints count]-1)]; destinationWaypoint = waypoint.nextWaypoint; CGPoint pos = waypoint.myPosition; myPosition = pos; [mySprite setPosition:pos]; [theGame addChild:self]; [self scheduleUpdate]; } return self; } -(void)doActivate { active = YES; } -(void)update:(ccTime)dt { if(!active)return; if([theGame circle:myPosition withRadius:1 collisionWithCircle:destinationWaypoint.myPosition collisionCircleRadius:1]) { if(destinationWaypoint.nextWaypoint) { destinationWaypoint = destinationWaypoint.nextWaypoint; }else { //  .    [theGame getHpDamage]; [self getRemoved]; } } CGPoint targetPoint = destinationWaypoint.myPosition; float movementSpeed = walkingSpeed; CGPoint normalized = ccpNormalize(ccp(targetPoint.x-myPosition.x,targetPoint.y-myPosition.y)); mySprite.rotation = CC_RADIANS_TO_DEGREES(atan2(normalized.y,-normalized.x)); myPosition = ccp(myPosition.x+normalized.x * movementSpeed,myPosition.y+normalized.y * movementSpeed); [mySprite setPosition:myPosition]; } -(void)getRemoved { [self.parent removeChild:self cleanup:YES]; [theGame.enemies removeObject:self]; //              [theGame enemyGotKilled]; } -(void)draw { glColor4f(255, 0, 0, 255); CGPoint healthBarBack[] = {ccp(mySprite.position.x -10,mySprite.position.y+16),ccp(mySprite.position.x+10,mySprite.position.y+16),ccp(mySprite.position.x+10,mySprite.position.y+14),ccp(mySprite.position.x-10,mySprite.position.y+14)}; ccFillPoly(healthBarBack, 4, YES); glColor4f(0, 255, 0, 255); CGPoint healthBar[] = {ccp(mySprite.position.x + HEALTH_BAR_ORIGIN,mySprite.position.y+16),ccp(mySprite.position.x+HEALTH_BAR_ORIGIN+(float)(currentHp * HEALTH_BAR_WIDTH) / maxHp,mySprite.position.y+16),ccp(mySprite.position.x+HEALTH_BAR_ORIGIN+(float)(currentHp * HEALTH_BAR_WIDTH) / maxHp,mySprite.position.y+14),ccp(mySprite.position.x+HEALTH_BAR_ORIGIN,mySprite.position.y+14)}; ccFillPoly(healthBar, 4, YES); } -(void)dealloc { [super dealloc]; } @end 

рдпрд╣ рдХреЛрдб рдХрд╛ рдПрдХ рдкреНрд░рднрд╛рд╡рд╢рд╛рд▓реА рдЯреБрдХрдбрд╝рд╛ рд╣реИ, рд▓реЗрдХрд┐рди рд╕рдордЭрдиреЗ рдореЗрдВ рдЖрд╕рд╛рди рд╣реИред рдПрдХ рджреБрд╢реНрдорди рдкрд╣рд▓реЗ рдмрдирд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬрдм HelloWorldLayer рдЗрд╕реЗ рд╕рдВрджрд░реНрднрд┐рдд рдХрд░рддрд╛ рд╣реИред рдЗрдирд┐рдЯ рд╡рд┐рдзрд┐ рдХреЗ рдЕрдВрджрд░ рдХрдИ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдЪрд░ рд╣реИрдВ:

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

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

 -(void)enemyGotKilled; 

HelloWorldLayer.m рдкрд░ рд╕реНрд╡рд┐рдЪ рдХрд░реЗрдВ рдФрд░ рд╡рд┐рдзрд┐ рдХрд╛ рд╡рд░реНрдгрди рдХрд░реЗрдВ:
рдХреЛрдб
 // : #import "Enemy.h" //  init: -(BOOL)loadWave { NSString* plistPath = [[NSBundle mainBundle] pathForResource:@"Waves" ofType:@"plist"]; NSArray * waveData = [NSArray arrayWithContentsOfFile:plistPath]; if(wave >= [waveData count]) { return NO; } NSArray * currentWaveData =[NSArray arrayWithArray:[waveData objectAtIndex:wave]]; for(NSDictionary * enemyData in currentWaveData) { Enemy * enemy = [Enemy nodeWithTheGame:self]; [enemies addObject:enemy]; [enemy schedule:@selector(doActivate) interval:[[enemyData objectForKey:@"spawnTime"]floatValue]]; } wave++; [ui_wave_lbl setString:[NSString stringWithFormat:@"WAVE: %d",wave]]; return YES; } -(void)enemyGotKilled { if ([enemies count]<=0) //If there are no more enemies. { if(![self loadWave]) { NSLog(@"You win!"); [[CCDirector sharedDirector] replaceScene:[CCTransitionSplitCols transitionWithDuration:1 scene:[HelloWorldLayer scene]]]; } } } //   init: // 5 -   enemies = [[NSMutableArray alloc] init]; [self loadWave]; // 6 -      ui_wave_lbl = [CCLabelBMFont labelWithString:[NSString stringWithFormat:@"WAVE: %d",wave] fntFile:@"font_red_14.fnt"]; [self addChild:ui_wave_lbl z:10]; [ui_wave_lbl setPosition:ccp(400,wins.height-12)]; [ui_wave_lbl setAnchorPoint:ccp(0,0.5)]; 

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

рдЫрд╡рд┐

рдЯреЙрд╡рд░ рдкрд░ рд╣рдорд▓рд╛

рдЬрдЧрд╣-рдЬрдЧрд╣ рд▓рдЧреЗ рдЯрд╛рд╡рд░? рдЗрд╕реЗ рджреЗрдЦреЗрдВред рдХреНрдпрд╛ рджреБрд╢реНрдорди рд╣рд┐рд▓рддреЗ рд╣реИрдВ? рдореЗрдВ рджреЗрдЦреЗрдВ! рдЗрди рд╡рд┐рджреНрд░реЛрд╣рд┐рдпреЛрдВ рдХреЛ рднрдбрд╝рдХрд╛рдиреЗ рдХрд╛ рд╕рдордп рдЖ рдЧрдпрд╛ рд╣реИред
рдкреНрд░рддреНрдпреЗрдХ рдЯреЙрд╡рд░ рдпрд╣ рдЬрд╛рдВрдЪрддрд╛ рд╣реИ рдХрд┐ рдЙрд╕рдХреА рд╣рд╛рд░ рдХреЗ рджрд╛рдпрд░реЗ рдореЗрдВ рдХреЛрдИ рджреБрд╢реНрдорди рд╣реИ рдпрд╛ рдирд╣реАрдВред рдпрджрд┐ рдРрд╕рд╛ рд╣реИ, рддреЛ рдЯреЙрд╡рд░ рдЙрд╕ рдкрд░ рддрдм рддрдХ рдЧреЛрд▓реАрдмрд╛рд░реА рд╢реБрд░реВ рдХрд░рддрд╛ рд╣реИ рдЬрдм рддрдХ рдХрд┐ рджреЛ рдЪреАрдЬреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИ: рджреБрд╢реНрдорди рдкрд╣реБрдВрдЪ рд╕реЗ рдмрд╛рд╣рд░ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ, рдпрд╛ рджреБрд╢реНрдорди рдирд╖реНрдЯ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИред рдлрд┐рд░ рдЯреЙрд╡рд░ рдПрдХ рдирдП рд╢рд┐рдХрд╛рд░ рдХреА рддрд▓рд╛рд╢ рд╢реБрд░реВ рдХрд░ рджреЗрдЧрд╛ред
рдЪрд▓реЛ рдЖрдзрд╛рд░ рдХрд╛ рдмрдЪрд╛рд╡ рдХрд░рдирд╛ рд╢реБрд░реВ рдХрд░реЗрдВ!
Tower.h рдЦреЛрд▓реЗрдВ рдФрд░ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдкрд░рд┐рд╡рд░реНрддрди рдХрд░реЗрдВ:
рдХреЛрдб
 //    BOOL attacking; Enemy *chosenEnemy; //    -(void)targetKilled; 

рдЯреЙрд╡рд░ рдЯреЙрд╡рд░ рдореЗрдВ рдЕрдм:

 //   Enemy  #import "Enemy.h" //     init: -(void)attackEnemy { [self schedule:@selector(shootWeapon) interval:fireRate]; } -(void)chosenEnemyForAttack:(Enemy *)enemy { chosenEnemy = nil; chosenEnemy = enemy; [self attackEnemy]; [enemy getAttacked:self]; } -(void)shootWeapon { CCSprite * bullet = [CCSprite spriteWithFile:@"bullet.png"]; [theGame addChild:bullet]; [bullet setPosition:mySprite.position]; [bullet runAction:[CCSequence actions:[CCMoveTo actionWithDuration:0.1 position:chosenEnemy.mySprite.position],[CCCallFunc actionWithTarget:self selector:@selector(damageEnemy)],[CCCallFuncN actionWithTarget:self selector:@selector(removeBullet:)], nil]]; } -(void)removeBullet:(CCSprite *)bullet { [bullet.parent removeChild:bullet cleanup:YES]; } -(void)damageEnemy { [chosenEnemy getDamaged:damage]; } -(void)targetKilled { if(chosenEnemy) chosenEnemy =nil; [self unschedule:@selector(shootWeapon)]; } -(void)lostSightOfEnemy { [chosenEnemy gotLostSight:self]; if(chosenEnemy) chosenEnemy =nil; [self unschedule:@selector(shootWeapon)]; } 

рдЕрдВрдд рдореЗрдВ, рдЦрд╛рд▓реА рдЕрдкрдбреЗрдЯ рд╡рд┐рдзрд┐ рдХреЛ рдЗрд╕рдХреЗ рд╕рд╛рде рдмрджрд▓реЗрдВ:
рдХреЛрдб
 -(void)update:(ccTime)dt { if (chosenEnemy){ //       CGPoint normalized = ccpNormalize(ccp(chosenEnemy.mySprite.position.x-mySprite.position.x,chosenEnemy.mySprite.position.y-mySprite.position.y)); mySprite.rotation = CC_RADIANS_TO_DEGREES(atan2(normalized.y,-normalized.x))+90; if(![theGame circle:mySprite.position withRadius:attackRange collisionWithCircle:chosenEnemy.mySprite.position collisionCircleRadius:1]) { [self lostSightOfEnemy]; } } else { for(Enemy * enemy in theGame.enemies) { if([theGame circle:mySprite.position withRadius:attackRange collisionWithCircle:enemy.mySprite.position collisionCircleRadius:1]) { [self chosenEnemyForAttack:enemy]; break; } } } } 

рдмрд╣реБрдд рдХреЛрдб рд╣реИред рд╕рд╛рде рд╣реА, рдЖрдкрдиреЗ рд╕рдВрднрд╡рддрдГ рдХреЛрдб рдЬреЛрдбрд╝рддреЗ рд╕рдордп рд╕рдВрдХрд▓рдХ рд╕реЗ рдЪреЗрддрд╛рд╡рдиреА рдХреА рдмрдврд╝рддреА рд╕рдВрдЦреНрдпрд╛ рджреЗрдЦреАред рдкрд╣рд▓реЗ, рдЖрдЗрдП рдХреБрдЫ рдЧреБрдо рдмрд┐рдЯреНрд╕ рдХреЛ рдЬреЛрдбрд╝рдХрд░ рдЪреЗрддрд╛рд╡рдирд┐рдпреЛрдВ рд╕реЗ рдирд┐рдкрдЯреЗрдВред
Enemy.h рдЦреЛрд▓реЗрдВ рдФрд░ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдкрд░рд┐рд╡рд░реНрддрди рдХрд░реЗрдВ:
рдХреЛрдб
 //  NSMutableArray *attackedBy; //    -(void)getAttacked:(Tower *)attacker; -(void)gotLostSight:(Tower *)attacker; -(void)getDamaged:(int)damage; 

рдЕрдм рджреБрд╢реНрдорди рдореЗрдВ :
рдХреЛрдб
 //     initWithTheGame: (  "if") attackedBy = [[NSMutableArray alloc] initWithCapacity:5]; //   getRemoved: -(void)getRemoved { for(Tower * attacker in attackedBy) { [attacker targetKilled]; } [self.parent removeChild:self cleanup:YES]; [theGame.enemies removeObject:self]; // ,       ,      [theGame enemyGotKilled]; } //       -(void)getAttacked:(Tower *)attacker { [attackedBy addObject:attacker]; } -(void)gotLostSight:(Tower *)attacker { [attackedBy removeObject:attacker]; } -(void)getDamaged:(int)damage { currentHp -=damage; if(currentHp <=0) { [self getRemoved]; } } 

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

рдЫрд╡рд┐

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

рдЕрдВрддрд┐рдо рд╕реНрдкрд░реНрд╢

рдЖрдЗрдП рдЦрд┐рд▓рд╛рдбрд╝реА рджреНрд╡рд╛рд░рд╛ рдЫреЛрдбрд╝реЗ рдЧрдП рдЬреАрд╡рди рдХреА рд╕рдВрдЦреНрдпрд╛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдХреЗ рд╢реБрд░реВ рдХрд░реЗрдВ рдФрд░ рдЬрдм рд╡реЗ рд╕рдорд╛рдкреНрдд рд╣реЛ рдЬрд╛рдПрдВрдЧреЗ рддреЛ рдХреНрдпрд╛ рд╣реЛрдЧрд╛!
HelloWorldLayer.h рдЦреЛрд▓реЗрдВ рдФрд░ рдирд┐рдореНрди рдЪрд░ рдЬреЛрдбрд╝реЗрдВ:
рдХреЛрдб
 int playerHp; CCLabelBMFont *ui_hp_lbl; BOOL gameEnded; 

playerHp , CCLabelBMFont , . gameEnded , ! :

 -(void)getHpDamage; -(void)doGameOver; 

HelloWorldLayer.m :

 //    init: // 7 -   playerHp = 5; ui_hp_lbl = [CCLabelBMFont labelWithString:[NSString stringWithFormat:@"HP: %d",playerHp] fntFile:@"font_red_14.fnt"]; [self addChild:ui_hp_lbl z:10]; [ui_hp_lbl setPosition:ccp(35,wins.height-12)]; //      : -(void)getHpDamage { playerHp--; [ui_hp_lbl setString:[NSString stringWithFormat:@"HP: %d",playerHp]]; if (playerHp <=0) { [self doGameOver]; } } -(void)doGameOver { if (!gameEnded) { gameEnded = YES; [[CCDirector sharedDirector] replaceScene:[CCTransitionRotoZoom transitionWithDuration:1 scene:[HelloWorldLayer scene]]]; } } 

рдпрд╣ рдПрдХ рдРрд╕рд╛ рддрд░реАрдХрд╛ рдЬреЛрдбрд╝рддрд╛ рд╣реИ рдЬреЛ рдЦрд┐рд▓рд╛рдбрд╝реА рдХреЗ рдЬреАрд╡рди рдХреЛ рдХрдо рдХрд░рддрд╛ рд╣реИ, рдХреИрдкреНрд╢рди рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд░рддрд╛ рд╣реИ, рдФрд░ рдпрд╣ рджреЗрдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдЬрд╛рдВрдЪрддрд╛ рд╣реИ рдХрд┐ рдХреНрдпрд╛ рдЦрд┐рд▓рд╛рдбрд╝реА рдХрд╛ рдЬреАрд╡рди рд╕рдорд╛рдкреНрдд рд╣реЛ рдЧрдпрд╛ рд╣реИред рдпрджрд┐ рд╣рд╛рдВ, рддреЛ рдЦреЗрд▓ рдЦрддреНрдо рд╣реЛ рдЧрдпрд╛ рд╣реИ!
рдЬрдм рджреБрд╢реНрдорди рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдкрд╣реБрдВрдЪ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ getHpDamage рд╡рд┐рдзрд┐ рдХреЛ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред рдЖрдкрдиреЗ рдкрд╣рд▓реЗ рдЗрд╕реЗ Enemy.m рдореЗрдВ рдЕрдкрдбреЗрдЯ рд╡рд┐рдзрд┐ рдореЗрдВ рдЬреЛрдбрд╝рд╛ рдерд╛ ред
рдЦреЗрд▓ рдХреЛ рд╕рдВрдХрд▓рд┐рдд рдХрд░реЗрдВ рдФрд░ рдЪрд▓рд╛рдПрдВред рджреБрд╢реНрдордиреЛрдВ рдХреЛ рдЕрдкрдиреЗ рдмреЗрд╕ рдкрд░ рдЬрд╛рдиреЗ рджреЗрдВред рдЖрдкрдХреЛ рдпрд╣ рджреЗрдЦрдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рдЦреЗрд▓ рд╕рдорд╛рдкреНрдд рд╣реЛрдиреЗ рддрдХ рдЖрдкрдХреЗ рдЬреАрд╡рди рдХреА рд╕рдВрдЦреНрдпрд╛ рдХреИрд╕реЗ рдШрдЯрддреА рд╣реИред

рдЫрд╡рд┐

рдпрд╣ рдЖрдкрдХреЗ рдмрдЬрдЯ рдореЗрдВ рдХрдЯреМрддреА рдХрд╛ рд╕рдордп рд╣реИ!
рдХрдИ рдЧреЗрдо "рд╢реВрдиреНрдп-рд╕рдо" рд╡рд┐рдХрд▓реНрдк рдХреЛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рд┐рдд рдХрд░рддреЗ рд╣реИрдВ, рдЬреЛ рдЦрд┐рд▓рд╛рдбрд╝реА рдХреЛ рдЦреЗрд▓ рдХреА рд╢реБрд░реБрдЖрдд рдореЗрдВ рд╕реАрдорд┐рдд рдорд╛рддреНрд░рд╛ рдореЗрдВ рд╕рдВрд╕рд╛рдзрди рдЙрдкрд▓рдмреНрдз рдХрд░рд╛рддреЗ рд╣реИрдВред рдЖрдкрдХреЗ рдЦреЗрд▓ рдореЗрдВ рдХреБрдЫ рд╕рдорд╛рди рд╣реЛрдЧрд╛, рд▓реЗрдХрд┐рди рдПрдХ рд╕рд░рд▓реАрдХреГрдд рд░реВрдк рдореЗрдВред HelloWorldLayer.h
рдЦреЛрд▓реЗрдВ рдФрд░ рдирд┐рдореНрди рдЪрд░ рдЬреЛрдбрд╝реЗрдВ:

 int playerGold; CCLabelBMFont *ui_gold_lbl; 

рдЬреАрд╡рди рдХреЗ рд╕рд╛рде, рд╕реЛрдиреЗ рдХреА рдПрдХ рдкрд░рд┐рд╡рд░реНрддрдиреАрдп рд░рд╛рд╢рд┐ (рдкреНрд▓реЗрдпрд░рдЧреЛрд▓реНрдб) рдФрд░ рдЗрд╕реЗ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╢рд┐рд▓рд╛рд▓реЗрдЦ (ui_gold_lbl) рдЬреЛрдбрд╝рд╛ рдЧрдпрд╛ рдерд╛ред рдирдИ рд╡рд┐рдзрд┐ рдХрд╛ рд╡рд┐рд╡рд░рдг рднреА рдЬреЛрдбрд╝реЗрдВ:

 -(void)awardGold:(int)gold; 

рдЕрдм HelloWorldLayer.m рдЦреЛрд▓реЗрдВ рдФрд░ рдирд┐рдореНрди рдХрд╛рд░реНрдп рдХрд░реЗрдВ:
рдХреЛрдб
 //   init: -(void)awardGold:(int)gold { playerGold += gold; [ui_gold_lbl setString:[NSString stringWithFormat:@"GOLD: %d",playerGold]]; } //   init: // 8 -  playerGold = 1000; ui_gold_lbl = [CCLabelBMFont labelWithString:[NSString stringWithFormat:@"GOLD: %d",playerGold] fntFile:@"font_red_14.fnt"]; [self addChild:ui_gold_lbl z:10]; [ui_gold_lbl setPosition:ccp(135,wins.height-12)]; [ui_gold_lbl setAnchorPoint:ccp(0,0.5)]; //  canBuyTower: -(BOOL)canBuyTower { if (playerGold - kTOWER_COST >=0) return YES; return NO; } //  ccTouchesBegan,      "if",    ,     : playerGold -= kTOWER_COST; [ui_gold_lbl setString:[NSString stringWithFormat:@"GOLD: %d",playerGold]]; 

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

 [theGame awardGold:200]; 

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

рдЫрд╡рд┐

рдЕрдВрдд рдореЗрдВ рдХреБрдЫ рд╕рдВрдЧреАрдд рдЬреЛрдбрд╝реЗрдВ! HelloWorldLayer.m
рдЦреЛрд▓реЗрдВ :
рдХреЛрдб
 //  : #import "SimpleAudioEngine.h" //   init: (  'if') [[SimpleAudioEngine sharedEngine] playBackgroundMusic:@"8bitDungeonLevel.mp3" loop:YES]; //  ccTouchesBegan,     Tower: [[SimpleAudioEngine sharedEngine] playEffect:@"tower_place.wav"]; //  getHpDamage [[SimpleAudioEngine sharedEngine] playEffect:@"life_lose.wav"]; 


рдЕрдм рджреБрд╢реНрдорди рдореЗрдВ :
рдХреЛрдб
 // : #import "SimpleAudioEngine.h" //   getDamaged: [[SimpleAudioEngine sharedEngine] playEffect:@"laser_shoot.wav"]; 

рд╡рд╣ рд╕рдм рд╣реИ!рдЖрдк рдХрд░ рд░рд╣реЗ рд╣реИрдВ! рдЦреЗрд▓ рдХреЛ рд▓реЙрдиреНрдЪ рдХрд░реЗрдВ, рдЖрдк рд░реЗрдЯреНрд░реЛ рдзреНрд╡рдирд┐рдпреЛрдВ рдХреЛ рдХреИрд╕реЗ рдкрд╕рдВрдж рдХрд░рддреЗ рд╣реИрдВ?
рд╕рдм рдХреБрдЫ рдХреЗ рд╕рд╛рде рдирдореВрдирд╛ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдЬреЛ рд╣рдордиреЗ рдКрдкрд░ рдХреА рдереА: рдЯреЙрд╡рд░рдбрд┐рдлреЗрдВрд╕рдлрд┐рдирд┐рд╢реНрдб.рдЬрд┐рдк

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


All Articles