【cocos2d-x】基本概念-程序员宅基地

技术标签: 1024程序员节  游戏引擎  cocos2d  Cocos2d  

项目框架

在这里插入图片描述

项目执行流程

程序启动从 main 主函数开始执行,主函数调用应用程序控制器 AppController,AppController 引用视图控制器 RootViewController 来构建游戏视图,在 AppController 的 didFinishLaunchingWithOptions 方法最后运行应用程序 Application,这时调用 AppDelete 的 applicationDidFinishLaunching 方法运行场景 HelloWorldScene,该方法实现结束,游戏进入主循环。

在这里插入图片描述


资源文件

在这里插入图片描述

  • Classes:类文件
  • cocos2d:Cocos2d-x源码包
  • Resources:资源文件
  • 不同平台下面的项目:Android,iOS/Mac,Windows和Linux

组件简介

下面是一个简单的游戏界面:

在这里插入图片描述

让我们再来看一下,分解这个游戏界面的组件构成。

在这里插入图片描述

一个菜单(Menu),几个精灵(Sprite),和几个标签(Label)。


1. 导演(Director)

在使用 Cocos2d-x 开发游戏的过程中,你可以认为自己是执行制片人,告诉 导演(Director) 该怎么办!一个常见的 Director 任务是控制场景替换和转换。 Director是一个共享的单例对象,可以在代码中的任何地方调用。

这是一个典型的游戏流程实例。当您的游戏设计好时,Director 就负责场景的转换:

在这里插入图片描述

你是你的游戏的导演。你决定着发生什么,何时发生,如何发生。

2. 场景(Scene)

在游戏开发过程中,你可能需要一个主菜单,几个关卡和一个结束场景。
在这里插入图片描述

这是一个主菜单场景,这个场景是由很多小的对象拼接而成,所有的对象组合在一起,形成了最终的结果。场景是被 渲染器(renderer) 画出来的。渲染器负责渲染精灵和其它的对象进入屏幕。为了更好的理解这个过程,我们需要讨论一下 场景图

  • 场景图(Scene Graph)

场景图(Scene Graph) 是一种安排场景内对象的数据结构,它把场景内所有的 节点(Node) 都包含在一个 树(tree) 上。(场景图虽然叫做"图",但实际使用一个树结构来表示)。

在这里插入图片描述

当你开发游戏的时候,你会添加一些节点,精灵和动画到一个场景中,你期望的是每一个添加的对象都能被正确的展示,可是如果有个对象没有被展示呢?可能你错误的把这个对象隐藏到背景中了。怎么办?画出场景图!

Cocos2d-x 使用 中序遍历来渲染场景,先遍历左子树,然后根节点,最后是右子树。

在这里插入图片描述

分解这个场景,看一下它有哪些元素,这些最终会被渲染为一个树。

在这里插入图片描述

另一点要考虑的是,z-order (即z轴坐标)为负的元素,z-order 为负的节点会被放置在左子树,非负的节点会被放在右子树。实际开发的过程中,你可以按照任意顺序添加对象,他们会按照你指定的 z-order 自动排序。

在这里插入图片描述

如上图,左侧的场景是由很多节点对象组成的,他们根据被指定的 z-order 相互叠加。在 Cocos2d-x 中,通过 SceneaddChild() 方法构建场景图。

scene->addChild(title_node, -2);
scene->addChild(label_node);
scene->addChild(sprite_node, 1);

渲染时 z-order 值大的节点对象会后绘制,值小的节点对象先绘制。如果两个节点对象的绘制范围有重叠,z-order 值大的可能会覆盖 z-order 值小的。(z轴指向由屏幕指向外,即z-order越小,该节点越早被渲染,会呈现在离我们更远的图层也就是更内层)


3. 精灵(Sprite)

精灵是在屏幕上移动的对象,它能被控制。不是每个图形对象都是一个精灵,如果你能控制它,它才是一个精灵,如果无法控制,那就只是一个节点(Node)。

在这里插入图片描述

Sprite 很容易被创建,它有一些可以被配置的属性,比如:位置,旋转角度,缩放比例,透明度,颜色 等等。

auto mySprite = Sprite::create("mysprite.png"); // png图创建精灵
mySprite->setPosition(Vec2(500, 0)); // 设置精灵位置
mySprite->setRotation(40); // 设置精灵起始旋转角度
mySprite->setScale(2.0); // 设置缩放比例
mySprite->setAnchorPoint(Vec2(0, 0)); // 设置锚点

