Cocos2d-x 游戏实例教程跑跑跑2:让主角动起来
在完成项目创建,并且有了地图和游戏主角之后,接下来我们要想办法让游戏主角动起来。
为主角添加跑步动画
为了让主角跑起来,我们需要先给主角添加一个动画。首先,为 Player 类添加一个 run() 函数。实现该函数后,运行项目,此时可以看到主角在原地跑起来了。
run() 函数实现
(此处应补充 run() 函数的具体代码)
让主角向前跑起来——添加角色控制器
我们采用组合的方式来实现让主角向前跑,将向前跑这一功能单独封装在一个类中,主角只需增加一个该类的成员变量,就能实现向前跑的动作,这个类就是控制器。
创建控制器的父类
先在“控制器筛选器”下新建 Controller.h 和 Controller.cpp 文件。
Controller.h
(此处应补充 Controller.h 的具体代码)
Controller.cpp
(此处应补充 Controller.cpp 的具体代码)
这个类比较简单,只有一个变量和一个方法。下面我们来了解一下 ControllerListener 的作用。ControllerListener 代表的是将要被控制的对象,例如主角,只要继承了 ControllerListener 接口,就能够被控制器控制。
ControllerListener 代码实现
在“控制器筛选器”下创建 ControllerListener.h 头文件,代码如下:
(此处应补充 ControllerListener.h 的具体代码)
ControllerListener 只需要头文件,不需要 cpp 文件。它定义了两个虚函数,用于设置和获取被控制对象的坐标。
带着它就能跑——主角移动控制器
接下来,我们要实现第一个控制器,即控制物体只向前移动的控制器。在“控制器筛选器”下再创建一个筛选器,命名为“简单移动控制器”,在该筛选器下新建一个类,命名为 SimpleMoveController。
SimpleMoveController 类实现
SimpleMoveController.h
(此处应补充 SimpleMoveController.h 的具体代码)
SimpleMoveController.cpp
(此处应补充 SimpleMoveController.cpp 的具体代码)
SimpleMoveController 继承了 Controller 类,它拥有一个成员变量 m_iSpeed,用于设置移动速度。
update(float dt) 函数详解
这里再次详细介绍一下 update(float dt) 函数。update 函数是 CCNode 节点的函数,其作用十分强大。我们知道,游戏的画面是通过一帧帧绘制形成丰富多彩的世界的,程序只需要在每一帧里执行操作、绘制图形。update 函数提供了一个入口,让我们可以在游戏的每一帧里执行自己想要做的事情。
float dt 参数的含义如下:由于 CPU 资源有限,不可能让所有 update 函数同时执行,只能依次执行,因此总会有函数先被调用,有函数后被调用。float dt 参数记录了某个 update 函数从最后一次被调用到本次调用时经过的毫秒数。虽然这个参数非常有用,但在当前阶段我们暂不深入探讨。
修改 Entity 类
接下来,我们需要对 Entity 类进行一些修改。
Entity.h
(此处应补充 Entity.h 修改后的具体代码)
Entity.cpp
(此处应补充 Entity.cpp 修改后的具体代码)
我们让 Entity 类继承了 ControllerListener 父类,因为我们的角色需要作为被控制器控制的对象。另外,我们为 Entity 类新增了一个 setController 方法,用于绑定一个控制器。
绑定控制器
最后,我们打开 TollgateScene.cpp 的 addPlayer 函数,在该函数的最后添加一段代码:
(此处应补充添加的代码)
添加完代码后,运行项目,主角就可以跑起来了!