cocos2d-x 3.0 导演,场景,层,精灵

导演(Director)

一款游戏好比一部电影,只是游戏具有更强的交互性,不过它们的基本原理是一致的。所以在Cocos2dx中把统筹游戏大局的类抽象为导演(Director),Director是整个cocos2dx引擎的核心,是整个游戏的导航仪,游戏中的一些常用操作就是由Director来控制的,比如OpenGL ES的初始化,场景的转换,游戏暂停继续的控制,世界坐标和GL坐标之间的切换,对节点(游戏元素)的控制等,还有一些游戏数据的保存调用,屏幕尺寸的获取等都要由Director类来管理控制的。因为Director是游戏项目的总导演,会经常调用进行一些控制,所以该Director利用了单件设计模式,也就是项目里取到的director都是同一个。
    获得导演类Director实例语句

auto director = Director :: getInstance();

场景(Scene)

Scene场景也是cocos2dx中必不可少的元素,游戏中通常我们需要构建不同的场景(至少一个),游戏里关卡、版块的切换也就是一个一个场景的切换,就像在电影中变换舞台和场地一样。场景的一个重要的作用就是流程控制的作用,我们可以通过Director的一系列方法控制游戏中不同的场景的自由切换。

下面是Director控制场景的常用方法:

  • runWithScene( Scene *scene ) 启动游戏,并运行scene场景。本方法在主程序第一次启动主场景的时候调用。如果已有正在运行的场景则不能调用该方法;会调用pushScene-->startAnimation。
  • pushScene( Scene *scene ) 将当前运行中的场景暂停并压入到代码执行场景栈中,再将传入的scene设置为当前运行场景,只有存在正在运行的场景时才调用该方法;
  • replaceScene( Scene *scene ) 直接使用传入的scene替换当前场景来切换画面,当前场景被释放。这是切换场景时最常用的方法。
  • popScene() 释放当前场景,再从代码执行场景中弹出栈顶的场景,并将其设置为当前运行场景。如果栈为空,直接结束应用。和PushScene结对使用
  • end() 释放和终止执行场景,同时退出应用
  • pause() 暂停当前运行场景中的所有计时器和动作,场景仍然会显示在屏幕上
  • resume () 恢复当前运行场景的所有计时器和动作,场景仍然会显示在屏幕上

同时场景是层的容器,包含了所有需要显示的游戏元素。通常,当我们需要完成一个场景时候,会创建一个Scene的子类,并在子类中实现我们需要的功能。比如,我们可以在子类的初始化中载入游戏资源,为场景添加层,启动音乐播放等等。

