守卫者游戏开发教程之cocos2d-iphone2.0第二部分(选择游戏场景)

这一部分我们来实现选择游戏场景

我们的选择游戏场景可以选择三个不同的游戏进度,这一部分需要跟数据库进行交互的,从数据库中读取不同的数据,以加载不同的游戏进度,但是今天我们先设计游戏场景。

这个场景可以存储三个游戏进度,每一个存储游戏进度模块有三种状态:新游戏、继续游戏、删除游戏进度:

屏幕快照 2013-03-13 下午1.19.35.png

这里这三个游戏进度的模块都是一样的所以,这三个模块都是基于一个类。模块的三种状态中继续游戏比较特殊一点,除了背景图以外还需要添加一部分内容,所以我把它也单独写了一个类。

接下来我们就需要添加三个类:SelectGame(选择游戏主场景)、SelectGameCall(选择场景中的模块)、ContinueCallLayer(模块之一 继续游戏)。

好了我们来开始添加SelectGame中的代码吧:

首先我们在头文件中定义三个实例变量:

    SelectGameCall *game1;

    SelectGameCall *game2;

    SelectGameCall *game3;

接着我们要在实现文件中添加初始化方法并在方法中添加:

    if ((self = [superinit]))

    {

       //屏幕大小

       CGSize size = [[CCDirectorsharedDirector] winSize];

       //背景

       CCSprite *background = [CCSpritespriteWithFile:@"save_bg.jpg"];

        [selfaddChild:background];

        background.position =ccp(size.width /2, size.height /2); 

        //添加场景中的三个模块

       game1 = [[[SelectGameCallalloc] init]autorelease];

       game2 = [[[SelectGameCallalloc] init]autorelease];

       game3 = [[[SelectGameCallalloc] init]autorelease];

        [game1viewInit:1];

        [game2viewInit:1];

        [game3viewInit:1];

        game1.isnewGame =YES;

       game2.isnewGame =YES

        game3.isnewGame =YES;

       game1.position =ccp(-140, 0);

       game3.position =ccp(140, 0);

        [selfaddChild:game2];

        [selfaddChild:game3];

        [selfaddChild:game1];

       //开启触摸事件

        [[[CCDirectorsharedDirector] touchDispatcher]addTargetedDelegate:selfpriority:0swallowsTouches:YES];

    }

    return self;

这部分代码添加过之后场景中就会出现三个新游戏模块,下面我们来添加触摸响应事件:

-(BOOL)ccTouchBegan:(UITouch *)touch withEvent:(UIEvent *)event

