这一部分我们来实现选择游戏场景
我们的选择游戏场景可以选择三个不同的游戏进度,这一部分需要跟数据库进行交互的,从数据库中读取不同的数据,以加载不同的游戏进度,但是今天我们先设计游戏场景。
这个场景可以存储三个游戏进度,每一个存储游戏进度模块有三种状态:新游戏、继续游戏、删除游戏进度:
这里这三个游戏进度的模块都是一样的所以,这三个模块都是基于一个类。模块的三种状态中继续游戏比较特殊一点,除了背景图以外还需要添加一部分内容,所以我把它也单独写了一个类。
接下来我们就需要添加三个类: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
好了运行一下试试吧!