Cocos2d-x游戏实例-《跑跑跑》制作教程(第五篇)——主角上下移动-阿里云开发者社区

开发者社区> 技术小美> 正文

Cocos2d-x游戏实例-《跑跑跑》制作教程(第五篇)——主角上下移动

简介:
+关注继续查看

嗯,至此我们的《跑跑跑》游戏已经基本完成了才怪啊喂~

来,主角不能只往前跑,我们得让他可以上下跑。

 

1. 制作新的移动控制器

我们要改变主角的移动行为,这很简单,因为聪明的我们早就料到了客户的需求是随时改变的(噗,那个客户说的是我么?),所以,我们使用了组合的方式。

现在是见证组合有多强大的时候了!我们只需要新建一个控制器,然后替换掉原来的SimpleMoveController,绑定到主角身上,就OK~

 

2. 三方移动控制器

这个新的移动控制器可以往前、往上、往下移动,所以我给它命名为三方控制器。英文名叫做SanFangController,噗,开玩笑的,还是叫做ThreeDirectionController~

首先,我有个糟糕的事情想告诉大家,我们要修改Controller.h文件:

class Controller : public CCLayer {


其实没有修改什么,就是把Controller的父类由CCNode改为CCLayer。为什么呢?因为我们的新控制器希望获得屏幕触摸事件,而CCNode是获取不了这个事件的。