{

   CGPoint touchLocation = [selfconvertTouchToNodeSpace:touch];

   CGRect rect1 = CGRectMake(43,60, 114, 180);

   CGRect rect2 = CGRectMake(183,60, 114, 180);

   CGRect rect3 = CGRectMake(323,60, 114, 180);

    

   if (CGRectContainsPoint(rect1, touchLocation)) 

    {

        if (!game2.isDelete && !game3.isDelete

        {

            [game1onTouch:touchLocation];

        }

    }

   if (CGRectContainsPoint(rect2, touchLocation)) 

    {

        if (!game1.isDelete && !game3.isDelete

        {

            [game2onTouch:touchLocation];

        }

    }

   if (CGRectContainsPoint(rect3, touchLocation)) 

    {

        if (!game2.isDelete && !game1.isDelete

        {

            [game3onTouch:touchLocation];

        }

    }

    return YES

}

上面这部分代码,定义了三个矩形区域,也就是三个模块的触摸响应区域,接着把每个区域的触摸事件通过onTouch:这个方法分别交给了响应的模块去处理。

好了我们要接着添加SelectGameCall中的代码了,我们首先要在头文件中添加如下代码:

@property(nonatomic,retain)CCSprite *neGame;

@property(nonatomic,retain)ContinueCallLayer *continueGame;

@property(nonatomic,retain)CCSprite *deleteGame;

@property(nonatomic,assign)BOOL isDelete;

@property(nonatomic,assign)BOOL isnewGame;


-(void)viewInit:(int)type;

-(void)onTouch:(CGPoint) point;

前三个属性就是模块的三个显示状态;

isDelete是用来判断当前是否是删除游戏进度状态,应为我们在删除游戏进度状态是不能对其它模块进行操作的;

isnewGame是用来判断当前是否是新游戏状态,应为如果是新游戏状态,当我们点击时是会直接进入到游戏场景,而在继续游戏状态点击时会进入研究场景。

而下面两个方法一个是初始化界面,另一个就是接收触摸事件并进行处理的方法。

接下来我们来添加实现文件中的代码吧,首先我们要在初始化方法里添加如下代码:

CGSize size = [[CCDirectorsharedDirector] winSize];

self.neGame = [CCSpritespriteWithFile:@"save_new_game.png"];

self.continueGame = [[ContinueCallLayeralloc] init];

self.deleteGame = [CCSpritespriteWithFile:@"save_delete.png"];

neGame.position = deleteGame.position =ccp(size.width /2, 150);

self.isDelete =NO;

接着我们添加viewInit:中的代码:

if (type ==1

{

    [selfaddChild:neGame];

}

else

{

    [selfaddChild:continueGame];

}

上面的代码很简单我就不多说了,接下来就要添加onTouch:中的代码了,这部分代码很重要。我们先看一下代码吧:

CGPoint _point = [selfconvertToNodeSpace:point];

   CGRect Deleterect = CGRectMake(neGame.position.x

                            neGame.position.y -85

                            45

                            22);

   CGRect rect1 = CGRectMake(neGame.position.x -22

                             neGame.position.y +45

                             40

                             22);

   CGRect rect2 = CGRectMake(neGame.position.x -22

                             neGame.position.y -49

                             40

                             22);

    //判断是否处于删除游戏进度状态

   if (self.isDelete

    {

        //处于删除游戏状态

       if (CGRectContainsPoint(rect1, _point)) 

        {

            [selfremoveChild:deleteGamecleanup:YES];

            [selfaddChild:neGame];

           self.isnewGame =YES;

           self.isDelete =NO;

        }

       if (CGRectContainsPoint(rect2, _point)) 

        {

            [selfremoveChild:deleteGamecleanup:YES];

            [selfaddChild:continueGame];

           self.isDelete =NO;

        }

    }

   else

    {

       if (self.isnewGame

        {

            //处于新游戏状态

            [SceneManagergoStart];

            [selfremoveChild:neGamecleanup:YES];

            [selfaddChild:continueGame];

           self.isnewGame =NO;

        }

       else

        {

           //处于继续游戏状态

           if (CGRectContainsPoint(Deleterect, _point)) 

            {

                [selfremoveChild:continueGamecleanup:YES];

                [selfaddChild:deleteGame];

               self.isDelete =YES;

            }

           else

                [SceneManagergoResearch];

        }


    }

代码第一行是把接收到的坐标转化成当前层坐标。接着是定义的三个位置区域,下面的代码最外层的if判断是否在删除游戏进度状态,如果是则判断触点是否选中YES或者NO,并执行相应的操作,否则就判断当前是否处于新游戏状态,如果是则开始游戏,否则就检测是否在删除按钮区域,如果是则切换到删除游戏进度状态,否则就进入研究场景。

下面我们就要添加ContinueCallLayer中的代码了,这个类很简单直接上代码:

ContinueCallLayer.h

#import <Foundation/Foundation.h>

#import "cocos2d.h"


@interface ContinueCallLayer :CCLayer 

{

   CCLabelTTF *stagelabel;

   CCLabelTTF *coinlabel;

   CCLabelTTF *manastlabel;

   CCLabelTTF *retrylabel;

}

@property (nonatomic,retain)CCSprite *curNu;

@property (nonatomic,assign)int stage;

@property (nonatomic,assign)int coin;

@property (nonatomic,assign)int manastone;

@property (nonatomic,assign)int retry;


-(void)updateLabel;

@end

ContinueCallLayer.m

#import "ContinueCallLayer.h"


@implementation ContinueCallLayer

@synthesize curNu;

@synthesize stage,coin,manastone,retry;


-(id)init

{

   if ((self = [superinit])) 

    {

       CGSize size = [[CCDirectorsharedDirector] winSize];

       //背景

       CCSprite *bg = [CCSpritespriteWithFile:@"save_file.png"];

        bg.position =ccp(size.width /2,150);

        [selfaddChild:bg];

       curNu.position =ccp(size.width /2, 150 + 45);

       self.stage =0;

       self.coin =0;

       self.manastone =0;

       self.retry =0;

        stagelabel = [CCLabelTTFlabelWithString:[NSStringstringWithFormat:@"%d",self.stage]fontName:@"HiraKakuProN-W6"fontSize:17];

       stagelabel.position =ccp(size.width /2 + 23, 150 +8);

        [selfaddChild:stagelabel];

        

        coinlabel = [CCLabelTTFlabelWithString:[NSStringstringWithFormat:@"%d",self.coin]fontName:@"HiraKakuProN-W6"fontSize:17];

       coinlabel.position =ccp(size.width /2 + 5, 150 -12);

        [selfaddChild:coinlabel];

        

        manastlabel = [CCLabelTTFlabelWithString:[NSStringstringWithFormat:@"%d",self.manastone]fontName:@"HiraKakuProN-W6"fontSize:17];

       manastlabel.position =ccp(size.width /2 + 5, 150 -30);

        [selfaddChild:manastlabel];

        

        retrylabel = [CCLabelTTFlabelWithString:[NSStringstringWithFormat:@"%d",self.retry]fontName:@"HiraKakuProN-W6"fontSize:17];

       retrylabel.position =ccp(size.width /2 + 5, 150 -48);

        [selfaddChild:retrylabel];

    }

    return self;

}

-(void)updateLabel

{

    [stagelabelsetString:[NSStringstringWithFormat:@"%d",self.stage]];

    [coinlabelsetString:[NSStringstringWithFormat:@"%d",self.coin]];

    [manastlabel setString:[NSStringstringWithFormat:@"%d",self.manastone]];

    [retrylabelsetString:[NSStringstringWithFormat:@"%d",self.retry]];

}

@end

好了运行一下试试吧!

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
(译)cocos2d里面如何用texture picker和像素格式来优化spritesheet.pdf (译)在cocos2d里如何制作各种按钮.pdf (译)如何使用cocos2d制作基于tilemap的游戏教程 第一部分.pdf (译)如何在cocos2d里面使用动画和spritesheet.pdf (译)如何用cocos2d制作iphone游戏:旋转炮塔.pdf (译)如何用cocos2d制作iphone游戏:更猛的怪物和更多得管卡.pdf (译)如何使用cocos2d制作一个Slide Image Game:第一部分.pdf (译)如何使用cocos2d来制作一个塔防游戏:第一部分.pdf cocos2d 2.0 添加遮罩.pdf iOS Code Signing解惑.pdf iPhone上面的现实增强(Augmented Reality)入门教程.pdf OpenGL ES2.0Iphone开发指引.pdf OpenGLES2.0 Iphone开发指引:第二部分,纹理贴图.pdf 使用cocos2d和box2d制作滚动背景.pdf 加入敌人和战斗:如果使用cocos2d制作基于tiled地图的游戏:第三部分.pdf 在cocos2d里面如何使用物理引擎box2d:弹球.pdf 在cocos2d里面如何拖拽精灵.pdf 如何使用box2d来做碰撞检测(且仅用来做碰撞检测).pdf 如何使用CCRenderTexture来创建动态纹理.pdf 如何使用cocos2d1.0来给sprite添加Mask(遮罩).pdf 如何使用cocos2d制作一个塔防游戏:引子.pdf 如何使用cocos2d制作一个太空射击游戏.pdf 如何使用cocos2d制作一个打地鼠的游戏:(第二部分。完).pdf 如何使用cocos2d和box2d来制作一个Breakout游戏:第一部分.pdf 如何使用cocos2d和box2d来制作一个Breakout游戏第二部分(完).pdf 如何使用cocos2d来制作一个打地鼠的游戏:第一部分.pdf 如何使用GameCenter制作一个简单的多人游戏教程:第一部分.pdf 如何使用GameCenter制作一个简单的多人游戏教程第二部分.pdf 如何使用NSCoding和NSFileManager来保存你的应用程序数据.pdf 如何制作一个类似tiny wings的游戏:第一部分.pdf 如何制作一个类似tiny wings的游戏第二部分(完).pdf 如何升级你的cocos2d版本.pdf 如何学好Iphone开发.pdf 如何查找资料.pdf 碰撞检测和收集物品:如何使用cocos2d制作基于tiled地图的游戏第二部分.pdf (译)cocos2d精灵教程:第一部分.pdf (译)cocos2d精灵教程:第三部分.pdf (译)cocos2d精灵教程第二部分.pdf (译)cocos2d菜单教程:第一部分.pdf (译)cocos2d菜单教程:第三部分(完).pdf (译)cocos2d菜单教程第二部分.pdf (译)使用cocos2d和box2d来制作一个platformer游戏.pdf (译)如何使用cocos2d制作一个塔防游戏:第三部分.pdf (译)如何使用cocos2d制作一个塔防游戏第二部分.pdf (译)如何使用cocos2d制作一个塔防游戏:第四部分(完).pdf (译)如何使用cocos2d制作一个滑动图片游戏教程第二部分(完).pdf (译)如何用cocos2d制作一款简单的iphone游戏(第一部分).pdf
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值