- 精通Cocos2d-x游戏开发(基础卷)
- 王永宝
- 1204字
- 2021-03-19 16:56:37
2.1 Cocos2d-x世界
使用Cocos2d-x来开发游戏,要先了解几个问题,如图片如何显示,逻辑如何执行,如何获取输入,如图2-1所示简单描述了Cocos2d-x程序的结构,系统输入、场景树,以及Schedule驱动的场景更新,接下来更深入地了解一下相关的细节。
图2-1 Cocos2d-x程序结构
2.1.1 显示图片
Cocos2d-x由许多的场景组成,运行时有且只有一个场景。场景是一种节点,Cocos2d-x有各种各样的节点可以挂载在场景上,例如Layer、Sprite、Label、MenuItem等,每种节点都有自己的能力,一个游戏场景由场景节点以及各种各样的节点组成,形成一颗场景树。Cocos2d-x会按照节点树的规则将整个场景的内容依次渲染出来。因此在Cocos2d-x中,需要显示一些东西在屏幕上,只需要创建一些显示节点,然后添加到场景树中即可。
每种节点都有自己的功能,Sprite是最常用的精灵节点,可以显示一张图片。Menu和MenuItem也是很常用的节点,Menu是一个菜单,并没有显示功能,用来接收单击消息,并传递给MenuItem,MenuItem是菜单中的菜单项,也拥有显示图片的能力,但主要作为按钮使用。Layer也属于一种容器节点,类似Menu,并没有显示功能。
节点可以直接使用,也可以继承扩展,在实际应用中,大量代码是编写在自己继承的自定义节点类型中,在节点中进行编码是非常轻松的一件事,这是一种推荐做法。关于节点,会在第6章中详细介绍。
2.1.2 执行逻辑
一般,Cocos2d-x的逻辑都是写在各种继承的Node中,常用的有3种编写逻辑的方法。
❏第1种是在节点自动回调方法内写逻辑,init节点被创建初始化时调用,onEnter节点被添加到场景时调用,onExit节点从场景中删除时调用,这3个常用的方法,是Cocos2d-x会自动回调的虚函数,只需要把逻辑写在这里,Cocos2d-x会在节点被进行处理时相应地回调它们。
❏第2种是使用调度器来定时执行逻辑,每个类都有一个update回调函数,只要调用scheduleUpdate就会自动注册每帧执行该类的update回调函数。在update回调函数中可以编写每帧都会被执行的代码,例如,判断玩家HP是否为0,或者移动等。调度器也支持自定义时间间隔、延迟和重复次数的定时回调。调度器所需要执行的回调,需要手动注册到调度器中才会被执行。
❏第3种是指定事件发生之后的回调,其主要是各种UI按钮的单击回调,也是需要手动指定UI相关的回调函数。与调度器不同的是,Cocos2d-x的GUI并没有一个统一的接口来规范,本章会简单介绍一下Menu和MenuItem,更多的输入交互将放到后面再介绍。
2.1.3 获取输入
输入是一个很大的概念,这里简化了说,从表面上看,将菜单项MenuItem添加到菜单Menu中,菜单项即可接受单击消息并执行单击回调,实际上所有的输入都被Cocos2d-x至少封装了两层:
第一层是平台相关的输入接口,封装在不同平台下,系统输入事件如何触发,如何回调,这一层在不同平台中有不同的代码来适应。
第二层是Cocos2d-x消息处理层,将不同平台的输入消息转换为Cocos2d-x内部的消息,在3.x之前,Cocos2d-x使用TouchDispatcher或其他的Dispatcher将事件转发到指定的Delegate中,Menu作为一个Delegate来接收单击消息,并调用被单击到的MenuItem的单击回调,3.x使用EventDispatcher将事件封装为一个Event,转发到监听该Event的EventListener中,Menu拥有单击输入相关的EventListener,绑定了自身的回调函数,在单击事件触发时,在回调函数中检测并执行被单击到的MenuItem的单击回调。