导演、场景、层、精灵
2015-08-11 08:56
316 查看
游戏运行的基本框架:
导演(director)
游戏就跟电影一样需要一个导演来控制游戏运行的进程:
上述代码即为导演的创建,因为导演只有一个,所以采用单例模式,由 getInstance() 获得导演唯一实例
场景(Scene)
在cocos2d-x里相当于一个容器的作用,用于包含下面的layer。体现在手机当中的就是当前所运行的手机画面,但这种画面是由layer来填充的,如果scene本身不包含任何layer,他只能是黑屏。
下面是Director控制场景的常用方法:
runWithScene( Scene *scene ) 启动游戏,并运行scene场景。本方法在主程序第一次启动主场景的时候调用。如果已有正在运行的场景则不能调用该方法;会调用pushScene-->startAnimation。
pushScene( Scene *scene ) 将当前运行中的场景暂停并压入到代码执行场景栈中,再将传入的scene设置为当前运行场景,只有存在正在运行的场景时才调用该方法;
replaceScene( Scene *scene ) 直接使用传入的scene替换当前场景来切换画面,当前场景被释放。这是切换场景时最常用的方法。
popScene() 释放当前场景,再从代码执行场景中弹出栈顶的场景,并将其设置为当前运行场景。如果栈为空,直接结束应用。和PushScene结对使用
end() 释放和终止执行场景,同时退出应用
pause() 暂停当前运行场景中的所有计时器和动作,场景仍然会显示在屏幕上
resume () 恢复当前运行场景的所有计时器和动作,场景仍然会显示在屏幕上
层(Layer)
Layer是处理玩家事件响应的Node子类。与场景不同,层通常包含的是直接在屏幕上呈现的内容,并且可以接受用户的输入事件,包括触摸,加速度计和键盘输入等。我们需要在层中加入精灵,文本标签或者其他游戏元素,并设置游戏元素的属性,比如位置,方向和大小;设置游戏元素的动作等。通常,层中的对象功能类似,耦合较紧,与层中游戏内容相关的逻辑代码也编写在层中,在组织好层后,只需要把层按照顺序添加到场景中就可以显示出来了。要向场景添加层,我们可以使用addChild方法。
其中,Child参数就是节点。对于场景而言,通常我们添加的节点就是层。先添加的层会被置于后添加的层之下。如果需要为它们指定先后次序,可以使用不同的zOrder值。tag是元素的标识号码,如果为子节点设置了tag值,就可以在它的父节点中利用tag值就可以找到它了。层可以包含任何Node作为子节点,包括Sprites(精灵),
Labels(标签),甚至其他的Layer对象。
上面这张图代表了一个HelloWorldScene场景中包含了三个不同的层(layer),layer3中包含了三个精灵
精灵(Sprite)
精灵实际上就是一张张贴图,就比如上图中的三张layer和layer3中的三个图案都是精灵。
创建精灵:
1,直接创建
2,使用纹理来创建
3,使用精灵帧来创建
当然还有一种方式是在游戏开始时采用预加载的方式将plist文件(合图)存储到精灵帧缓存中,然后等用到的时候在创建
1,SpriteFrameCache:
把截取好的纹理信息保存在一个精灵框帧内,精灵通过切换不同的框帧来显示出不同的图案。但与TextureCache不同的是:内存池中查找不到的图片。会提示找不到,不会到本地去加载
2,TextureCache:
最底层也是最有效的纹理缓存,缓存的是加载到内存中的纹理资源,也就是图片资源。
精灵实现的基本过程:
导演(director)
游戏就跟电影一样需要一个导演来控制游戏运行的进程:
auto director = Director::getInstance();
上述代码即为导演的创建,因为导演只有一个,所以采用单例模式,由 getInstance() 获得导演唯一实例
场景(Scene)
在cocos2d-x里相当于一个容器的作用,用于包含下面的layer。体现在手机当中的就是当前所运行的手机画面,但这种画面是由layer来填充的,如果scene本身不包含任何layer,他只能是黑屏。
下面是Director控制场景的常用方法:
runWithScene( Scene *scene ) 启动游戏,并运行scene场景。本方法在主程序第一次启动主场景的时候调用。如果已有正在运行的场景则不能调用该方法;会调用pushScene-->startAnimation。
pushScene( Scene *scene ) 将当前运行中的场景暂停并压入到代码执行场景栈中,再将传入的scene设置为当前运行场景,只有存在正在运行的场景时才调用该方法;
replaceScene( Scene *scene ) 直接使用传入的scene替换当前场景来切换画面,当前场景被释放。这是切换场景时最常用的方法。
popScene() 释放当前场景,再从代码执行场景中弹出栈顶的场景,并将其设置为当前运行场景。如果栈为空,直接结束应用。和PushScene结对使用
end() 释放和终止执行场景,同时退出应用
pause() 暂停当前运行场景中的所有计时器和动作,场景仍然会显示在屏幕上
resume () 恢复当前运行场景的所有计时器和动作,场景仍然会显示在屏幕上
层(Layer)
Layer是处理玩家事件响应的Node子类。与场景不同,层通常包含的是直接在屏幕上呈现的内容,并且可以接受用户的输入事件,包括触摸,加速度计和键盘输入等。我们需要在层中加入精灵,文本标签或者其他游戏元素,并设置游戏元素的属性,比如位置,方向和大小;设置游戏元素的动作等。通常,层中的对象功能类似,耦合较紧,与层中游戏内容相关的逻辑代码也编写在层中,在组织好层后,只需要把层按照顺序添加到场景中就可以显示出来了。要向场景添加层,我们可以使用addChild方法。
addChild( Node child ) addChild( Node child, int zOrder ) addChild( Node *child, int zOrder, int tag)
其中,Child参数就是节点。对于场景而言,通常我们添加的节点就是层。先添加的层会被置于后添加的层之下。如果需要为它们指定先后次序,可以使用不同的zOrder值。tag是元素的标识号码,如果为子节点设置了tag值,就可以在它的父节点中利用tag值就可以找到它了。层可以包含任何Node作为子节点,包括Sprites(精灵),
Labels(标签),甚至其他的Layer对象。
上面这张图代表了一个HelloWorldScene场景中包含了三个不同的层(layer),layer3中包含了三个精灵
精灵(Sprite)
精灵实际上就是一张张贴图,就比如上图中的三张layer和layer3中的三个图案都是精灵。
创建精灵:
1,直接创建
auto sprite = Sprite::create("HelloWorld.png"); this->addChild(sprite,0);
2,使用纹理来创建
auto sprite1 = Sprite::createWithTexture(TextureCache::getInstance()->addImage("HelloWorld.png")); this->addChild(sprite1, 0);
3,使用精灵帧来创建
auto sprite2=Sprite::createWithSpriteFrameName("HelloWorld.png"); this->addChild(sprite2, 0);
当然还有一种方式是在游戏开始时采用预加载的方式将plist文件(合图)存储到精灵帧缓存中,然后等用到的时候在创建
SpriteFrameCache *frameCache = SpriteFrameCache::getInstance(); frameCache->addSpriteFramesWithFile("boy.plist","boy.png");//boy.png里集合了boy1.png,boy2.png这些小图 auto frame_sp = Sprite::createWithSpriteFrameName("boy1.png");//从SpriteFrameCache缓存中找到boy1.png这张图片. this->addChild(frame_sp,2);
SpriteFrameCache vs. TextureCache
1,SpriteFrameCache:把截取好的纹理信息保存在一个精灵框帧内,精灵通过切换不同的框帧来显示出不同的图案。但与TextureCache不同的是:内存池中查找不到的图片。会提示找不到,不会到本地去加载
2,TextureCache:
最底层也是最有效的纹理缓存,缓存的是加载到内存中的纹理资源,也就是图片资源。
精灵实现的基本过程:
/创建Scene auto scene = Scene::create(); //创建层 auto layer = HelloWorld::create(); //把层加入场景中 scene->addChild(layer); //创建一个精灵 auto sprite = Sprite::create("HelloWorld.png"); //把精灵加到层里 layer->addChild(sprite, 0);
相关文章推荐
- PHP基础----01PHP标记符
- HDU 3530 Subsequence
- 解决 FusionCharts3.2.1 首页无法载入的问题
- FusionCharts3.2.1 参数的详细说明和功能特性
- C++ Primer 第(1-3)章一句话知识点总结
- 基于CXF WebService(4)高级属性之Invoker
- 架构师速成-有关架构的思考
- FusionCharts 3.2.1 常用用法
- JS 实现中英文逗号的替换
- 关于Unicode字符集
- excel数据透视表列名更改
- 对Yii 2.0模型rules的理解(load()无法正确装载数据)
- 右键新建没有Word_Excel_PowerPoint的解决方法
- Xampp中mysql错误
- UVA 10891 - Game of Sum*
- Binary Tree Preorder Traversal
- mybatis异常:Improper inline parameter map format. Should be: #{propName,attr1=val1,attr2=val2}问题分析及解决
- 创建属于自己的代码仓库吧!
- uva10341(解方程)
- Swift学习笔记之函数