层(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的场景中有三个不同层,在layer3层上又有上个不同的精灵。

下面是一个创建三个不同层的例子:

auto layer = LayerColor::create(Color4B(0, 128, 128, 255));
layer->setContentSize(CCSizeMake(120, 80));
layer->setPosition(Point(50, 50));
addChild(layer, 10);
auto layer1 = LayerColor::create(Color4B(128, 0, 128, 255));
layer1->setContentSize(CCSizeMake(120, 80));
layer1->setPosition(Point(100, 80));
addChild(layer1, 20);
auto layer2 = LayerColor::create(Color4B(128, 128, 0, 255));
layer2->setContentSize(CCSizeMake(120, 80));
layer2->setPosition(Point(150, 110));
addChild(layer2, 30);

  

精灵

Cocos2d中的精灵和其他游戏引擎中的精灵相似,它可以移动,旋转,缩放,执行动画,并接受其他转换。Cocos2dx的Sprite由Texure,frame和animation组成,由openes负责渲染。 简单过程可描述为:使用Texture2D加载图片,可以用Texture2D生成对应的SpriteFrame(精灵帧),将SpriteFrame添加到Animation生成动画数据,用Animation生成Animate(就是最终的动画动作),最后用Sprite执行这个动作。

创建精灵的几种方式:

  • 直接创建:

    auto sprite = Sprite::create("HelloWorld.png");
    this->addChild(sprite,0);
  • 使用纹理来创建精灵

    auto sprite1 = Sprite::createWithTexture(TextureCache::getInstance()>addImage("HelloWorld.png"));
    this->addChild(sprite1, 0);
  • 使用精灵帧来创建精灵

    auto sprite2=Sprite::createWithSpriteFrameName("HelloWorld.png"); 
    this->addChild(sprite2, 0);

在Cocos2dx中实现精灵显示的基本过程如下:

//创建Scene
auto scene = Scene::create();
//创建层
auto layer = HelloWorld::create();
//把层加入场景中
scene->addChild(layer);
//创建一个精灵
auto sprite = Sprite::create("HelloWorld.png");
//把精灵加到层里
layer->addChild(sprite, 0);

  

转自:http://cn.cocos2d-x.org/article/index?type=cocos2d-x&url=/doc/cocos-docs-master/manual/framework/native/v3/basic-concepts/zh.md

cocos2d-x 3.0 导演,场景,层,精灵,布布扣,bubuko.com

时间: 2024-10-01 23:41:10

cocos2d-x 3.0 导演,场景,层,精灵的相关文章

如何在Cocos2D 1.0 中掩饰一个精灵(六)

大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处. 如果觉得写的不好请告诉我,如果觉得不错请多多支持点赞.谢谢! hopy ;) 掩饰一个精灵:实现代码 打开HelloWorldLayer.m并且在init方法上方添加如下方法: - (CCSprite *)maskedSpriteWithSprite:(CCSprite *)textureSprite maskSprite:(CCSprite *)maskSprite { // 1 CCRenderTexture * rt = [CCRe

cocos2dx层精灵、以及精灵的动画与动作

层 精灵 精灵不一定是静态的.通常,一个精灵可以不断变化,变化的方式包括:移动.旋转.缩放.变形.显现消失.动画效果 (类似 GIF 动画)等.精灵按照层次结构组合起来,并与玩家互动,构成了一个完整的游戏. 从绘图的角度来说,图形按照自上而下的顺序绘 制出来.为了绘制场景,需要绘制场景中的层,为了绘制层,需要绘制层中的精灵.因此,关系图实质上安排了图元的绘 图方式,关系图中的每一个元素称作节点(node),关系图则称作渲染树(rendering tree).渲染场景的过程就是遍历 渲染树的过程.

高屋建瓴 cocos2d-x-3.0架构设计 Cocos2d (v.3.0) rendering pipeline roadmap(原文)

Cocos2d (v.3.0) rendering pipeline roadmap Why (the vision) The way currently Cocos2d does rendering is good but it is beginning to feel somehow antiquate and moreover it doesn't actually leverage modern multi core CPUs so popular nowadays on most mo

cocos2d之创建自己的场景类

|   版权声明:本文为博主原创文章,未经博主允许不得转载. 1. 首先创建.h的头文件,然后在将一些图片声音素材加到resource文件夹内,最后在创建.cpp文件:         .h头文件中创建一个类,此类一般继承自Layer,首先有一个静态的创建场景的方法,然后是一个初始化方法,还有一个CREATE_FUNC宏: .cpp中就是对.h中class中定义的方法来进行实现 效果图: 代码: MyGameScene.h: 1 #ifndef _MYGAME_SCENE_H_ 2 #defin

最新版本号cocos2d­2.0­x­2.0.2使用新资源载入策略!不再沿用-hd、-

?? 前段时间cocos2dx更新了最新版本号cocos2d-2.0-x-2.0.2.也从这个版本号開始对于资源载入与管理都改变了策略. 在之前的载入方式都是通过沿用与cocos2d-iphone一样的载入资源方式,对于图片名后加入-hd,-ipad,-ipadhd方式,当用户开启项目的高清视网膜后就能够默认寻找相应的资源.可是从cocos2d-2.0-x-2.0.2版本号開始,资源载入策略不在如此了.对跨平台整合不清楚的请看cocos2dx最新2.x版本号跨平台整合NDK+Xcode 最新资源

蓝牙4.0的LM层说明

1.概念 The Link Manager Protocol (LMP) is used to control and negotiate all aspects of the operation of the Bluetooth connection between two devices. This includes the set-up and control of logical transports and logical links, and for control of physi

Cocos2xd__场景(层)的生命周期

生命周期函数: 1. bool init():初始化场景时调用 2. void onEnter():进入场景时调用 3. void onEnterTransitionDidFinish():进入场景且过度动画结束时调用 4. void onExit():退出场景时调用 5. void onExitTransitionDidStart():退出场景且开始过度动画时调用 6. void cleanup():场景对象被清除时调用 如: virtual void onEnter() override {

cocos2dx 3.x(场景(层)的生命周期)

1 //进入当前层初第一步始化层调用 2 bool GameScence::init() 3 { 4 if( !void init() ) 5 { 6 returnfalse; 7 } 8 9 log("进入当前层初第一步始化层调用"); 10 11 return true; 12 } 13 14 //进入当前层的时候调用 15 void GameScence::onEnter() 16 { 17 //在.h文件中定义 18 //void onEnter(); 19 log("

Cocos2D将v1.0的tileMap游戏转换到v3.4中一例(五)

大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处. 如果觉得写的不好请告诉我,如果觉得不错请多多支持点赞.谢谢! hopy ;) 为了暂时不影响原来的cat移动方法,我们在CatSprite.m中新建一个移动方法,内容如下,其中考虑了与地图的碰撞情况: -(void)moveTowardOneTile:(CGPoint)location{ CGPoint diff = ccpSub(location, self.position); CGPoint desiredTileCoord = [