`

使用cocos2d为游戏加入菜单场景

阅读更多

原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 、作者信息和本声明。否则将追究法律责任。http://cocos2d.blog.51cto.com/2194238/412142

cocos2d拥有很完美的菜单管理和场景切换类,你可以使用它们为你的游戏加入菜单,完成场景之间的切换。

这次我会简单的介绍一下如何使用cocos2d提供的类库为游戏加入漂亮的菜单场景。在这一课你将会接触到菜单项的处理和场景的切换等相关知识。我不会讲述大篇幅的技术理论,我认为太多的理论对于一个初学者不仅没有帮助,反而会让他失去学习的乐趣。个人认为从实例代码下手更好,经过多次的实践之后,让读者自己去参悟其中的理论会更有效。

抛开题外话,让我们继续本章的主题。首先,让我们来创建我们的菜单类,这个类将包含两个部分,菜单场景类和菜单层类。因此我们在工程classes文件中建立一个New Group来存放管理他们会更方便。右击classes类文件夹,在弹出的菜单项中选择Add─>New Group创建一个新的Group,并将他命名为Menu。然后右击Menu文件夹,在弹出的菜单项中选择Add─>New File依次创建两个基于CCLayer的类文件,分别将它们命名为MenuScene和MenuLayer。这时你的Menu文件夹下应该有4个文件,分别是:MenuScene.h,MenuScene.h ,MenuLayer.h和MenuLayer.m文件。下面直接贴代码了:

 

 

MenuScene.h中的代码如下:

 

 

#import <Foundation/Foundation.h>

#import "cocos2d.h"

 

@interface MenuScene : CCLayer {

}

 

+(id) scene;

 

@end

 

 

MenuScene.m中的代码如下:

 

 

#import "MenuScene.h"

#import "MenuLayer.h"

 

@implementation MenuScene

 

// 实例化本场景

+(id) scene

{

// 'scene' is an autorelease object.

CCScene *scene = [CCScene node];

MenuScene *layer = [MenuScene node];

[scene addChild: layer];

return scene;

}

 

// 初始化函数

- (id) init

{

self = [super init];

if (self

{

// 设定菜单背景

CGSize winSize = [[CCDirector sharedDirectorwinSize]; 

CCSprite *bg = [CCSprite spriteWithFile:@"MenuBackground.png"];

bg.position = ccp(winSize.width / 2, winSize.height / 2);

[self addChild:bg];

// 添加菜单层

[self addChild:[MenuLayer node]];

}

return self;

}

 

// on "dealloc" you need to release all your retained objects

- (void) dealloc

{

[super dealloc];

}

 

@end

 
MenuLayer.h中的代码如下:
 

 

 

#import <Foundation/Foundation.h>

#import "cocos2d.h"

 

@interface MenuLayer : CCLayer {

}

 

// 下面声明的三个方法是菜单的三个选项,开始游戏,分数和关于

- (voidstartGame: (id)sender;

- (voidscores: (id)sender;

- (voidonAbout: (id)sender; 

 

@end

 

 

 

 
MenuLayer.m中的代码如下:
 

#import "HelloWorldScene.h"

#import "MenuLayer.h"

#import "ScoreScene.h"

#import "AboutScene.h"

 

@implementation MenuLayer

 

// on "init" you need to initialize your instance

- (id) init

{

self = [super init];

if (self

{

// 设定菜单文字

[CCMenuItemFont setFontName:@"Helvetica"];

[CCMenuItemFont setFontSize:30];

CCMenuItem *start = [CCMenuItemFont itemFromString:@"Start Game"

target:self

 selector:@selector(startGame:)];

CCMenuItem *scores = [CCMenuItemFont itemFromString:@"Scores"

 target:self

  selector:@selector(scores:)];

CCMenuItem *abouts = [CCMenuItemFont itemFromString:@"About" 

 target:self 

  selector:@selector(onAbout:)];

CCMenu *menu = [CCMenu menuWithItems:start, scores, abouts, nil];

[menu alignItemsVertically];

// 菜单特效可有可无,实现一个菜单飞出式效果

CGSize s = [[CCDirector sharedDirectorwinSize];

int i=0;

forCCNode *child in [menu children] ) {

            CGPoint dstPoint = child.position;

            int offset = s.width/2 + 50;

            if( i % 2 == 0)

                offset = -offset;

            child.position = ccp( dstPoint.x + offset, dstPoint.y);

            [child runAction:[CCEaseElasticOut actionWithAction:[CCMoveBy actionWithDuration:2 position:ccp(dstPoint.x- offset,0)]period0.35f]];

            i++;

        }

[self addChild:menu];

}

return self;

}

 

// 实现菜单方法

// 切换到StartGame场景

- (void) startGame: (id)sender 

{

CCScene *sc = [CCScene node];

[sc addChild:[HelloWorld node]];

// 缩放的形式切换场景

[[CCDirector sharedDirectorreplaceScene: [CCShrinkGrowTransition transitionWithDuration:1.2f scene:sc]];

}

 

// 切换到Scores场景

- (void) scores: (id)sender 

{

CCScene *sc = [CCScene node];

[sc addChild:[ScoreScene node]];

// 缩放的形式切换场景

[[CCDirector sharedDirectorreplaceScene: [CCShrinkGrowTransition transitionWithDuration:1.2f scene:sc]];

}

 

// 切换到About场景

- (void) onAbout: (id)sender 

{

CCScene *sc = [CCScene node];

[sc addChild:[AboutScene node]];

// 缩放的形式切换场景

[[CCDirector sharedDirectorreplaceScene: [CCShrinkGrowTransition transitionWithDuration:1.2f scene:sc]];

}

 

// on "dealloc" you need to release all your retained objects

- (void) dealloc

{

[super dealloc];

}

 

@end

 

 

 

 

到这里菜单类的编写就结束了,这里运用了场景和层分离的概念。将菜单场景与菜单层分开实现,这样可以使代码更加的清晰,层次更加分明。但是现在你还无法成功的运行你的程序,因为还有菜单项没用实现。另外你还没有修改Delegate.m托管文件中首场景载入函数的参数,你需要让它指向你编写的菜单场景。下面我们就来完成剩下的工作。首先,用同样的方法在classes文件夹下创建名为MenuOption的组,并在其下创建两个基于CCLayer的类文件,分别命名为AboutSceneScoreScene。然后打开Delegate.m托管文件,将头文件"HelloWorldScene.h"改为"MenuScene.h"。再在- (void) applicationDidFinishLaunching:(UIApplication*)application 方法的最后一行找到 [[CCDirector sharedDirector] runWithScene[HelloWorld scene]]; 这段函数调用,将参数中的HelloWorld改为刚创建的MenuScene场景。下面贴出菜单项类的代码:

 

HelloWorldScene.h中的代码如下:

 

 

#import <Foundation/Foundation.h>

#import "cocos2d.h"

 

// HelloWorld Layer

@interface HelloWorld : CCLayer {

}

 

@end

 

HelloWorldScene.m中的代码如下:

 

 

#import "HelloWorldScene.h"

#import "MenuScene.h"

 

// HelloWorld implementation

@implementation HelloWorld

 

// on "init" you need to initialize your instance

-(id) init

{

// always call "super" init

// Apple recommends to re-assign "self" with the "super" return value

if( (self=[super init] )) {

// create and initialize a Label

CCLabel* label = [CCLabel labelWithString:@"Hello World" fontName:@"Marker Felt" fontSize:64];

 

// ask director the the window size

CGSize size = [[CCDirector sharedDirectorwinSize];

// position the label on the center of the screen

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

// add the label as a child to this Layer

[self addChild: label];

// 添加图形返回菜单

CCSprite *menuNormal = [CCSprite spriteWithFile:@"b_back.png" rect:CGRectMake(007841)];

CCSprite *menuSelected = [CCSprite spriteWithFile:@"b_back_s.png" rect:CGRectMake(007841)];

CCMenuItemSprite *backToMenu = [CCMenuItemSprite itemFromNormalSprite:menuNormalselectedSprite:menuSelected target:self selector:@selector(onBack:)];

CCMenu *menu = [CCMenu menuWithItems: backToMenu, nil];

[menu setPosition:ccp(480 - 50320 - 30)];

[self addChild: menu];

}

return self;

}

 

// 返回菜单方法

-(void) onBack: (id) sender

{

CCScene *sc = [CCScene node];

[sc addChild:[MenuScene node]];

[[CCDirector sharedDirectorreplaceScene: [CCSlideInRTransition transitionWithDuration:1.2f scene:sc]];

}

 

// on "dealloc" you need to release all your retained objects

- (void) dealloc

{

// in case you have something to dealloc, do it in this method

// in this particular example nothing needs to be released.

// cocos2d will automatically release all the children (Label)

// don't forget to call "super dealloc"

[super dealloc];

}

@end

 

 

AboutScene.h中的代码如下:

 

 

#import <Foundation/Foundation.h>

#import "cocos2d.h"

 

@interface AboutScene : CCLayer {

 

}

 

@end

 

 

 

 

 

 

AboutScene.m中的代码如下:
 

#import "AboutScene.h"

#import "MenuScene.h"

 

@implementation AboutScene

 

// on "init" you need to initialize your instance

-(id) init

{

if( (self=[super init] )) {

// Label显示作者

CCLabel* label = [CCLabel labelWithString:@"作者:谢映宇" fontName:@"Marker Felt" fontSize:40];

CGSize size = [[CCDirector sharedDirectorwinSize];

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

[self addChild: label];

// 添加返回菜单

[CCMenuItemFont setFontSize:20];

CCMenuItem *backToMenu = [CCMenuItemFont itemFromString:@"Back" target:selfselector:@selector(onBack:)];

CCMenu *mn = [CCMenu menuWithItems:backToMenu, nil];

[mn alignItemsVertically];

mn.position = ccp (480 - 5030);

[self addChild:mn z:1 tag:2];

}

return self;

}

 

// 返回菜单方法

-(void) onBack: (id) sender

{

CCScene *sc = [CCScene node];

[sc addChild:[MenuScene node]];

[[CCDirector sharedDirectorreplaceScene: [CCSlideInRTransition transitionWithDuration:1.2f scene:sc]];

}

 

// on "dealloc" you need to release all your retained objects

- (void) dealloc

{

[super dealloc];

}

 

@end

 
ScoreScene.h中的代码如下:
 

#import <Foundation/Foundation.h>

#import "cocos2d.h"

 

@interface ScoreScene : CCLayer {

 

}

 

@end

 
ScoreScene.m中的代码如下:
 

#import "ScoreScene.h"

#import "MenuScene.h"

 

@implementation ScoreScene

 

// on "init" you need to initialize your instance

-(id) init

{

if( (self=[super init] )) {

 

// Label显示分数

CCLabel* label = [CCLabel labelWithString:@"最高分:9999" fontName:@"Marker Felt" fontSize:40];

CGSize size = [[CCDirector sharedDirectorwinSize];

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

[self addChild: label];

// 添加返回菜单

[CCMenuItemFont setFontSize:20];

CCMenuItem *backToMenu = [CCMenuItemFont itemFromString:@"Back" target:selfselector:@selector(onBack:)];

CCMenu *mn = [CCMenu menuWithItems:backToMenu, nil];

[mn alignItemsVertically];

mn.position = ccp (480 - 5030);

[self addChild:mn z:1 tag:2];

}

return self;

}

 

// 返回菜单方法

-(void) onBack: (id) sender

{

CCScene *sc = [CCScene node];

[sc addChild:[MenuScene node]];

[[CCDirector sharedDirectorreplaceScene: [CCSlideInRTransition transitionWithDuration:1.2f scene:sc]];

}

 

// on "dealloc" you need to release all your retained objects

- (void) dealloc

{

[super dealloc];

}

 

@end

 
上面的代码都带有注释,有一定cocos2d基础的朋友很容易就能够看懂,初学者看的不是很明白也没有关系,可以先拿这些代码在程序中使用。在实践中就会慢慢的理解这些代码的含义了。

最后祝愿大家学习愉快,在这里可以下载到这篇文章的源代码:http://down.51cto.com/data/137061

分享到:
评论

相关推荐

    Cocos2d x实例 场景切换

    在Cocos2d-x游戏开发中,场景(Scene)是游戏世界的基本构建单元,它代表了一个独立的游戏状态或者说是屏幕上的一个可视...通过实际操作和调试,你将对Cocos2d-x的场景管理有更深入的理解,为游戏开发打下坚实基础。

    cocos2d-x游戏源码

    此外,cocos2d-x提供了丰富的图形渲染功能,如精灵、层、场景、动作等,方便开发者构建各种游戏元素。在游戏逻辑层面,cocos2d-x的事件处理系统和定时器使得游戏逻辑的编写变得简单易懂。 闯关类游戏通常包含多个...

    cocos2d-x菜单

    例如,我们可以在主菜单场景中创建一个MenuItem,当用户点击时,触发相应的事件处理函数,切换到新的游戏场景。 此外,cocos2d-x的事件系统使得菜单的交互变得非常灵活。通过`EventListenerTouchOneByOne`,我们...

    cocos2d 塔防游戏

    在游戏开发领域,cocos2d是一个广泛使用的2D游戏引擎,尤其适合初学者入门。本篇将深入探讨如何利用cocos2d构建一款塔防游戏,从基础概念到实战技巧,全方位解析这一过程。 一、cocos2d简介 cocos2d是一款开源的2D...

    Cocos2d-x游戏暂停、继续游戏、重新开始界面的实现---之游戏开发《赵云要格斗》

    本文将详细讲解如何使用Cocos2d-x框架来设计和实现这样的功能,以《赵云要格斗》这个游戏为例。 Cocos2d-x是一个流行的开源跨平台2D游戏开发框架,它基于C++,支持多种操作系统,包括iOS、Android和Windows等。在...

    cocos2d-x 跑酷源码

    3. `lua`:Lua脚本文件夹,cocos2d-x支持使用Lua作为脚本语言,提供灵活的游戏逻辑实现。 4. `proj.android` / `proj.ios_mac`:针对不同平台的构建项目,用于编译和打包应用。 二、cocos2d-x基础组件 1. `Scene`...

    Cocos2d-X斗地主游戏完整源码

    5. **游戏场景和层级**:Cocos2d-X使用场景(Scene)和层级(Layer)的概念来组织游戏的视觉元素。场景是游戏的顶级容器,而层级则在场景内部管理不同的游戏组件,如菜单、游戏界面、动画效果等。 6. **UI设计**:...

    cocos2d-x游戏实例-纵版射击游戏

    在这个实例中,开发者将深入学习如何利用Cocos2d-x构建一个完整的游戏场景,包括游戏主菜单、游戏关卡、角色控制、敌人生成、子弹系统、碰撞检测以及得分系统等多个关键组成部分。 首先,游戏主菜单的设计是游戏的...

    cocos2d 游戏菜单设置v1

    在iOS游戏开发中,Cocos2D是一个非常流行的2D游戏引擎,它为开发者提供了丰富的功能,包括场景管理、精灵、动作、物理引擎等。在这个“cocos2d 游戏菜单设置v1”项目中,我们将探讨如何利用Cocos2D来创建游戏菜单,...

    《Cocos2d-Js开发之旅-从HTML5到原生手机游戏》完整源码

    9. **游戏存档**:通过源码,你可以了解如何使用Cocos2d-Js保存和读取游戏进度,例如使用JSON或本地存储。 10. **性能优化**:书中的源码可能包含了性能优化技巧,如减少不必要的绘制、合理使用缓存、避免内存泄漏...

    游戏开发案例cocos2d

    总结起来,“愤怒的小鱼”这款游戏案例充分展示了cocos2d在2D游戏开发中的强大功能,包括场景、层、精灵的组织结构,动画和动作的实现,物理引擎的应用,事件处理机制,以及音频管理和脚本支持。通过对这个游戏的...

    Cocos2d-x游戏引擎实战开发炸弹超人

    《Cocos2d-x游戏引擎实战开发炸弹超人》是一个基于Cocos2d-x框架的2D游戏开发教程,旨在帮助开发者深入理解并熟练运用这一强大的游戏引擎。Cocos2d-x是一个开源、跨平台的2D游戏开发工具,它支持iOS、Android、...

    精选_基于Cocos2d-x实现的RunOrDie小游戏_源码打包

    本文将深入探讨如何使用Cocos2d-x来实现"RunOrDie"这一款小游戏,旨在帮助读者理解Cocos2d-x的基本工作原理以及游戏开发流程。 一、Cocos2d-x简介 Cocos2d-x是Cocos2d家族的一员,它具有跨平台的优势,可以在iOS、...

    Cocos2d-x跑酷(StarterKit)游戏源码

    这个"跑酷(StarterKit)游戏源码"是基于Cocos2d-x框架构建的一个Android游戏项目,旨在为开发者提供一个基础的跑酷类游戏模板,帮助他们快速入门游戏开发。 在分析这个源码时,我们可以学习到以下关键知识点: 1....

    使用Cocos2d-X开发中国象棋

    1. **场景管理**:在Cocos2d-X中,游戏逻辑通常被组织为不同的“Scene”(场景),例如游戏主界面、游戏进行中的棋盘界面、胜利或失败的结果界面。开发者需要创建并管理这些场景之间的切换,确保游戏流程的顺畅。 2...

    迷失航线-Cocos2d-x项目实战-射击类游戏-关东升

    《迷失航线》是一款基于Cocos2d-x框架开发的射击类游戏,专为移动设备设计。Cocos2d-x是一个开源的游戏开发框架,它使用C++作为主要编程语言,同时支持Lua和JavaScript,广泛应用于2D游戏开发。在这个项目实战中,...

    cocos2d-x 游戏小demo

    通过这个cocos2d-x的小demo,开发者不仅可以了解cocos2d-x的基本使用,还能掌握如何用它来构建一个完整的游戏,包括游戏逻辑、界面设计、交互实现等多个方面。对于初学者来说,这是一个很好的实践项目,有助于加深对...

    俄罗斯方块cocos2d-x_10831

    在cocos2d-x中实现“俄罗斯方块”,首要任务是创建游戏场景和游戏对象。我们可以使用cocos2d-x的精灵(Sprite)类来表示方块,每个单元块可以是一个单独的精灵。然后,我们需要一个游戏板(Grid)类来管理屏幕上的...

Global site tag (gtag.js) - Google Analytics