SlideShare a Scribd company logo
1 of 68
iOS Game Development
    with Cocos2D




       SaalisUmer
  saalis.umer@vinsol.com
iOS Game Development
        with Cocos2D


Part 1: Why Cocos2D?
Part 2: Cocos2D Basics
Part 3: Let’s build a Cocos2D game
Part 1:
Why Cocos2D?
Anatomy of a simple game
      CPU & GPU
Meet Cocos2D for iPhone
 Open source iOS game development framework
 Developed by Ricardo Quesada, acqui-hired by
Zynga (2011)
 Stable v1.1 Based on OpenGL ES 1.1
 Beta v2.0 Based on OpenGL ES 2.0
 3,500+ iOS games shipped
The Cocos2D Family


                                                                   Cocos3D
                                                                   (Obj-C)

Cocos2d-Android
     (Java)
                                                    Cocos2d-Mac
                              Cocos2d-X               (Obj-C)
                         iPhone/Android (C++)




     Cocos2d-XNA                                Cocos2d-HTML5
  Windows Phone 7 (C#)                          Web (Javascript)
Proven Success
Great Effort-Flexibility Balance

                           Direct OpenGL/
100                         CoreGraphics




                                    Cocos2D/Sparrow

       Unity/Corona
  0
                      Flexibility
Cross Device, Cross Resolution
Active Ecosystem
And most importantly..
  Tons of great features for games

  Sprite Sheets             Scene Transitions          Parallax Scrolling



     Effects:                                            Actions:
                           Tile Map Support
Lense, Ripple, Wave..                                Move, Rotate, Scale..



Particle Systems        Integrated Physics Engines       Text Rendering



   Ribbons                   Shaders (v2.0)              Sound Support
Part 2:
Cocos2D Basics
Basic Cocos2D Concepts
                  Class that creates and handle the main Window
       Director   and manages how and when to execute the Scenes.
Basic Cocos2D Concepts
                  Creates and handle the main Window
       Director   and manages how and when to execute the Scenes.




                   A scene (implemented with the CCScene object) is more
        Scenes     or less an independent piece of the app workflow. .
Basic Cocos2D Concepts
                                                        Creates and handle the main Window
                                             Director   and manages how and when to execute the Scenes.




                                                         A scene (implemented with the CCScene object) is more
                                             Scenes      or less an independent piece of the app workflow. .




A CCLayer has a size of the whole drawable    Layers
area, and knows how to draw itself.
Basic Cocos2D Concepts
                                                      Creates and handle the main Window
                                           Director   and manages how and when to execute the Scenes.




                                                       A scene (implemented with the CCScene object) is more
                                           Scenes      or less an independent piece of the app workflow. .




A layer has a size of the whole drawable
                                            Layers
area, and knows how to draw itself.


It is a 2D image that can be moved,        Sprites
rotated, scaled, animated, etc.
Director & Scenes
Director                  Loss


Intro      Main Menu     Level I     Level 2   Victory


                        Options


                       High Scores



   Game made up of “game screens” called Scenes
   Each Scene can be considered a separate app
   Director handles main window and executes Scenes
Layers




Each Scene contains several full screen Layers
Layers contain Sprites which are the game elements
Layers useful for Controls, Background, Labels, Menus.
Nodes


Nodes are anything that gets drawn or contains
things that get drawn (= Scene, Layer, Sprite)
Can: Contain other Nodes
        Schedule periodic callbacks
        Execute Actions
Sprites in Action

                                                Create




CCSpriteFrame* spriteFrame = [[CCSpriteFrameCachesharedSpriteFrameCache]
spriteFrameByName:@"sprite.png”];
CCSprite* sprite = [CCSpritespriteWithSpriteFrame:spriteFrame];
Sprites in Action
winSize.height


                                           Add to Layer


                                  (x,y) at anchor point




                                                          winSize.width
 (0,0)
                 sprite.position = ccp(x, y);

                 [layer addChild:sprite z:5 tag:666];
Sprites in Action

                                                 Move




  CCMoveTo *moveToAction = [CCMoveToactionWithDuration:duration
                                               position:newPosition];

  [sprite runAction:moveToAction];


Properties can be transformed directly or through actions
Sprites in Action

                                                 Scale/Rotate




CCScaleTo *scaleToAction = [CCScaleToactionWithDuration:durationscale:scale];
CCRotateBy *rotateByAction = [CCRotateByactionWithDuration:durationangle:angle];

CCSequence *sequence = [CCSequenceactions:scaleToAction, rotateByAction, nil];

[sprite runAction:sequence];
Sprites in Action

                                           Animate




CCAnimation* animation = [[CCAnimationCachesharedAnimationCache]
                                       animationByName:@"animation"];
CCAnimate* animateAction = [CCAnimateactionWithAnimation:animation];

[sprite runAction:animateAction];
Sprites in Action

                                Schedule Updates




[scene schedule:@selector(updateSprite:) interval:interval];
Actions
     Can be performed on Sprites or any Node


   Basic      Move, Scale, Rotate, Bezier, Hide, Fade, Tint..

Composition   Sequence, Repeat, Spawn, RepeatForever..

   Ease          Ease, EaseExponential, EaseBounce..

  Effects       Lens, Liquid, Ripple, Shaky, Twirl, Waves..

  Special                 CallFunc, Follow..
Spritesheets




Added as a child to the layer
Created with TexturePacker or Zwoptex
Memory considerations, 16bit images, .pvr.ccz
Controls

- (void)ccTouchesBegan:(NSSet *)touches withEvent:(UIEvent *)event;

- (void)ccTouchesMoved:(NSSet *)touches withEvent:(UIEvent *)event;

- (void)ccTouchesEnded:(NSSet *)touches withEvent:(UIEvent *)event;

- (void)ccTouchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event;




Implement directly based on CCStandardTouchDelegate
Can use UIGestureRecognizer classes
Open source implementations of joypad/buttons available
Part 3:
Let’s Make a Game!
Part 3:
Let’s Make a Game!
..but first we need a story, graphics, music and sfx :)
KillTime




Because he likes to kill paratroopers
Graphics




http://www.freewebs.com/teh_pro/sprites.htm
Music & SFX




Background music, shoot sound, death sound
Steps for making KillTime
Application Setup
Step 1: Adding Background
Step 2: Adding Our Hero
Step 3: Adding Bad Guys (Game Logic)
Step 4: Killing Bad Guys (Adding UI)
Step 5: Check for Bad Guy Death
Step 6: Animating Our Hero
Step 7: Animating Bad Guys Dying
Step 8: Adding Body Count
Step 9: Adding Sound & Music
New Cocos2D Project
HelloWorldScene.h
@interface HelloWorldLayer : CCLayer
{
   // Player sprite
CCSprite *_player;

   // Target and bullet sprite arrays
NSMutableArray *_targets;
NSMutableArray *_bullets;

!   // Body count counter and isShooting flag
    int _bodyCount;
    BOOL _isShooting;
!
   // For body count label
CCLabelTTF *_labelTitle;
CCLabelTTF *_labelCount;
}
HelloWorldScene.m

// Create the new scene including this layer
+(id) scene
{
! // Create the scene
CCScene *scene = [CCScene node];
!
! // Create the layer
HelloWorldLayer *layer = [HelloWorldLayer node];
!
! // add layer as a child to scene
! [scene addChild: layer];
!
! // return the scene
  return scene;
}
Hello World
Step 1: Adding Background


(In init)

// Get the window size to place elements
CGSizewinSize = [[CCDirectorsharedDirector] winSize];
// Add the background image
CCSprite *background = [CCSpritespriteWithFile:@"background.png"];
background.position = ccp(winSize.width/2, winSize.height/2);
[self addChild:background z:0];
self.isTouchEnabled = YES; _bullets = [[NSMutableArrayalloc]init];
_targets = [[NSMutableArrayalloc]init];
Step 1: Adding Background
Step 2: Adding Our Hero
                     Preload the spritesheet




(In init)
// Load the sprite sheet
CCSpriteBatchNode *batchNode = [CCSpriteBatchNode
                   batchNodeWithFile:@”spritesheet.pvr.ccz"];
[self addChild:batchNode];

// Load the sprites into the shareSpriteFrameCache
[[CCSpriteFrameCachesharedSpriteFrameCache]
               addSpriteFramesWithFile:@”spritesheet.plist"];
Step 2: Adding Our Hero
                         Add the hero sprite



// Add the player sprite
CCSpriteFrame* playerFrame = [[CCSpriteFrameCachesharedSpriteFrameCache]
spriteFrameByName:@"player1.png"];

_player = [CCSpritespriteWithSpriteFrame:playerFrame];
_player.position = ccp(_player.contentSize.width/2 + 10, winSize.height/2);

[self addChild:_player z:1];
Step 2: Adding Our Hero
Step 3: Adding Bad Guys (Game Logic)
            Schedule a new target every second




(in init)

[self schedule:@selector(addTarget:) interval:1.0f];
Step 3: Adding Bad Guys (Game Logic)
                      Create a sprite for the target




// Create a new enemy
-(void)addTarget:(ccTime)dt {

     // Create the target sprite
    CCSpriteFrame *targetFrame = [[CCSpriteFrameCachesharedSpriteFrameCache]
    spriteFrameByName:@"target.png”];
    CCSprite *target = [CCSpritespriteWithSpriteFrame:targetFrame];

    // Add the target to the layer and the array
!   [self addChild:target];
!   [_targets addObject:target];}
Step 3: Adding Bad Guys (Game Logic)
         Generate a random x position for the target


    // Determine where to spawn the target along the X axis
CGSizewinSize = [[CCDirectorsharedDirector] winSize];

    // Find a random X for the target in the right half of the screen
intminX = winSize.width/2;
intmaxX = winSize.width - target.contentSize.width;
intrangeX = maxX - minX;
intactualX = (arc4random() % rangeX) + minX;
    target.    position        =     ccp     (actualX,      320    );
    target.anchorPoint = ccp(0, 0);

    // Determine speed of the target
intminDuration = 2.0;
intmaxDuration = 4.0;
intrangeDuration = maxDuration - minDuration;
intactualDuration = (arc4random() % rangeDuration) + minDuration;
Step 3: Adding Bad Guys (Game Logic)
               Create a move action for the target with a
                  callback when reaching the bottom


// Create and run the actions
CCMoveTo* moveTarget = [CCMoveToactionWithDuration:actualDuration
              Position:ccp(actualX,-target.contentSize.height/2)];
CCCallFuncN* actionForTargetMoveDidFinish = [CCCallFuncN
             actionWithTarget:selfselector:@selector(targetMoveFinished:)];

[target runAction:[CCSequenceactions:moveTarget, actionForTargetMoveDidFinish, nil]];
Step 3: Adding Bad Guys (Game Logic)
         Add the callback method for a target that
               dies or reaches the bottom

// Method for removing a target that has died or reached the
bottom

-(void)targetMoveFinished:(id)sender {
CCSprite *target = (CCSprite *)sender;
   [ self       removeChild      :target   cleanup    :    YES   ];
[_targets removeObject:target];
}
Step 3: Adding Bad Guys (Game Logic)
Step 4: Killing Bad Guys (Adding UI)
                              Detect the touch




- (void)ccTouchesEnded:(NSSet *)touches withEvent:(UIEvent *)event {
// Choose one of the touches to work with
UITouch *touch = [touches anyObject];
CGPoint location = [touch locationInView:[touch view]];
   location = [[CCDirectorsharedDirector] convertToGL:location];

    if (!_isShooting) {
        _isShooting = YES;
Step 4: Killing Bad Guys (Adding UI)
                               Create the bullet

// Create the bullet
CCSpriteFrame* bulletFrame = [[CCSpriteFrameCachesharedSpriteFrameCache]
spriteFrameByName:                        @"bullet.png"     ];
CCSprite* bulletSprite = [CCSpritespriteWithSpriteFrame:bulletFrame];
bulletSprite.position = _player.position;

 // Bullet actions
 CCCallFuncN* actionForRemoveBullet = [CCCallFuncNactionWithTarget:self
                                        selector:@selector(removeBullet:)];
 CCMoveBy* bulletMoveBy = [CCMoveBy actionWithDuration:1.0f
                                              position:ccp(winSize.width, 0)];
 [bulletSpriterunAction:[CCSequenceactionOne:bulletMoveBy
                                           two:actionForRemoveBullet]];
// Add bullet to layer and array
[self addChild:bulletSprite];
[_bullets addObject:bulletSprite];
_isShooting = NO;
Step 4: Killing Bad Guys (Adding UI)
Step 5: Check for Bad Guy Death

-(void)update:(ccTime)dt {
    CCSprite* bulletToRemove = nil;

    for (CCSprite *bullet in _bullets) {
        for (CCSprite* target in _targets) {
            CGRecttargetBox = CGRectMake(target.position.x, target.position.y,
                  [target boundingBox].size.width, [target boundingBox].size.height);

            // Check if bullet is in the target's bounding box
            if (CGRectContainsPoint(targetBox, bullet.position)) {

            // Animate target death and remove target

                bulletToRemove = bullet;
            }
        }
    }

    // Remove bullet if target was hit
    if (bulletToRemove != nil) {
        [self removeChild:bulletToRemovecleanup:YES];
        [ _bullets                removeObject   :bulletToRemove];
    }
}
Step 5: Check for Bad Guy Death
Step 6: Animating Our Hero
             Preload the animation from the spritesheet


 Adding Player animation in init
(In init)

// Load the animation for player
NSMutableArray *animFrames1 = [NSMutableArray array];
for (inti = 1; i< 11; i++) {
    CCSpriteFrame *frame = [[CCSpriteFrameCachesharedSpriteFrameCache] spriteFrameByName:
                                         [NSStringstringWithFormat:@"player%d.png”,i]];
    [animFrames1 addObject:frame];
}

[[CCAnimationCachesharedAnimationCache] addAnimation:[CCAnimation
                  animationWithFrames:animFrames1 delay:FRAME_DELAY] name:@"player"];!
Step 6: Animating Our Hero
             Preload the animation from the spritesheet


 Adding Kill animation in init
(In init)

//// Load the animation for villain kill
NSMutableArray *animFrames2 = [NSMutableArray array];
for (inti = 1; i< 8; i++) {
CCSpriteFrame *frame2 = [[CCSpriteFrameCachesharedSpriteFrameCache] spriteFrameByName:
[NSStringstringWithFormat:@"kill%d.png",i]];
[animFrames2 addObject:frame2];
 }
[[CCAnimationCachesharedAnimationCache] addAnimation:[CCAnimation
animationWithFrames:animFrames2 delay:FRAME_DELAY*5] name:@"kill"];
Step 6: Animating Our Hero
                      Animate the hero when shooting



(In ccTouchesEnded)

// Actions for shooting animation
CCCallFunc* actionForShootDidEnd = [CCCallFuncactionWithTarget:self
                                                selector:@selector(shootDidEnd)];

CCAnimation* playerShootAnimation = [[CCAnimationCachesharedAnimationCache]
                                                      animationByName:@"player"];
CCAnimate* shootAnimate = [CCAnimateactionWithAnimation:playerShootAnimation];

[_player runAction:[CCSequenceactionOne:shootAnimatetwo:actionForShootDidEnd]];
Step 6: Animating Our Hero
Step 7: Animating Bad Guys Dying



(in update)

// Set up actions for animation and target removal
CCCallFuncN* actionForDeathDidFinish = [CCCallFuncNactionWithTarget:self
                                                   selector:@selector(targetMoveFinished:)];

CCAnimate* deathAnimation = [CCAnimateactionWithAnimation:[[CCAnimationCache
                 sharedAnimationCache] animationByName:@”kill"] restoreOriginalFrame:NO];

[target runAction:[CCSequenceactionOne:deathAnimationtwo:actionForDeathDidFinish]];
Step 7: Animating Bad Guys Dying
Step 8: Adding Body Count


(In init)

NSString* bodyCountString = [NSStringstringWithFormat:@"%d", _bodyCount];
_labelCount = [CCLabelTTFlabelWithString:bodyCountStringfontName:@"Arial"
fontSize                                                  : 16     ];
_labelCount.color = ccc3(0,0,0);
_labelCount.position = ccp(110, winSize.height - 16);
[self addChild:_labelCount z:2];

(In update:)

_bodyCount++;
NSString* bodyCountString = [NSStringstringWithFormat:@"%d", _bodyCount];!
[_labelCountsetString:bodyCountString];
Step 8: Adding Body Count
Step 9: Adding Sound & Music


(In init)

!   // Start background music, set lower volume

SimpleAudioEngine.sharedEngine.backgroundMusicVolume = 0.4f;
! [[SimpleAudioEnginesharedEngine] playBackgroundMusic:@"explosive_attack.mp3"];

(In ccTouchesEnded)
   // Play sound effect on every shot and on death
!
   [[SimpleAudioEnginesharedEngine] playEffect:@"shot.mp3"];
!(In update: where the target is killed)
! [[SimpleAudioEnginesharedEngine] playEffect:@"death.mp3"];
Let’s Play!
KillTime 2.0

Enemies can move and attack
Joypad
Move our hero
Different weapons, power ups and health
Game menu and high scores
Levels
Save/Load Game
Refactor code (More scenes and layers)
More stuff to explore


Physics Engines - Chipmunk and Box2D
Particle System
Tilemaps
Menu Interface
Where can you learn more

       Cocos2D Demo Library (Comes with Cocos)

            Wiki: http://cocos2d-iphone.org/wiki

       Ray Wenderlich: http://www.raywenderlich.com

       Steffen Itterheim: http://learn-cocos2d.com

Sapus Tongue Source Code: http://www.sapusmedia.com/source
Thank You!
  SAALIS UMER

More Related Content

What's hot

Unity 3D
Unity 3DUnity 3D
Unity 3Dgema123
 
Casual and Social Games with Unity
Casual and Social Games with UnityCasual and Social Games with Unity
Casual and Social Games with UnityTadej Gregorcic
 
Game development -session on unity 3d
Game development -session on unity 3d Game development -session on unity 3d
Game development -session on unity 3d Muhammad Maaz Irfan
 
Unity Introduction
Unity IntroductionUnity Introduction
Unity IntroductionJuwal Bose
 
Introduction to Unity3D Game Engine
Introduction to Unity3D Game EngineIntroduction to Unity3D Game Engine
Introduction to Unity3D Game EngineMohsen Mirhoseini
 
Introduction to Unity3D and Building your First Game
Introduction to Unity3D and Building your First GameIntroduction to Unity3D and Building your First Game
Introduction to Unity3D and Building your First GameSarah Sexton
 
Creating a serious game with the Unity 3D Game Engine and the importance of m...
Creating a serious game with the Unity 3D Game Engine and the importance of m...Creating a serious game with the Unity 3D Game Engine and the importance of m...
Creating a serious game with the Unity 3D Game Engine and the importance of m...danielandlubo
 
PRESENTATION ON Game Engine
PRESENTATION ON Game EnginePRESENTATION ON Game Engine
PRESENTATION ON Game EngineDiksha Bhargava
 
Presentasi Seminar Unity (AMIKOM Game Dev)
Presentasi Seminar Unity (AMIKOM Game Dev)Presentasi Seminar Unity (AMIKOM Game Dev)
Presentasi Seminar Unity (AMIKOM Game Dev)Mas Bram
 
Developing applications and games in Unity engine - Matej Jariabka, Rudolf Ka...
Developing applications and games in Unity engine - Matej Jariabka, Rudolf Ka...Developing applications and games in Unity engine - Matej Jariabka, Rudolf Ka...
Developing applications and games in Unity engine - Matej Jariabka, Rudolf Ka...gamifi.cc
 
Game Engine for Serious Games
Game Engine for Serious GamesGame Engine for Serious Games
Game Engine for Serious GamesKashif Shamaun
 
UGC In Game : A Brief History and How We Bring It To Mobile | Zhuo Yue
UGC In Game : A Brief History and How We Bring It To Mobile | Zhuo YueUGC In Game : A Brief History and How We Bring It To Mobile | Zhuo Yue
UGC In Game : A Brief History and How We Bring It To Mobile | Zhuo YueJessica Tams
 
Game Project / Working with Unity
Game Project / Working with UnityGame Project / Working with Unity
Game Project / Working with UnityPetri Lankoski
 
Mobile Game Development in Unity
Mobile Game Development in UnityMobile Game Development in Unity
Mobile Game Development in UnityHakan Saglam
 

What's hot (20)

Unity 3D
Unity 3DUnity 3D
Unity 3D
 
Casual and Social Games with Unity
Casual and Social Games with UnityCasual and Social Games with Unity
Casual and Social Games with Unity
 
Game development -session on unity 3d
Game development -session on unity 3d Game development -session on unity 3d
Game development -session on unity 3d
 
Unity
UnityUnity
Unity
 
unity basics
unity basicsunity basics
unity basics
 
Unity Introduction
Unity IntroductionUnity Introduction
Unity Introduction
 
Introduction to Unity3D Game Engine
Introduction to Unity3D Game EngineIntroduction to Unity3D Game Engine
Introduction to Unity3D Game Engine
 
Introduction to Unity3D and Building your First Game
Introduction to Unity3D and Building your First GameIntroduction to Unity3D and Building your First Game
Introduction to Unity3D and Building your First Game
 
Creating a serious game with the Unity 3D Game Engine and the importance of m...
Creating a serious game with the Unity 3D Game Engine and the importance of m...Creating a serious game with the Unity 3D Game Engine and the importance of m...
Creating a serious game with the Unity 3D Game Engine and the importance of m...
 
Unity - Game Engine
Unity - Game EngineUnity - Game Engine
Unity - Game Engine
 
PRESENTATION ON Game Engine
PRESENTATION ON Game EnginePRESENTATION ON Game Engine
PRESENTATION ON Game Engine
 
Presentasi Seminar Unity (AMIKOM Game Dev)
Presentasi Seminar Unity (AMIKOM Game Dev)Presentasi Seminar Unity (AMIKOM Game Dev)
Presentasi Seminar Unity (AMIKOM Game Dev)
 
Developing applications and games in Unity engine - Matej Jariabka, Rudolf Ka...
Developing applications and games in Unity engine - Matej Jariabka, Rudolf Ka...Developing applications and games in Unity engine - Matej Jariabka, Rudolf Ka...
Developing applications and games in Unity engine - Matej Jariabka, Rudolf Ka...
 
Game Engine for Serious Games
Game Engine for Serious GamesGame Engine for Serious Games
Game Engine for Serious Games
 
Presentación Unity
Presentación UnityPresentación Unity
Presentación Unity
 
UGC In Game : A Brief History and How We Bring It To Mobile | Zhuo Yue
UGC In Game : A Brief History and How We Bring It To Mobile | Zhuo YueUGC In Game : A Brief History and How We Bring It To Mobile | Zhuo Yue
UGC In Game : A Brief History and How We Bring It To Mobile | Zhuo Yue
 
Unity Game Engine
Unity Game EngineUnity Game Engine
Unity Game Engine
 
Game Project / Working with Unity
Game Project / Working with UnityGame Project / Working with Unity
Game Project / Working with Unity
 
Mobile Game Development in Unity
Mobile Game Development in UnityMobile Game Development in Unity
Mobile Game Development in Unity
 
Unity 3D, A game engine
Unity 3D, A game engineUnity 3D, A game engine
Unity 3D, A game engine
 

Similar to Game development with Cocos2d

Creating physics game in 1 hour
Creating physics game in 1 hourCreating physics game in 1 hour
Creating physics game in 1 hourLinkou Bian
 
Game development with Cocos2d-x Engine
Game development with Cocos2d-x EngineGame development with Cocos2d-x Engine
Game development with Cocos2d-x EngineDuy Tan Geek
 
Game development via_sprite_kit
Game development via_sprite_kitGame development via_sprite_kit
Game development via_sprite_kitBuşra Deniz, CSM
 
C++ game development with oxygine
C++ game development with oxygineC++ game development with oxygine
C++ game development with oxyginecorehard_by
 
Advanced Game Development with the Mobile 3D Graphics API
Advanced Game Development with the Mobile 3D Graphics APIAdvanced Game Development with the Mobile 3D Graphics API
Advanced Game Development with the Mobile 3D Graphics APITomi Aarnio
 
Trident International Graphics Workshop 2014 1/5
Trident International Graphics Workshop 2014 1/5Trident International Graphics Workshop 2014 1/5
Trident International Graphics Workshop 2014 1/5Takao Wada
 
building_games_with_ruby_rubyconf
building_games_with_ruby_rubyconfbuilding_games_with_ruby_rubyconf
building_games_with_ruby_rubyconftutorialsruby
 
building_games_with_ruby_rubyconf
building_games_with_ruby_rubyconfbuilding_games_with_ruby_rubyconf
building_games_with_ruby_rubyconftutorialsruby
 
Gdc09 Minigames
Gdc09 MinigamesGdc09 Minigames
Gdc09 MinigamesSusan Gold
 
iOS Game Development with Cocos2D
iOS Game Development with Cocos2DiOS Game Development with Cocos2D
iOS Game Development with Cocos2DGreenwell
 
Android game development
Android game developmentAndroid game development
Android game developmentdmontagni
 
Under Cocos 2 D Tree_mdevcon 2013
Under Cocos 2 D Tree_mdevcon 2013Under Cocos 2 D Tree_mdevcon 2013
Under Cocos 2 D Tree_mdevcon 2013Wooga
 
Under Cocos2D Tree @mdvecon 2013
Under Cocos2D Tree @mdvecon 2013Under Cocos2D Tree @mdvecon 2013
Under Cocos2D Tree @mdvecon 2013Maxim Zaks
 

Similar to Game development with Cocos2d (20)

Cocos2d 소개 - Korea Linux Forum 2014
Cocos2d 소개 - Korea Linux Forum 2014Cocos2d 소개 - Korea Linux Forum 2014
Cocos2d 소개 - Korea Linux Forum 2014
 
Cocos2d game programming 2
Cocos2d game programming 2Cocos2d game programming 2
Cocos2d game programming 2
 
Cocos2d for beginners
Cocos2d for beginnersCocos2d for beginners
Cocos2d for beginners
 
Creating physics game in 1 hour
Creating physics game in 1 hourCreating physics game in 1 hour
Creating physics game in 1 hour
 
Cocos2d programming
Cocos2d programmingCocos2d programming
Cocos2d programming
 
Basics cocos2d
Basics cocos2dBasics cocos2d
Basics cocos2d
 
Game development with Cocos2d-x Engine
Game development with Cocos2d-x EngineGame development with Cocos2d-x Engine
Game development with Cocos2d-x Engine
 
Game development via_sprite_kit
Game development via_sprite_kitGame development via_sprite_kit
Game development via_sprite_kit
 
C++ game development with oxygine
C++ game development with oxygineC++ game development with oxygine
C++ game development with oxygine
 
Advanced Game Development with the Mobile 3D Graphics API
Advanced Game Development with the Mobile 3D Graphics APIAdvanced Game Development with the Mobile 3D Graphics API
Advanced Game Development with the Mobile 3D Graphics API
 
Trident International Graphics Workshop 2014 1/5
Trident International Graphics Workshop 2014 1/5Trident International Graphics Workshop 2014 1/5
Trident International Graphics Workshop 2014 1/5
 
Programmers guide
Programmers guideProgrammers guide
Programmers guide
 
building_games_with_ruby_rubyconf
building_games_with_ruby_rubyconfbuilding_games_with_ruby_rubyconf
building_games_with_ruby_rubyconf
 
building_games_with_ruby_rubyconf
building_games_with_ruby_rubyconfbuilding_games_with_ruby_rubyconf
building_games_with_ruby_rubyconf
 
Gdc09 Minigames
Gdc09 MinigamesGdc09 Minigames
Gdc09 Minigames
 
iOS Game Development with Cocos2D
iOS Game Development with Cocos2DiOS Game Development with Cocos2D
iOS Game Development with Cocos2D
 
Unity workshop
Unity workshopUnity workshop
Unity workshop
 
Android game development
Android game developmentAndroid game development
Android game development
 
Under Cocos 2 D Tree_mdevcon 2013
Under Cocos 2 D Tree_mdevcon 2013Under Cocos 2 D Tree_mdevcon 2013
Under Cocos 2 D Tree_mdevcon 2013
 
Under Cocos2D Tree @mdvecon 2013
Under Cocos2D Tree @mdvecon 2013Under Cocos2D Tree @mdvecon 2013
Under Cocos2D Tree @mdvecon 2013
 

Recently uploaded

08448380779 Call Girls In Greater Kailash - I Women Seeking Men
08448380779 Call Girls In Greater Kailash - I Women Seeking Men08448380779 Call Girls In Greater Kailash - I Women Seeking Men
08448380779 Call Girls In Greater Kailash - I Women Seeking MenDelhi Call girls
 
Advanced Test Driven-Development @ php[tek] 2024
Advanced Test Driven-Development @ php[tek] 2024Advanced Test Driven-Development @ php[tek] 2024
Advanced Test Driven-Development @ php[tek] 2024Scott Keck-Warren
 
Transcript: #StandardsGoals for 2024: What’s new for BISAC - Tech Forum 2024
Transcript: #StandardsGoals for 2024: What’s new for BISAC - Tech Forum 2024Transcript: #StandardsGoals for 2024: What’s new for BISAC - Tech Forum 2024
Transcript: #StandardsGoals for 2024: What’s new for BISAC - Tech Forum 2024BookNet Canada
 
08448380779 Call Girls In Civil Lines Women Seeking Men
08448380779 Call Girls In Civil Lines Women Seeking Men08448380779 Call Girls In Civil Lines Women Seeking Men
08448380779 Call Girls In Civil Lines Women Seeking MenDelhi Call girls
 
CloudStudio User manual (basic edition):
CloudStudio User manual (basic edition):CloudStudio User manual (basic edition):
CloudStudio User manual (basic edition):comworks
 
Injustice - Developers Among Us (SciFiDevCon 2024)
Injustice - Developers Among Us (SciFiDevCon 2024)Injustice - Developers Among Us (SciFiDevCon 2024)
Injustice - Developers Among Us (SciFiDevCon 2024)Allon Mureinik
 
#StandardsGoals for 2024: What’s new for BISAC - Tech Forum 2024
#StandardsGoals for 2024: What’s new for BISAC - Tech Forum 2024#StandardsGoals for 2024: What’s new for BISAC - Tech Forum 2024
#StandardsGoals for 2024: What’s new for BISAC - Tech Forum 2024BookNet Canada
 
How to Remove Document Management Hurdles with X-Docs?
How to Remove Document Management Hurdles with X-Docs?How to Remove Document Management Hurdles with X-Docs?
How to Remove Document Management Hurdles with X-Docs?XfilesPro
 
Unblocking The Main Thread Solving ANRs and Frozen Frames
Unblocking The Main Thread Solving ANRs and Frozen FramesUnblocking The Main Thread Solving ANRs and Frozen Frames
Unblocking The Main Thread Solving ANRs and Frozen FramesSinan KOZAK
 
How to convert PDF to text with Nanonets
How to convert PDF to text with NanonetsHow to convert PDF to text with Nanonets
How to convert PDF to text with Nanonetsnaman860154
 
Pigging Solutions Piggable Sweeping Elbows
Pigging Solutions Piggable Sweeping ElbowsPigging Solutions Piggable Sweeping Elbows
Pigging Solutions Piggable Sweeping ElbowsPigging Solutions
 
Transforming Data Streams with Kafka Connect: An Introduction to Single Messa...
Transforming Data Streams with Kafka Connect: An Introduction to Single Messa...Transforming Data Streams with Kafka Connect: An Introduction to Single Messa...
Transforming Data Streams with Kafka Connect: An Introduction to Single Messa...HostedbyConfluent
 
IAC 2024 - IA Fast Track to Search Focused AI Solutions
IAC 2024 - IA Fast Track to Search Focused AI SolutionsIAC 2024 - IA Fast Track to Search Focused AI Solutions
IAC 2024 - IA Fast Track to Search Focused AI SolutionsEnterprise Knowledge
 
08448380779 Call Girls In Diplomatic Enclave Women Seeking Men
08448380779 Call Girls In Diplomatic Enclave Women Seeking Men08448380779 Call Girls In Diplomatic Enclave Women Seeking Men
08448380779 Call Girls In Diplomatic Enclave Women Seeking MenDelhi Call girls
 
FULL ENJOY 🔝 8264348440 🔝 Call Girls in Diplomatic Enclave | Delhi
FULL ENJOY 🔝 8264348440 🔝 Call Girls in Diplomatic Enclave | DelhiFULL ENJOY 🔝 8264348440 🔝 Call Girls in Diplomatic Enclave | Delhi
FULL ENJOY 🔝 8264348440 🔝 Call Girls in Diplomatic Enclave | Delhisoniya singh
 
Making_way_through_DLL_hollowing_inspite_of_CFG_by_Debjeet Banerjee.pptx
Making_way_through_DLL_hollowing_inspite_of_CFG_by_Debjeet Banerjee.pptxMaking_way_through_DLL_hollowing_inspite_of_CFG_by_Debjeet Banerjee.pptx
Making_way_through_DLL_hollowing_inspite_of_CFG_by_Debjeet Banerjee.pptxnull - The Open Security Community
 
Understanding the Laravel MVC Architecture
Understanding the Laravel MVC ArchitectureUnderstanding the Laravel MVC Architecture
Understanding the Laravel MVC ArchitecturePixlogix Infotech
 
My Hashitalk Indonesia April 2024 Presentation
My Hashitalk Indonesia April 2024 PresentationMy Hashitalk Indonesia April 2024 Presentation
My Hashitalk Indonesia April 2024 PresentationRidwan Fadjar
 

Recently uploaded (20)

08448380779 Call Girls In Greater Kailash - I Women Seeking Men
08448380779 Call Girls In Greater Kailash - I Women Seeking Men08448380779 Call Girls In Greater Kailash - I Women Seeking Men
08448380779 Call Girls In Greater Kailash - I Women Seeking Men
 
Advanced Test Driven-Development @ php[tek] 2024
Advanced Test Driven-Development @ php[tek] 2024Advanced Test Driven-Development @ php[tek] 2024
Advanced Test Driven-Development @ php[tek] 2024
 
Transcript: #StandardsGoals for 2024: What’s new for BISAC - Tech Forum 2024
Transcript: #StandardsGoals for 2024: What’s new for BISAC - Tech Forum 2024Transcript: #StandardsGoals for 2024: What’s new for BISAC - Tech Forum 2024
Transcript: #StandardsGoals for 2024: What’s new for BISAC - Tech Forum 2024
 
08448380779 Call Girls In Civil Lines Women Seeking Men
08448380779 Call Girls In Civil Lines Women Seeking Men08448380779 Call Girls In Civil Lines Women Seeking Men
08448380779 Call Girls In Civil Lines Women Seeking Men
 
Vulnerability_Management_GRC_by Sohang Sengupta.pptx
Vulnerability_Management_GRC_by Sohang Sengupta.pptxVulnerability_Management_GRC_by Sohang Sengupta.pptx
Vulnerability_Management_GRC_by Sohang Sengupta.pptx
 
CloudStudio User manual (basic edition):
CloudStudio User manual (basic edition):CloudStudio User manual (basic edition):
CloudStudio User manual (basic edition):
 
Injustice - Developers Among Us (SciFiDevCon 2024)
Injustice - Developers Among Us (SciFiDevCon 2024)Injustice - Developers Among Us (SciFiDevCon 2024)
Injustice - Developers Among Us (SciFiDevCon 2024)
 
#StandardsGoals for 2024: What’s new for BISAC - Tech Forum 2024
#StandardsGoals for 2024: What’s new for BISAC - Tech Forum 2024#StandardsGoals for 2024: What’s new for BISAC - Tech Forum 2024
#StandardsGoals for 2024: What’s new for BISAC - Tech Forum 2024
 
How to Remove Document Management Hurdles with X-Docs?
How to Remove Document Management Hurdles with X-Docs?How to Remove Document Management Hurdles with X-Docs?
How to Remove Document Management Hurdles with X-Docs?
 
Unblocking The Main Thread Solving ANRs and Frozen Frames
Unblocking The Main Thread Solving ANRs and Frozen FramesUnblocking The Main Thread Solving ANRs and Frozen Frames
Unblocking The Main Thread Solving ANRs and Frozen Frames
 
How to convert PDF to text with Nanonets
How to convert PDF to text with NanonetsHow to convert PDF to text with Nanonets
How to convert PDF to text with Nanonets
 
Pigging Solutions Piggable Sweeping Elbows
Pigging Solutions Piggable Sweeping ElbowsPigging Solutions Piggable Sweeping Elbows
Pigging Solutions Piggable Sweeping Elbows
 
Transforming Data Streams with Kafka Connect: An Introduction to Single Messa...
Transforming Data Streams with Kafka Connect: An Introduction to Single Messa...Transforming Data Streams with Kafka Connect: An Introduction to Single Messa...
Transforming Data Streams with Kafka Connect: An Introduction to Single Messa...
 
IAC 2024 - IA Fast Track to Search Focused AI Solutions
IAC 2024 - IA Fast Track to Search Focused AI SolutionsIAC 2024 - IA Fast Track to Search Focused AI Solutions
IAC 2024 - IA Fast Track to Search Focused AI Solutions
 
The transition to renewables in India.pdf
The transition to renewables in India.pdfThe transition to renewables in India.pdf
The transition to renewables in India.pdf
 
08448380779 Call Girls In Diplomatic Enclave Women Seeking Men
08448380779 Call Girls In Diplomatic Enclave Women Seeking Men08448380779 Call Girls In Diplomatic Enclave Women Seeking Men
08448380779 Call Girls In Diplomatic Enclave Women Seeking Men
 
FULL ENJOY 🔝 8264348440 🔝 Call Girls in Diplomatic Enclave | Delhi
FULL ENJOY 🔝 8264348440 🔝 Call Girls in Diplomatic Enclave | DelhiFULL ENJOY 🔝 8264348440 🔝 Call Girls in Diplomatic Enclave | Delhi
FULL ENJOY 🔝 8264348440 🔝 Call Girls in Diplomatic Enclave | Delhi
 
Making_way_through_DLL_hollowing_inspite_of_CFG_by_Debjeet Banerjee.pptx
Making_way_through_DLL_hollowing_inspite_of_CFG_by_Debjeet Banerjee.pptxMaking_way_through_DLL_hollowing_inspite_of_CFG_by_Debjeet Banerjee.pptx
Making_way_through_DLL_hollowing_inspite_of_CFG_by_Debjeet Banerjee.pptx
 
Understanding the Laravel MVC Architecture
Understanding the Laravel MVC ArchitectureUnderstanding the Laravel MVC Architecture
Understanding the Laravel MVC Architecture
 
My Hashitalk Indonesia April 2024 Presentation
My Hashitalk Indonesia April 2024 PresentationMy Hashitalk Indonesia April 2024 Presentation
My Hashitalk Indonesia April 2024 Presentation
 

Game development with Cocos2d

  • 1. iOS Game Development with Cocos2D SaalisUmer saalis.umer@vinsol.com
  • 2. iOS Game Development with Cocos2D Part 1: Why Cocos2D? Part 2: Cocos2D Basics Part 3: Let’s build a Cocos2D game
  • 4. Anatomy of a simple game CPU & GPU
  • 5. Meet Cocos2D for iPhone Open source iOS game development framework Developed by Ricardo Quesada, acqui-hired by Zynga (2011) Stable v1.1 Based on OpenGL ES 1.1 Beta v2.0 Based on OpenGL ES 2.0 3,500+ iOS games shipped
  • 6. The Cocos2D Family Cocos3D (Obj-C) Cocos2d-Android (Java) Cocos2d-Mac Cocos2d-X (Obj-C) iPhone/Android (C++) Cocos2d-XNA Cocos2d-HTML5 Windows Phone 7 (C#) Web (Javascript)
  • 8. Great Effort-Flexibility Balance Direct OpenGL/ 100 CoreGraphics Cocos2D/Sparrow Unity/Corona 0 Flexibility
  • 9. Cross Device, Cross Resolution
  • 11. And most importantly.. Tons of great features for games Sprite Sheets Scene Transitions Parallax Scrolling Effects: Actions: Tile Map Support Lense, Ripple, Wave.. Move, Rotate, Scale.. Particle Systems Integrated Physics Engines Text Rendering Ribbons Shaders (v2.0) Sound Support
  • 13. Basic Cocos2D Concepts Class that creates and handle the main Window Director and manages how and when to execute the Scenes.
  • 14. Basic Cocos2D Concepts Creates and handle the main Window Director and manages how and when to execute the Scenes. A scene (implemented with the CCScene object) is more Scenes or less an independent piece of the app workflow. .
  • 15. Basic Cocos2D Concepts Creates and handle the main Window Director and manages how and when to execute the Scenes. A scene (implemented with the CCScene object) is more Scenes or less an independent piece of the app workflow. . A CCLayer has a size of the whole drawable Layers area, and knows how to draw itself.
  • 16. Basic Cocos2D Concepts Creates and handle the main Window Director and manages how and when to execute the Scenes. A scene (implemented with the CCScene object) is more Scenes or less an independent piece of the app workflow. . A layer has a size of the whole drawable Layers area, and knows how to draw itself. It is a 2D image that can be moved, Sprites rotated, scaled, animated, etc.
  • 17. Director & Scenes Director Loss Intro Main Menu Level I Level 2 Victory Options High Scores Game made up of “game screens” called Scenes Each Scene can be considered a separate app Director handles main window and executes Scenes
  • 18. Layers Each Scene contains several full screen Layers Layers contain Sprites which are the game elements Layers useful for Controls, Background, Labels, Menus.
  • 19. Nodes Nodes are anything that gets drawn or contains things that get drawn (= Scene, Layer, Sprite) Can: Contain other Nodes Schedule periodic callbacks Execute Actions
  • 20. Sprites in Action Create CCSpriteFrame* spriteFrame = [[CCSpriteFrameCachesharedSpriteFrameCache] spriteFrameByName:@"sprite.png”]; CCSprite* sprite = [CCSpritespriteWithSpriteFrame:spriteFrame];
  • 21. Sprites in Action winSize.height Add to Layer (x,y) at anchor point winSize.width (0,0) sprite.position = ccp(x, y); [layer addChild:sprite z:5 tag:666];
  • 22. Sprites in Action Move CCMoveTo *moveToAction = [CCMoveToactionWithDuration:duration position:newPosition]; [sprite runAction:moveToAction]; Properties can be transformed directly or through actions
  • 23. Sprites in Action Scale/Rotate CCScaleTo *scaleToAction = [CCScaleToactionWithDuration:durationscale:scale]; CCRotateBy *rotateByAction = [CCRotateByactionWithDuration:durationangle:angle]; CCSequence *sequence = [CCSequenceactions:scaleToAction, rotateByAction, nil]; [sprite runAction:sequence];
  • 24. Sprites in Action Animate CCAnimation* animation = [[CCAnimationCachesharedAnimationCache] animationByName:@"animation"]; CCAnimate* animateAction = [CCAnimateactionWithAnimation:animation]; [sprite runAction:animateAction];
  • 25. Sprites in Action Schedule Updates [scene schedule:@selector(updateSprite:) interval:interval];
  • 26. Actions Can be performed on Sprites or any Node Basic Move, Scale, Rotate, Bezier, Hide, Fade, Tint.. Composition Sequence, Repeat, Spawn, RepeatForever.. Ease Ease, EaseExponential, EaseBounce.. Effects Lens, Liquid, Ripple, Shaky, Twirl, Waves.. Special CallFunc, Follow..
  • 27. Spritesheets Added as a child to the layer Created with TexturePacker or Zwoptex Memory considerations, 16bit images, .pvr.ccz
  • 28. Controls - (void)ccTouchesBegan:(NSSet *)touches withEvent:(UIEvent *)event; - (void)ccTouchesMoved:(NSSet *)touches withEvent:(UIEvent *)event; - (void)ccTouchesEnded:(NSSet *)touches withEvent:(UIEvent *)event; - (void)ccTouchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event; Implement directly based on CCStandardTouchDelegate Can use UIGestureRecognizer classes Open source implementations of joypad/buttons available
  • 30. Part 3: Let’s Make a Game! ..but first we need a story, graphics, music and sfx :)
  • 31. KillTime Because he likes to kill paratroopers
  • 33. Music & SFX Background music, shoot sound, death sound
  • 34. Steps for making KillTime Application Setup Step 1: Adding Background Step 2: Adding Our Hero Step 3: Adding Bad Guys (Game Logic) Step 4: Killing Bad Guys (Adding UI) Step 5: Check for Bad Guy Death Step 6: Animating Our Hero Step 7: Animating Bad Guys Dying Step 8: Adding Body Count Step 9: Adding Sound & Music
  • 36. HelloWorldScene.h @interface HelloWorldLayer : CCLayer { // Player sprite CCSprite *_player; // Target and bullet sprite arrays NSMutableArray *_targets; NSMutableArray *_bullets; ! // Body count counter and isShooting flag int _bodyCount; BOOL _isShooting; ! // For body count label CCLabelTTF *_labelTitle; CCLabelTTF *_labelCount; }
  • 37. HelloWorldScene.m // Create the new scene including this layer +(id) scene { ! // Create the scene CCScene *scene = [CCScene node]; ! ! // Create the layer HelloWorldLayer *layer = [HelloWorldLayer node]; ! ! // add layer as a child to scene ! [scene addChild: layer]; ! ! // return the scene return scene; }
  • 39. Step 1: Adding Background (In init) // Get the window size to place elements CGSizewinSize = [[CCDirectorsharedDirector] winSize]; // Add the background image CCSprite *background = [CCSpritespriteWithFile:@"background.png"]; background.position = ccp(winSize.width/2, winSize.height/2); [self addChild:background z:0]; self.isTouchEnabled = YES; _bullets = [[NSMutableArrayalloc]init]; _targets = [[NSMutableArrayalloc]init];
  • 40. Step 1: Adding Background
  • 41. Step 2: Adding Our Hero Preload the spritesheet (In init) // Load the sprite sheet CCSpriteBatchNode *batchNode = [CCSpriteBatchNode batchNodeWithFile:@”spritesheet.pvr.ccz"]; [self addChild:batchNode]; // Load the sprites into the shareSpriteFrameCache [[CCSpriteFrameCachesharedSpriteFrameCache] addSpriteFramesWithFile:@”spritesheet.plist"];
  • 42. Step 2: Adding Our Hero Add the hero sprite // Add the player sprite CCSpriteFrame* playerFrame = [[CCSpriteFrameCachesharedSpriteFrameCache] spriteFrameByName:@"player1.png"]; _player = [CCSpritespriteWithSpriteFrame:playerFrame]; _player.position = ccp(_player.contentSize.width/2 + 10, winSize.height/2); [self addChild:_player z:1];
  • 43. Step 2: Adding Our Hero
  • 44. Step 3: Adding Bad Guys (Game Logic) Schedule a new target every second (in init) [self schedule:@selector(addTarget:) interval:1.0f];
  • 45. Step 3: Adding Bad Guys (Game Logic) Create a sprite for the target // Create a new enemy -(void)addTarget:(ccTime)dt { // Create the target sprite CCSpriteFrame *targetFrame = [[CCSpriteFrameCachesharedSpriteFrameCache] spriteFrameByName:@"target.png”]; CCSprite *target = [CCSpritespriteWithSpriteFrame:targetFrame]; // Add the target to the layer and the array ! [self addChild:target]; ! [_targets addObject:target];}
  • 46. Step 3: Adding Bad Guys (Game Logic) Generate a random x position for the target // Determine where to spawn the target along the X axis CGSizewinSize = [[CCDirectorsharedDirector] winSize]; // Find a random X for the target in the right half of the screen intminX = winSize.width/2; intmaxX = winSize.width - target.contentSize.width; intrangeX = maxX - minX; intactualX = (arc4random() % rangeX) + minX; target. position = ccp (actualX, 320 ); target.anchorPoint = ccp(0, 0); // Determine speed of the target intminDuration = 2.0; intmaxDuration = 4.0; intrangeDuration = maxDuration - minDuration; intactualDuration = (arc4random() % rangeDuration) + minDuration;
  • 47. Step 3: Adding Bad Guys (Game Logic) Create a move action for the target with a callback when reaching the bottom // Create and run the actions CCMoveTo* moveTarget = [CCMoveToactionWithDuration:actualDuration Position:ccp(actualX,-target.contentSize.height/2)]; CCCallFuncN* actionForTargetMoveDidFinish = [CCCallFuncN actionWithTarget:selfselector:@selector(targetMoveFinished:)]; [target runAction:[CCSequenceactions:moveTarget, actionForTargetMoveDidFinish, nil]];
  • 48. Step 3: Adding Bad Guys (Game Logic) Add the callback method for a target that dies or reaches the bottom // Method for removing a target that has died or reached the bottom -(void)targetMoveFinished:(id)sender { CCSprite *target = (CCSprite *)sender; [ self removeChild :target cleanup : YES ]; [_targets removeObject:target]; }
  • 49. Step 3: Adding Bad Guys (Game Logic)
  • 50. Step 4: Killing Bad Guys (Adding UI) Detect the touch - (void)ccTouchesEnded:(NSSet *)touches withEvent:(UIEvent *)event { // Choose one of the touches to work with UITouch *touch = [touches anyObject]; CGPoint location = [touch locationInView:[touch view]]; location = [[CCDirectorsharedDirector] convertToGL:location]; if (!_isShooting) { _isShooting = YES;
  • 51. Step 4: Killing Bad Guys (Adding UI) Create the bullet // Create the bullet CCSpriteFrame* bulletFrame = [[CCSpriteFrameCachesharedSpriteFrameCache] spriteFrameByName: @"bullet.png" ]; CCSprite* bulletSprite = [CCSpritespriteWithSpriteFrame:bulletFrame]; bulletSprite.position = _player.position; // Bullet actions CCCallFuncN* actionForRemoveBullet = [CCCallFuncNactionWithTarget:self selector:@selector(removeBullet:)]; CCMoveBy* bulletMoveBy = [CCMoveBy actionWithDuration:1.0f position:ccp(winSize.width, 0)]; [bulletSpriterunAction:[CCSequenceactionOne:bulletMoveBy two:actionForRemoveBullet]]; // Add bullet to layer and array [self addChild:bulletSprite]; [_bullets addObject:bulletSprite]; _isShooting = NO;
  • 52. Step 4: Killing Bad Guys (Adding UI)
  • 53. Step 5: Check for Bad Guy Death -(void)update:(ccTime)dt { CCSprite* bulletToRemove = nil; for (CCSprite *bullet in _bullets) { for (CCSprite* target in _targets) { CGRecttargetBox = CGRectMake(target.position.x, target.position.y, [target boundingBox].size.width, [target boundingBox].size.height); // Check if bullet is in the target's bounding box if (CGRectContainsPoint(targetBox, bullet.position)) { // Animate target death and remove target bulletToRemove = bullet; } } } // Remove bullet if target was hit if (bulletToRemove != nil) { [self removeChild:bulletToRemovecleanup:YES]; [ _bullets removeObject :bulletToRemove]; } }
  • 54. Step 5: Check for Bad Guy Death
  • 55. Step 6: Animating Our Hero Preload the animation from the spritesheet Adding Player animation in init (In init) // Load the animation for player NSMutableArray *animFrames1 = [NSMutableArray array]; for (inti = 1; i< 11; i++) { CCSpriteFrame *frame = [[CCSpriteFrameCachesharedSpriteFrameCache] spriteFrameByName: [NSStringstringWithFormat:@"player%d.png”,i]]; [animFrames1 addObject:frame]; } [[CCAnimationCachesharedAnimationCache] addAnimation:[CCAnimation animationWithFrames:animFrames1 delay:FRAME_DELAY] name:@"player"];!
  • 56. Step 6: Animating Our Hero Preload the animation from the spritesheet Adding Kill animation in init (In init) //// Load the animation for villain kill NSMutableArray *animFrames2 = [NSMutableArray array]; for (inti = 1; i< 8; i++) { CCSpriteFrame *frame2 = [[CCSpriteFrameCachesharedSpriteFrameCache] spriteFrameByName: [NSStringstringWithFormat:@"kill%d.png",i]]; [animFrames2 addObject:frame2]; } [[CCAnimationCachesharedAnimationCache] addAnimation:[CCAnimation animationWithFrames:animFrames2 delay:FRAME_DELAY*5] name:@"kill"];
  • 57. Step 6: Animating Our Hero Animate the hero when shooting (In ccTouchesEnded) // Actions for shooting animation CCCallFunc* actionForShootDidEnd = [CCCallFuncactionWithTarget:self selector:@selector(shootDidEnd)]; CCAnimation* playerShootAnimation = [[CCAnimationCachesharedAnimationCache] animationByName:@"player"]; CCAnimate* shootAnimate = [CCAnimateactionWithAnimation:playerShootAnimation]; [_player runAction:[CCSequenceactionOne:shootAnimatetwo:actionForShootDidEnd]];
  • 58. Step 6: Animating Our Hero
  • 59. Step 7: Animating Bad Guys Dying (in update) // Set up actions for animation and target removal CCCallFuncN* actionForDeathDidFinish = [CCCallFuncNactionWithTarget:self selector:@selector(targetMoveFinished:)]; CCAnimate* deathAnimation = [CCAnimateactionWithAnimation:[[CCAnimationCache sharedAnimationCache] animationByName:@”kill"] restoreOriginalFrame:NO]; [target runAction:[CCSequenceactionOne:deathAnimationtwo:actionForDeathDidFinish]];
  • 60. Step 7: Animating Bad Guys Dying
  • 61. Step 8: Adding Body Count (In init) NSString* bodyCountString = [NSStringstringWithFormat:@"%d", _bodyCount]; _labelCount = [CCLabelTTFlabelWithString:bodyCountStringfontName:@"Arial" fontSize : 16 ]; _labelCount.color = ccc3(0,0,0); _labelCount.position = ccp(110, winSize.height - 16); [self addChild:_labelCount z:2]; (In update:) _bodyCount++; NSString* bodyCountString = [NSStringstringWithFormat:@"%d", _bodyCount];! [_labelCountsetString:bodyCountString];
  • 62. Step 8: Adding Body Count
  • 63. Step 9: Adding Sound & Music (In init) ! // Start background music, set lower volume SimpleAudioEngine.sharedEngine.backgroundMusicVolume = 0.4f; ! [[SimpleAudioEnginesharedEngine] playBackgroundMusic:@"explosive_attack.mp3"]; (In ccTouchesEnded) // Play sound effect on every shot and on death ! [[SimpleAudioEnginesharedEngine] playEffect:@"shot.mp3"]; !(In update: where the target is killed) ! [[SimpleAudioEnginesharedEngine] playEffect:@"death.mp3"];
  • 65. KillTime 2.0 Enemies can move and attack Joypad Move our hero Different weapons, power ups and health Game menu and high scores Levels Save/Load Game Refactor code (More scenes and layers)
  • 66. More stuff to explore Physics Engines - Chipmunk and Box2D Particle System Tilemaps Menu Interface
  • 67. Where can you learn more Cocos2D Demo Library (Comes with Cocos) Wiki: http://cocos2d-iphone.org/wiki Ray Wenderlich: http://www.raywenderlich.com Steffen Itterheim: http://learn-cocos2d.com Sapus Tongue Source Code: http://www.sapusmedia.com/source
  • 68. Thank You! SAALIS UMER