cocos2d游戏引擎介绍

来源:互联网 发布:刘燕妮 知乎 编辑:程序博客网 时间:2024/05/05 15:15

目录:

Cocos2D游戏引擎介绍
Cocos2D游戏引擎安装
Cocos2D基本概念
Cocos2D游戏动作
Cocos2D的Touch事件
帧动画序列制作工具介绍




一、Cocos2d游戏引擎介绍

Cocos2d是一个开源框架,用于构建2D游戏、演示程序和其他图形界面交互应用等.

主要功能:
1.流程控制(Flow control):非常容易地管理不同场景(scenes)之间的流程控制
2.精灵(Sprites):快速而方便的精灵
3.动作(Actions):告诉精灵们该做什么。可组合的动作如移动(move)、旋转(rotate)和缩放(scale)等更多
4.特效(Effects):特效包括波浪(waves)、旋转(twirl)和透镜(lens)等更多
5.平面地图(Tiled Maps):支持包括矩形和六边形平面地图
6.转换(Transitions):从一个场景移动到另外一个不同风格的场景
7.菜单(Menus):创建内部菜单
8.文本渲染(Text Rendering):支持标签和HTML标签动作
9.文档(Documents):编程指南 + API参考 + 视频教学+ 很多教你如何使用的简单测试例子
10.基于Pyglet:没有外部的依赖
11.基于OpenGL:支持硬件加速


二、Cocos2d游戏引擎安装

说明:从0.99.0版本开始,Cocos2d-iPhone的模板类要求苹果SDK3.0及以上版本。

1.下载:cocos2d-iphone最新版0.99.5;
2.打开Terminal工具,进入Cocos2d-iPhone-0.99.5目录下;
3.执行命令:./install_template.sh
4.安装完毕后启动Xcode,打开菜单File->New Project,出现如下视图



三、Cocos2d基本概念

开发cocos2d应用程序,必须先了解如下四个概念:

1.Scenes(场景)

   是app 工作流上独立块。一个app可能拥有多个scenes, 但在任何时候只能有一个是激活状态的。一个CCScene对象由一个或多个layers组成,layers之间是前后相连的。layer提供了scene的外观 appearance和行为behavior.

2.Director(导演)

    CCDirector负责scenes之间的前进或后退。CCDirector是singleton模式的共享的对象,它知道当前哪个scene是激活。

3.Layers(层)

    CCLayer对象定义了可描绘的区域,定义了描绘的规则。当编写cocos2d程序的时候,大部分工作就是编写CCLayer的子类去实现所要的效果。 

4.Sprites(精灵)

    sprite对象就是一个可以移动、选择、伸缩、动画的2d图形,CCSprite 对象的子成员中可以包含其它的CCSprite 对象。






四、Cocos2d游戏动作


(一)基本动作

1.瞬时动作——马上就完成的动作
放置——Place
隐藏——Hide
显示——Show
可见切换——ToggleVisibility





2.延时动作——完成需要一定的时间
移动到——CCMoveTo
移动——CCMoveBy
跳跃到——CCJumpTo
跳跃——CCJumpBy
贝塞尔——CCBezierBy
放大到——CCScaleTo
放大——CCScaleBy
旋转到——CCRotateTo
旋转——CCRotateBy
闪烁——CCBlink
色调变化到——CCTintTo
色调变化——CCTintBy
变暗到——CCFadeTo
由无变亮——CCFadeIn
由亮变无——CCFadeOut

  延时动作就是指动作的完成需要一定时间。因此,actionWithDuration是延时动作执行是第一个参数,延时动作的共同基类是CCIntervalAction。

(二)组合动作

组合动作就是指按照一定的次数将不同的基本动作组合起来,形成连贯的一套组合动作。

组合动作主要包括以下几类:
序列CCSequence:线序排列若干个动作,然后按先后次序逐个执行。
同步Spawn:同时并列执行若干个动作,但要求动作都必须是可以同时执行的。
重复有限次数Repeate:重复执行有限的次数的动作。
反动作Reverse:反向或逆向执行某个动作,支持针对动作序列的反动作序列。
动画Animation:就是让精灵自身的连续执行一段影象,形成模拟运动的效果。
无限重复RepeatForever:无限期执行某个动作或动作序列,直到被停止。


(三)CallFunc Actio

CallFunc Action 允许你可以在一个action里面调用一个方法。在序列action里面的最后一个调用,会非常有用。 

 Example:

id actionTo = [MoveTo actionWithDuration: 2 position:ccp(s.width-40,s.height-40)];
id actionBy = [MoveByactionWithDuration:2  position: ccp(80,80)];
id actionCallFunc = [CallFunc actionWithTarget:self selector:@selector(doATask)];
id actionSequence = [Sequence actions: actionTo, actionBy, actionCallFunc, nil];


-(void) doATask
{

           //somecode
            }

有两种类型的CallFunc,分别是CallFuncN和CallFuncND
 CallFuncN 把node当作参数。
 CallFuncND 需要node和一个指向某个数据的指针。

Example:

