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

笨木头  2012-11-16 20:30   2.0游戏实例《跑跑跑》,Cocos2d-x2.0   阅读(4,537)   2条评论

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

 

笨木头花心贡献,啥?花心?不呢,是用心~

转载请注明,原文地址
http://www.benmutou.com/archives/31

正文:

 

注:本文使用到的资源请到这里下载:http://download.csdn.net/detail/musicvs/4769412

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

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

 

1. 制作新的移动控制器

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

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

 

2. 三方移动控制器

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

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

class Controller : public CCLayer {


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

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
//ThreeDirectionController.h文件

#ifndef __THREE_DIRECTION_CONTROLLER_H__
#define __THREE_DIRECTION_CONTROLLER_H__

#include "Controller.h"
#include "cocos2d.h"

using namespace cocos2d;

class ThreeDirectionController : public Controller {
public:
CREATE_FUNC(ThreeDirectionController);
virtual bool init();
virtual void update(float dt);

/* 触屏事件 */
virtual void registerWithTouchDispatcher();
virtual bool ccTouchBegan(CCTouch *pTouch, CCEvent *pEvent);
virtual void ccTouchMoved(CCTouch *pTouch, CCEvent *pEvent);
virtual void ccTouchEnded(CCTouch *pTouch, CCEvent *pEvent);

/* 设置X方向的移动速度 */
void setiXSpeed(int iSpeed);

/* 设置Y方向的移动速度*/
void setiYSpeed(int iSpeed);

private:
int iXSpeed;
int iYSpeed;
};

#endif

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

 

再来看看cpp文件:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
#include "ThreeDirectionController.h"

bool ThreeDirectionController::init()
{
this->iXSpeed = 0;
this->iYSpeed = 0;

/* 设置允许触屏 */
this->setTouchEnabled(true);

this->scheduleUpdate();
return true;
}

void ThreeDirectionController::update( float dt )
{
if(mControllerListener == NULL) {
return;
}

CCPoint curPos = mControllerListener->getCurPosition();
curPos.x += iXSpeed;
curPos.y += iYSpeed;

mControllerListener->setSimplePosition(curPos.x + iXSpeed, curPos.y + iYSpeed);
}

void ThreeDirectionController::setiXSpeed( int iSpeed )
{
this->iXSpeed = iSpeed;
}

void ThreeDirectionController::setiYSpeed( int iSpeed )
{
this->iYSpeed = iSpeed;
}

bool ThreeDirectionController::ccTouchBegan( CCTouch *pTouch, CCEvent *pEvent )
{
return true;
}

void ThreeDirectionController::ccTouchMoved( CCTouch *pTouch, CCEvent *pEvent )
{
/* 获取点击的坐标 */
CCPoint touchLocation = pTouch->getLocationInView();
touchLocation = CCDirector::sharedDirector()->convertToGL(touchLocation);

/* 被控制对象的坐标 */
CCPoint pos = mControllerListener->getCurPosition();

/* 判断是向上移动还是向下移动 */
int iSpeed = 0;
if(touchLocation.y > pos.y) {
iSpeed = 1;
}
else {
iSpeed = -1;
}

setiYSpeed(iSpeed);
}

void ThreeDirectionController::ccTouchEnded( CCTouch *pTouch, CCEvent *pEvent )
{
/* 停止Y坐标上的移动 */
setiYSpeed(0);
}

void ThreeDirectionController::registerWithTouchDispatcher()
{
/* 注册触屏事件 */
CCDirector::sharedDirector()->getTouchDispatcher()->addTargetedDelegate(this, 0, true);
}

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

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

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

 

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

1
2
3
4
5
6
7
8
9
/* ------------ 创建玩家移动控制器 -------------- */
ThreeDirectionController* mSMoveControll = ThreeDirectionController::create();
mSMoveControll->setiXSpeed(1);
mSMoveControll->setiYSpeed(0);

/* 控制器要添加到场景中才能获得update事件 */
this->addChild(mSMoveControll);

mPlayer->setController(mSMoveControll);

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

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

 

下一篇我们将为地图添加障碍物——流氓,你别到处乱跑了~

2 评论

发表评论

电子邮件地址不会被公开。 必填项已用*标注