创建完项目,有了地图和游戏主角,接下来我们先想办法让游戏的主角动起来。为了让主角跑起来,先给主角添加一个动画,首先给Player添加一个函数run(),如图:

1.jpg

run()实现:

2.jpg

此时,运行项目,可以看到主角在原地跑起来了。


让主角向前跑起来——添加角色控制器

      我们采用组合来实现让主角向前跑,把向前跑作为一个功能单独写在一起类,主角只要增加一个成员变量(向前跑的类)就能实现向前跑的动作。而这个类,就是控制器。

      先创建控制器的父类,在“控制器筛选器”下新建Controller.h和Controller.cpp文件。如代码:

Controller.h:

3.jpg

Controller.cpp

4.jpg

       很简单的一个类,只有一个变量和一个方法,我们来看看ControllerListener是做什么用的。ControllerListener就是我们将要被控制的对象,比如主角,只要继承了ControllerListener接口,就能够被控制器控制。

       看看ControllerListener的代码,在“控制器筛选器”下创建ControllerListener.h头文件,代码如下:

5.jpg

      只有头文件,且只需要头文件,不需要cpp文件。定义了两个虚函数,用来设置和获取被控制对象的坐标。


带着它就能跑——主角移动控制器

       我们来实现第一个控制器,控制物体只向前移动的控制器,我们在“控制器筛选器”下再创建一个筛选器,命名为“简单移动控制器”,在该筛选器下新建一个类,命名为SimpleMoveController,代码如下:

SimpleMoveController.h:

6.jpg

SimpleMoveController.cpp:

7.jpg

      SimpleMoveController继承了Controller类 , 也很简单,拥有一个成员变量m_iSpeed,用来设置移动速度。

        这里再次简单介绍一下update(float dt)函数,update 函数是CCNode 节点的函数,有什么用呢?很强大的,我们都知道,游戏的画面是一帧帧地绘制,从而形成丰富多彩的世界。而程序只需要在每一帧里执行操作,绘制图形。

       update函数提供了一个入口,让我们可以在游戏的每一帧里执行我们自己想要做的事情。

       float dt参数是什么呢?我们都知道CPU是一个很忙的孩子,CPU不可能让所有update函数同时进行,只能是一个个执行,所以总有人先调用有人后调用,float dt参数就记录了某个update函数从最后一次被调用到本次调用时经过了多少毫秒。那这又有什么用呢?很有用,但是我们先不管。

接下来我们还要稍微改变一下Entity类,

Entity.h:

8.jpg

Entity.cpp

9.jpg

       我们为Entity又继承了一个父类,那就是ControllerListener,大家都知道为什么了,因为我们的角色需要被当作一个被控制器控制的对象。另外我们还未Entity新增了一个方法,那就是setController,当然了,因为我们需要绑定一个控制器。

最后,我们打开TollgateScene.cpp的addPlayer函数,在addPlayer函数最后加上一段代码,如下:

10.jpg

运行项目!主角跑起来了!