  好,我们来创建三方移动控制器吧:

01 //ThreeDirectionController.h文件
02  
03 #ifndef __THREE_DIRECTION_CONTROLLER_H__
04 #define __THREE_DIRECTION_CONTROLLER_H__
05  
06 #include "Controller.h"
07 #include "cocos2d.h"
08  
09 usingnamespace cocos2d;
10  
11 classThreeDirectionController : publicController {
12 public:
13     CREATE_FUNC(ThreeDirectionController);
14     virtualbool init();
15     virtualvoid update(floatdt);
16  
17     /* 触屏事件 */
18     virtualvoid registerWithTouchDispatcher();
19     virtualbool ccTouchBegan(CCTouch *pTouch, CCEvent *pEvent);
20     virtualvoid ccTouchMoved(CCTouch *pTouch, CCEvent *pEvent);
21     virtualvoid ccTouchEnded(CCTouch *pTouch, CCEvent *pEvent);
22  
23     /* 设置X方向的移动速度 */
24     voidsetiXSpeed(intiSpeed);
25  
26     /* 设置Y方向的移动速度*/
27     voidsetiYSpeed(intiSpeed);
28  
29 private:
30     intiXSpeed;
31     intiYSpeed;
32 };
33  
34 #endif

这个是头文件,我们来看看主要有什么东西。基本上和SimpleMoveController差不多,区分了XY方向上的速度,以及加入了触屏事件(继承自CCLayer)。

 

再来看看cpp文件:

01 #include "ThreeDirectionController.h"
02  
03 boolThreeDirectionController::init()
04 {
05     this->iXSpeed = 0;
06     this->iYSpeed = 0;
07  
08     /* 设置允许触屏 */
09     this->setTouchEnabled(true);
10  
11     this->scheduleUpdate();
12     returntrue;
13 }
14  
15 voidThreeDirectionController::update( floatdt )
16 {
17     if(mControllerListener == NULL) {
18         return;
19     }
20  
21     CCPoint curPos = mControllerListener->getCurPosition();
22     curPos.x += iXSpeed;
23     curPos.y += iYSpeed;
24  
25     mControllerListener->setSimplePosition(curPos.x + iXSpeed, curPos.y + iYSpeed);
26 }
27  
28 voidThreeDirectionController::setiXSpeed( intiSpeed )
29 {
30     this->iXSpeed = iSpeed;
31 }
32  
33 voidThreeDirectionController::setiYSpeed( intiSpeed )
34 {
35     this->iYSpeed = iSpeed;
36 }
37  
38 boolThreeDirectionController::ccTouchBegan( CCTouch *pTouch, CCEvent *pEvent )
39 {
40     returntrue;
41 }
42  
43 voidThreeDirectionController::ccTouchMoved( CCTouch *pTouch, CCEvent *pEvent )
44 {
45     /* 获取点击的坐标 */
46     CCPoint touchLocation = pTouch->getLocationInView();
47     touchLocation = CCDirector::sharedDirector()->convertToGL(touchLocation);
48  
49     /* 被控制对象的坐标 */
50     CCPoint pos = mControllerListener->getCurPosition();
51  
52     /* 判断是向上移动还是向下移动 */
53     intiSpeed = 0;
54     if(touchLocation.y > pos.y) {
55         iSpeed = 1;
56     }
57     else{
58         iSpeed = -1;
59     }
60  
61     setiYSpeed(iSpeed);
62 }
63  
64 voidThreeDirectionController::ccTouchEnded( CCTouch *pTouch, CCEvent *pEvent )
65 {
66     /* 停止Y坐标上的移动 */
67     setiYSpeed(0);
68 }
69  
70 voidThreeDirectionController::registerWithTouchDispatcher()
71 {
72     /* 注册触屏事件 */
73     CCDirector::sharedDirector()->getTouchDispatcher()->addTargetedDelegate(this, 0, true);
74 }

首先,update函数变了一点,xy方向上的坐标都会改变。

然后有个registerWithTouchDispatcher函数,是用于注册触屏事件的。

再然后最重要的是ccTouchMoved函数,根据点击屏幕的y坐标是在主角之上还是下来判断是让主角向上移动还是向下移动。

 

好了,现在!打开我们的TollgateScene.cppinit函数,将SimpleMoveController替换为ThreeDirectionController

1 /* ------------ 创建玩家移动控制器 -------------- */
2 ThreeDirectionController* mSMoveControll = ThreeDirectionController::create();
3 mSMoveControll->setiXSpeed(1);
4 mSMoveControll->setiYSpeed(0);
5  
6 /* 控制器要添加到场景中才能获得update事件 */
7 this->addChild(mSMoveControll);
8  
9 mPlayer->setController(mSMoveControll);

Ok~运行游戏,成功了~好有意思的游戏,噗~















本文转蓬莱仙羽51CTO博客,原文链接:http://blog.51cto.com/dingxiaowei/1366381,如需转载请自行联系原作者

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
【Cocosd2d实例教程四】Cocos2d实现人物原地走动
(转载请注明出处:http://blog.csdn.net/buptgshengod) 1.首先安装TexturePacker     1)TexturePacker介绍               这是一款图片集合软件,生成.plist文件,是一种动画效果。将png图片人物走动的不同瞬间传进去,之后publish,将生成一个.plist和一个.png文件。如图     
816 0
【Cocosd2d实例教程五】Cocos2d添加虚拟摇杆控制器
(转载请注明出处:http://blog.csdn.net/buptgshengod) 1.介绍     cocos2d为我们提供了好用的摇杆控制器,主要是对ZJoystick.h和ZJoystick.m的添加,实现了如下图的功能。通过摇杆可以控制图中精灵的移动。(但是还有一个技术性问题亟待解决,就是精灵移动后会有一个重影留在初始位置) 2.摇杆的实现    1) 将资源中的Z
901 0
使用Spring AOP实现MySQL数据库读写分离案例分析
使用Spring AOP实现MySQL数据库读写分离案例分析 前言 分布式环境下数据库的读写分离策略是解决数据库读写性能瓶颈的一个关键解决方案,更是最大限度了提高了应用中读取 (Read)数据的速度和并发量。
1776 0
阿里云服务器端口号设置
阿里云服务器初级使用者可能面临的问题之一. 使用tomcat或者其他服务器软件设置端口号后,比如 一些不是默认的, mysql的 3306, mssql的1433,有时候打不开网页, 原因是没有在ecs安全组去设置这个端口号. 解决: 点击ecs下网络和安全下的安全组 在弹出的安全组中,如果没有就新建安全组,然后点击配置规则 最后如上图点击添加...或快速创建.   have fun!  将编程看作是一门艺术,而不单单是个技术。
9557 0
Docker系列教程02-Docker安装(CentOS7/Ubuntu/macOS/Windows)
原文:http://www.itmuch.com/docker/02-docker-install/ 2.1 CentOS 2.1.1 系统要求 CentOS 7或更高版本 centos-extras 仓库必须处于启用状态,该仓库默认启用,但如果您禁用了该仓库,请按照https://wiki.centos.org/AdditionalResources/Repositories 中的描述重新启用。
1361 0
【Cocosd2d实例教程七】Cocos2d实现超炫的粒子效果!!
(转载请注明出处:http://blog.csdn.net/buptgshengod) 1.介绍      你想拥有炫酷的效果么,你想让你的应用亮瞎别人的狗眼么!!不要急,这里告诉大家怎么实现绚丽的粒子效果! 先上个图,点击界面产生火焰!(依旧是动态的,只是作者懒得截动态图) 2.实现部分      1)软件的安装     我们通过软件ParticleDesig
765 0
ASP.NET Core MVC 设计模式 - ASP.NET Core 基础教程 - 简单教程,简单编程
原文:ASP.NET Core MVC 设计模式 - ASP.NET Core 基础教程 - 简单教程,简单编程   ASP.NET Core MVC 设计模式 上一章节中,我们提到 ASP.NET Core 支持 MVC 开发模式,不知道大家对 MVC 设计模式是否了解,算了,不管了,本章节我们就来讲讲 MVC 设计模式吧。
2085 0
+关注
6906
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
《2021云上架构与运维峰会演讲合集》
立即下载
《零基础CSS入门教程》
立即下载
《零基础HTML入门教程》
立即下载