锚点(anchor point) ,所有的节点对象都有,SpriteNode 的子类,自然也具有锚点。锚点是节点对象在计算坐标位置时的一个基准点。


4. 动作(Action)

动作(Action) 可以让精灵在场景中移动,从一个点移动到另外一个点。你还可以创建一个动作 序列(Sequence) ,让精灵按照这个序列做连续的动作,在动作过程中你可以改变精灵的位置,旋转角度,缩放比例等等。

Action 对象的创建:

auto mySprite = Sprite::create("Blue_Front1.png");
auto moveBy = MoveBy::create(2, Vec2(50,10)); // 将精灵向右移动 50 像素,并在 2 秒内向顶部移动 10 像素。
mySprite->runAction(moveBy);
auto moveTo = MoveTo::create(2, Vec2(50,10)); // 在 2 秒内将精灵移动到特定位置。
mySprite->runAction(moveTo);

5. 序列(Sequence)

如何执行多个 Action ? Cocos2d-x 通过 序列(Sequence) 来支持这种需求。

让我们来看一个通过序列控制精灵移动的例子:

在这里插入图片描述

创建 Sequence

auto mySprite = Node::create();
auto moveTo1 = MoveTo::create(2, Vec2(50,10));
auto moveBy1 = MoveBy::create(2, Vec2(100,10));
auto moveTo2 = MoveTo::create(2, Vec2(150,10));
auto delay = DelayTime::create(1);
mySprite->runAction(Sequence::create(moveTo1, delay, moveBy1, delay.clone(),
moveTo2, nullptr));

如果想让所有的特定动作同时执行,通过引擎中的 Spawn 对象,你能让多个动作同时被解析执行。

auto myNode = Node::create();
auto moveTo1 = MoveTo::create(2, Vec2(50,10));
auto moveBy1 = MoveBy::create(2, Vec2(100,10));
auto moveTo2 = MoveTo::create(2, Vec2(150,10));
myNode->runAction(Spawn::create(moveTo1, moveBy1, moveTo2, nullptr));

6. 节点关系

Cocos2d-x 的 节点关系,是被附属和附属的关系,就像数据结构中的父子关系,如果两个节点被添加到一个父子关系中,那么父节点的属性变化会被自动应用到子节点中

需要注意的是,不是所有的父节点属性都会被自动应用到子节点,如改变父节点的锚点只会影响转换效果(比例缩放,位置变化,角度旋转,变形等),不会影响子节点锚点,子节点的锚点总会是左下角 (0,0)。


7. 日志输出

在游戏正在运行的时候,为了了解程序的运行过程或是为了查找一个 BUG,你想看到一些运行时信息,可以使用 log() 可以把信息输出到控制台:

// a simple string
log("This would be outputted to the console");

// a string and a variable
string s = "My variable";
log("string is %s", s);

// a double and a variable
double dd = 42;
log("double is %f", dd);

// an integer and a variable
int i = 6;
log("integer is %d", i);

// a float and a variable
float f = 2.0f;
log("float is %f", f);

// a bool and a variable
bool b = true;
if (b == true)
    log("bool is true");
else
    log("bool is false");
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_52678569/article/details/125752788

智能推荐

解决aka.ms已拒绝连接 修改 hosts 文件并保存-程序员宅基地

文章浏览阅读2.7k次,点赞2次,收藏4次。解决aka.ms已拒绝连接 修改 hosts 文件并保存_aka.ms

Git 服务器搭建与客户端安装-程序员宅基地

文章浏览阅读120次。大纲:一、前言二、搭建Git服务器yum安装Git服务器创建一个git用户,用来运行git服务创建客户端登录证书初始化Git仓库禁用shell登录克隆远程仓库三、安装客户端Windows 客户端Linux 客户端四、总结注,测试机 CentOS 5.5 x86_64,Git 服务器版本:g..._git rpm安装客户端

Cadence学习记录(一)元器件原理图绘制_cadence怎么自己画元器件-程序员宅基地

文章浏览阅读5.2k次,点赞3次,收藏33次。Cadence学习记录(一)元器件原理图绘制_cadence怎么自己画元器件

Spring入门到精通:第五章 JdbcTemplate:5.JdbcTemplate操作数据库-查询操作_jdbctemplate获取remarks为空-程序员宅基地

