本人的习惯,在学习时一支笔、一个记事本伴随其身,记录下思路,应该这就是屌丝的气息,用不惯高大上的blog,其实说穿了是文笔不行,每每写的东西都词不达意,怕大家看到了会受误导。这次转blog是因为笔记本太多了,找以前记过的文章太费劲。好了,不费口水了,记录点点滴滴,从自己做起。下面就是记录下我学cocos2dx的点点滴滴。鉴于本人才疏学浅,如有不正之处,请多多谅解,不喜勿喷。
基本概念:
稍微有点接触过的cocos的都知道,cocos中最重要的几个概念就是导演(Director)、场景(Scene)、层(Layer,有的人习惯叫法为布景层)、精灵(Sprite)、节点(Node)等。导演控制着游戏的整个流程,而游戏流程的执行是通过切换一个个的场景来达到目的的,场景中又可以分为不同的层,一个层中又可以拥有任意多个的可见节点。下图是cocos2dx官网上的原图。
导演:
Director类是整个cocos2d引擎的核心,它控制着整个游戏的流程 (即场景的切换) ,包括获取窗体大小、投影类型、帧率设置、openGlView的设置和获取、事件分发、调度器的获取和设置等。我们可以通过调用 sharedDirector() / getInstance() 来获取我们Director实例,它采用单例设计模式,以便更好的管理和简化Director的操作。查看Cocos的源代码可以知道, virtual void setAnimationInterval(double interval) = 0; 为纯虚函数,所以Director类为抽象类,不能实例化。因此可以推出真正获取到的是一个指向Director子类的实例。具体可看cocos的源代码,它获取的 DisplayLinkDirector 的实例。 (注: sharedDirector()方法是3.x版本之前的,已不在维护,但是仍可用)
场景:
Scene类虽然很重要,但其实在Cocos中的代码不是很多,具体可以自行阅读,它派生自Node类,它的作用就是构建一个游戏中可见节点运行的环境,类似于唱大戏中的舞台,可以对舞台进行不同的装饰,并在之上表演不同的剧情。游戏中,切换场景就是代表着游戏的流程的执行过程。而控制场景切换是由Director类执行的。Director类提供了常见的操作场景的方法:
- runWithScene( Scene *scene ) 启动游戏,并运行scene场景。本方法在主程序第一次启动主场景的时候调用。如果已有正在运行的场景则不能调用该方法;会调用pushScene-->startAnimation。
- pushScene( Scene *scene ) 将当前运行中的场景暂停并压入到代码执行场景栈中,再将传入的scene设置为当前运行场景,只有存在正在运行的场景时才调用该方法;
- replaceScene( Scene *scene ) 直接使用传入的scene替换当前场景来切换画面,当前场景被释放。这是切换场景时最常用的方法。
- popScene() 释放当前场景,再从代码执行场景中弹出栈顶的场景,并将其设置为当前运行场景。如果栈为空,直接结束应用。和PushScene结对使用
- end() 释放和终止执行场景,同时退出应用
- pause() 暂停当前运行场景中的所有计时器和动作,场景仍然会显示在屏幕上
- resume () 恢复当前运行场景的所有计时器和动作,场景仍然会显示在屏幕上
层:
Layer是处理玩家事件响应的Node子类。与场景不同,层通常包含的是直接在屏幕上呈现的内容,并且可以接受用户的输入事件,包括触摸,加速度计和键盘输入等。层可以包含任何Node作为子节点,包括Sprites(精灵), Labels(标签),甚至其他的Layer对象。并设置游戏元素的属性,比如位置,方向和大小;设置游戏元素的动作等。 (注: 场景也可以直接在屏幕上显示内容哦,但是一般不直接在场景中显示内容)
精灵:
Cocos2d中的精灵和其他游戏引擎中的精灵相似,它可以移动,旋转,缩放,执行动画,并接受其他转换。Cocos2dx的Sprite由Texure,frame和animation组成,由openes负责渲染。主要的类关系如下: 简单过程可描述为:使用Texture2D加载图片,可以用Texture2D生成对应的SpriteFrame(精灵帧),将SpriteFrame添加到Animation生成动画数据,用Animation生成Animate(就是最终的动画动作),最后用Sprite执行这个动作。
创建精灵的三种方法:
1、直接创建精灵。
1 auto sprite = Sprite::create("helloworld.png");2 this->addChild(sprite, 0);
2、 使用纹理创建精灵。
1 auto sprite = Sprite::createWithTexture(TextureCache::getInstance()->addImage("helloworld.png");2 this->addChild(sprite, 0);
3、使用精灵帧来创建精灵。
1 auto sprite = Sprite::createWithSpriteFrameName("helloworld.png");2 this->addChild(sprite, 0);
第一篇Cocos的文章,先引个场,后面继续笔记下去,虽然一篇blog的时间比较长,但为以后服务更加方便。