id actionCallFuncN = [CallFuncN actionWithTarget:self selector:@selector(doATaskN:)];
id actionCallFuncND = [CallFuncND actionWithTarget:self selector:@selector(doATaskN:data:) [/pre]data:pointerToSomeData];
- (void) doATaskN: (id)node
{//some code
}
- (void) doATaskND: (id)node data:(void*)d
{//some code
}



(四)速度变化

基本动作和组合动作实现了针对精灵的各种运动、动画效果的改变,但这样的改变的速度是不变的,
通过CCEaseAction为基类的类系和CCSpeed类可以很方便的修改精灵执行动作的速度:由快至慢还是由慢变快。
EaseIn:由慢至快。
EaseOut:由快至慢。
EaseInOut:由慢至快再由快至慢。
EaseSineIn:由慢至快。
EaseSineOut:由快至慢。
EaseSineInOut:由慢至快再由快至慢。
EaseExponentialIn:由慢至极快。
EaseExponentialOut:由极快至慢。
EaseExponentialInOut:由慢至极快再有极快至慢。
Speed:人工设定速度,还可通过SetSpeed不断调整。


五、Cocos2d的Touch事件


iPhone OS通过NSSet传递硬件传感器传来的各种组合触摸信息。
事件处理框架
1.(void)touchesBegan:(NSSet *)touches

  withEvent:(UIEvent *)event {}

2.(void)touchesMoved:(NSSet *)touches

  withEvent:(UIEvent *)event {}

3.(void)touchesEnded:(NSSet *)touches

  withEvent:(UIEvent *)event {}

4.(void)touchesCancelled:(NSSet *)touches

  withEvent:(UIEvent *)event {}


事件处理机制

核心:就是如何将系统用户输入信息传递给每个Layer对象。

1.接管:从系统iPhoneOS的标准UIView获得触摸输入。
2.分发:按照预先定义好的逻辑分发给各种注册对象。
3.处理:注册对象之间如何协调响应用户的输入。





(六)帧动画序列制作工具——Zwoptex


在cocos2d中,大部分动画都是预先渲染好的位图。然后通过动画将各个图片序列在一起播放。
Zwoptex用途
1.将多个单独的PNG图片合并成一个大的PNG图片
2.将合并之前的每一个小PNG图片在合并之后PNG图片中的位置坐标以及图片大小等进行通过参数文件记录保存,供Cocos2d程序调用。



添加动画

利用软件Zwoptex制作的png和plist文件添加动画

       // 将花朵的png图片序列和plist载入场景

        CCSpriteFrameCache *cache = [CCSpriteFrameCache sharedSpriteFrameCache];

        [cacheaddSpriteFramesWithFile:@"Flower.plist"];

        idsheet = [CCSpriteSheet spriteSheetWithFile:@"Flower.png"

                    capacity:60];

        [selfaddChild:sheet];

        // 将花朵Sprite添加到场景中

        FlowerSprite *sprite = [FlowerSprite node];

        CGSize size = [[CCDirector sharedDirector] winSize];

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

        [selfaddChild:sprite];

      CCSpriteFrameCache *cache = [CCSpriteFrameCache sharedSpriteFrameCache];

        NSMutableArray *frames = [[NSMutableArray array] retain];

        // 构造每一个帧的实际图像数据

        for (int i = 1; i <= FLOWER_SPRITE_SHEET_CAPACITY; i++) {

            NSString *frameName = [NSStringstringWithFormat:@"Flower%04d.png", i];

            CCSpriteFrame *frame = [cache spriteFrameByName:frameName];

            [framesaddObject:frame];

        }

        // 使用CCAnimation和CCRepeatForever构造一个一直重复的动画

        NSString *firstFrameName = [NSStringstringWithFormat:@"Flower%04d.png", 1];

        idsprite = [CCSprite spriteWithSpriteFrameName:firstFrameName];

        CCAnimation *animation = [CCAnimation animationWithName:@"Flower“ delay:1.0f / 30  frames:frames];

        [spriterunAction:[CCRepeatForever actionWithAction:[CCAnimate actionWithAnimation:animation restoreOriginalFrame:NO]]];

        // 将构造好的动画加入显示列表

        [self addChild:sprite];


播放声音

使用cocos2d的SimpleAudioEngine可以很简单的播放背景音乐和音效。

1,准备工作

   引入头文件:#import "SimpleAudioEngine.h"

2,播放背景音乐

   [[SimpleAudioEngine sharedEngine] playBackgroundMusic:@"background.wav"];

3,播放音效

   [[SimpleAudioEngine sharedEngine]playEffect:@"effect1.wav"];

4,暂停背景音乐

   [[SimpleAudioEngine sharedEngine] pauseBackgroundMusic];

5,预先加载背景音乐

   [[SimpleAudioEngine sharedEngine] preloadBackgroundMusic];

使用CDAudioManager来更改音乐的属性(更改属性之前必须有背景音乐在播放)

6,更改音量(音量大小从0到1)

   [CDAudioManager sharedManager].backgroundMusic.volume = 1.0f;

7,循环播放N次背景音乐

   [CDAudioManager sharedManager].backgroundMusic.numberOfLoops = N;

8,背景音乐停止时触发事件

   [[CDAudioManager sharedManager] setBackgroundMusicCompletionListener:self

                                                                                                               selector:@selector()];