文章浏览阅读1.5w次。这一节我们来讲一下查询:(1)查询表有多少条记录;(2)查询某条数据;(3)查询所有记录;一、演示查询(1)在BookDao添加几个查询方法:/**查询表有多少条记录*/int selectCount();/**查询某条数据*/Book findOne(int id);/**查询所有记录*/List<Book> findAll();(2)在BookDaoImpl添加几个查询方法的实现:public int selectCount(.._jdbctemplate获取remarks为空

Ubuntu—root用户权限设置_ubuntu root权限-程序员宅基地

文章浏览阅读2.1w次,点赞16次,收藏67次。Ubuntu—root用户权限设置_ubuntu root权限

EVE-NG 隐藏没有镜像的模板_删除eve-ng中的镜像-程序员宅基地

文章浏览阅读795次。eve-ng 默认情况下,在添加node时,会列出所有的模板,这样用着很不方便。通过以下方式,可以使没有的设备模板不可见。如下图,这样用起来就方便多了。_删除eve-ng中的镜像

随便推点

c语言编程软件如何保存文件,急求如何将下列C语言程序数据存储到文件中?-程序员宅基地

文章浏览阅读330次。该楼层疑似违规已被系统折叠隐藏此楼查看此楼求如何改动才能将下列程序的存储输入或输出数据(或两者一起)到指定的文件(或运行时直接创立一个文件)如Arrangement中。#include int n=0;int rest[7][7]; //全局声明,以供全局调用int main(){void perm(int list[],int ,int );int list[]={1,2, 3,4,..._学习c语言用的软件怎么保存

APISIX源码解析-插件-mqtt协议代理【mqtt-proxy】_apisix mqtt-程序员宅基地

文章浏览阅读3.4k次。mqtt-proxy 固定窗口限速插件关键属性mqtt协议MQTT v3.1.1详细参考 https://www.cnblogs.com/hayasi/p/7743356.htmlMQTT v5.0详细参考 https://www.zybuluo.com/khan-lau/note/1325300源码实现与解析local function parse_mqtt(data) local res = {} -- 返回第一个字节,一个字符一个字节,第一个字节包含连接标志(Co_apisix mqtt

小米笔记本电脑怎么使用U盘重装系统教学_小米笔记本u盘装系统-程序员宅基地

文章浏览阅读5.6k次。小米笔记本电脑怎么使用U盘重装系统教学分享。今天分享的这个U盘重新系统的方法,主要就是针对一些系统问题。如果你在使用电脑的时候出现了系统故障,导致系统无法正常使用。那么就可以通过U盘来进行电脑系统的重装。此方法需要提前制作一个启动盘,我们来看看具体的操作流程吧。_小米笔记本u盘装系统

python 读取高光谱图像_tifffile库-程序员宅基地

文章浏览阅读1.3w次,点赞8次,收藏68次。项目描述Tifffile是一个Python库将numpy数组存储为TIFF(标记图像文件格式)文件,以及 从生物成像中使用的TIFF文件中读取图像和元数据。可以从TIFF,BigTIFF,OME-TIFF,STK,LSM,NIH,SGI,ImageJ,MicroManager,FluoView,ScanImage,SEQ,GEL,SVS,SCN,SIS,ZIF,QPI和GeoTIFF文..._tifffile库

ubuntu 系统监控工具_ubuntu 服务器 系统监控 大屏-程序员宅基地

文章浏览阅读2.8k次。ubuntu 16.04 系统监控工具ubuntu下的indicator-sysmonitor工具可以监控内存、CPU、CPU温度、网络等使用情况sudo add-apt-repository ppa:fossfreedom/indicator-sysmonitor sudo apt-get update sudo apt-get install indicator-sysmonito..._ubuntu 服务器 系统监控 大屏

Opencv、libopencv、Python-Opencv的区别-程序员宅基地

文章浏览阅读5.4k次,点赞2次,收藏4次。最近在树莓派上安装opencv,准备用于深度学习方面的内容,结果总是在安装的时候傻傻分不清这三者的区别,总是傻瓜式的按照百度上的步骤安装。OpenCV is computer vision a library written using highly optimized C/C++ code. It makes use of multiprocessing in the background. I..._opencv-python和opencv一样吗

推荐文章

热门文章

相关标签