COCOS2D-x
主题
- 项目前准备
- 简单基本概念介绍
项目前准备:
1:下载官方cocos2d-x开发SDK
2:解压缩然后进入cocos2d-x-xxxx文件目录
3:打开终端运行;
关于参数:
HelloCocos2d 项目名称
-p 后面接包名
-l 后面是开发类型,cpp,lua,ls三种类型。
-d 后面是项目存放的目录
简单基本概念介绍
游戏基本上都要理解几个概念:导演 , 场景 , 层, 精灵。
COCOS2d 3.x 引擎版本中,采用节点树形结构管理游戏对象的,一个游戏可以分为不同的场景,一个场景又可能分为不同的层,一个层又可以有很多节点Node
按照上面的分
(摘自COCOS2D官方文档)
按照上面的图可以看出来,一个导演类管理所有的东西,就像一个电影里面导演的概念一样,我要拍摄 小鱼,你不能拍摄猫啊,老子说的算。
导演(Direcotr)
游戏比如电影,管理大局的是导演,导演是Cocos2dx引擎的核心,游戏的场中操作就是由 导演 来充值的。OpenGL ES的初始化, 场景的切换,游戏暂停继续啊。还有世界坐标与GL坐标之间的转换,对节点的控制。保存游戏数据,等等都是由导演控制的。
导演当然是唯一一个了。COCOS2D采用的是设计模式中的单例模式;
Direcotr->getInstance() 获取导演的实例。
导演的常用方法。
runWithScene(Scene *scene) 运行Scene 场景,这个方法只在第一次启动场景的时候调用。
pushScene(Scene *scene) 压入场景栈,暂停场景。
replaceScene(Scene *scene),替换当前的场景,被替换的场景进行释放。
popScene() 释放当前场景,存储在栈类场景弹上来,如果栈内没有,结束程序。
end(); 释放,退出应用。
pause() 暂停场景。
resume() 恢复当前场景。
场景是容器,包含了所有要显示的元素。
层(Layer)
Layer是处理玩家事件响应的Node子类。与场景不同。层通常包含的是直接在屏幕上呈现内容,并且可以接受用户的输入事件,包括触摸,加速 和键盘输入。
场景添加层:
addChild(Node child) addChild(Node child,int Zorder) addChild(Node child,int Zorder,int tag) 因为函数返回的还是层,所以可以添加。
其中第一个参数是要添加的节点。
第二个参数:不是准确的说 就是Layer 层叠的顺序,
第三个参数 就是 tag 识别这个layer的
例子:
auto layer1 = LayerColor::create(Color4B(100,100,100));
layer1->setContentSize(CCSizeMake(120,80));//设置大小。
layer1-<setPosition(Point(150,110));//设置屏幕显示的位置。
精灵:
精灵,可以在脑中想象一下人物,角色,甚至一辆车,一盏灯都是一个精灵。它可以移动,旋转,缩放,执行动画,并接受其他转换。
Sprite 由 Texure frame animation 组成。 openes负责渲染。
简单用法:
Texture2D 加载图片,可以使用Texture2D生成对应的SpriteFrame 精灵帧,然后将他添加到Animation生成动画数据,然后用Animation生成Animate 动画动作,然后Sprite执行这个动作。
创建精灵:
auto sprite = Sprite::create(“person.png”);
this->addChild(sprite,0); 第二个参数 是Zorder
2:使用纹理来创建
auto sprite1 = Sprite::createWithTexture(TextureCache::getInstance()->addImage(“person.png”));
this->addChild(sprite1,0)//添加
使用精灵帧来创建
auto sprite2 = Sprite::createWithSpriteFrameName(“ddd.png”);
this->addChild(sprite2,0);
调度器(Scheduler)
原理:
调度器为游戏提供定时事件和定时调用服务,所有Node对象都知道如何调用和取消调度事件,调度器好处
1.每当Node不再可见或已经从场景移除时,调度器会停止。
2.暂停时,调度器也会暂停,重新开始,调度器重新开始。
3.封装了不同平台下使用的调度器,使用此调度器你不用关心和跟所你所设定的定时对象的销毁和停止,以及崩溃的风险。
游戏中我们经常会随时间的变化而做一些逻辑判断,如碰撞检测。
调度器三种:
1:默认调度器。
schedulerUpdate();
2:自定义调度器;
schedule(SEL_SCHEDULE selector, float interval, unsigned int repeat, float delay)
3.单次调度器:
scheduleOne(SEL_SCHEDULE selector,float delay)
默认调度器:
通过schedulerUpdate,每帧调用update方法,如果需要暂停这个调度器,可以使用unschedulerUpdate()方法。
HelloWorld::update(float dt)
{
}
自定义调度器
有的时候我们不需要调用那么频繁,还有可以提高性能。
schedule(schedule_selector(HelloWorld::updateCustom), 1.0f, kRepeatForever, 0);
void HelloWorld::updateCustom(float dt)
{
log("Custom");
}
我们来看下scheduler(SEL_SCHEDULE selector, float interval, unsigned int repeat, float delay)函数里面的参数:
1. 第一个参数selector即为你要添加的事件函数
2. 第二个参数interval为事件触发时间间隔
3. 第三个参数repeat为触发一次事件后还会触发的次数,默认值为kRepeatForever,表示无限触发次数
4. 第四个参数delay表示第一次触发之前的延时
单词调度器
unschedule(SEL_SCHEDULE selector, float delay) 取消。
bool HelloWorld::init()
{
...
scheduleOnce(schedule_selector(HelloWorld::updateOnce), 0.1f);
return true;
}
void HelloWorld::updateOnce(float dt)
{
log("Once");
}
调用方法。