cocos2d-x的触摸输入

来源:互联网 发布:vb.net 十秒后跳转 编辑:程序博客网 时间:2024/05/21 14:49
   如今大屏智能手机和平板已经成为了人手必备的通信设备,游戏的交互方式也发生了巨大的变化。在pc上使用键盘和鼠标进行游戏交互,而在移动设备上基本上都是使用触摸屏作为交互。cocos2d-x作为一款手机游戏引擎,内部也提供了非常方便灵活的支持。
   方法1:直接开启CCLayer的TouchEnable属性。
CCLayer的一个重要作用就是接受用户的输入,自身已经封装好了触摸接口,只需要将TouchEnable属性设置为true就可以开启。开启以后需要重载4个函数,他们是
virtual void ccTouchesBegan(CCSet *pTouches, CCEvent*pEvent);
virtual voidccTouchesMoved(CCSet *pTouches, CCEvent*pEvent); 
virtual voidccTouchesEnded(CCSet *pTouches, CCEvent*pEvent); 
virtual voidccTouchesCanCelled(CCSet *pTouches, CCEvent*pEvent); 
分别代表触摸开始,移动,结束,取消(在触摸过程中程序被切到后台)。通过这4个函数来实现自己的逻辑。

   方法2:本质上跟方法1一样,但是把触摸输入逻辑和游戏处理逻辑分开。
这个方法是在《制作自己的捕鱼达人》看到的,觉得比第一种方法好很多,把触摸类型判断逻辑和游戏元素的处理逻辑分开,非常方便代码管理。首先需要实现一个TouchLayer,它实现对触摸类型的判断(单点,多点,移动),内部还有一个代理类,代码如下

#ifndef TOUCHLAYER_H
#define TOUCHLAYER_H
#include "cocos2d.h"
#include "proj.win32\TouchLayerDelegate.h"
class TouchLayer:public cocos2d::CCLayer
{
public:
CC_SYNTHESIZE(TouchLayerDelegate*,m_pDelegate,Delegate);
public:
bool init();
virtual void ccTouchesBegan(cocos2d::CCSet*pTouches,cocos2d::CCEvent* pEvent);
virtual void ccTouchesMoved(cocos2d::CCSet*pTouches,cocos2d::CCEvent* pEvent);
virtual void ccTouchesEnded(cocos2d::CCSet*pTouches,cocos2d::CCEvent* pEvent);
virtual void ccTouchesCancelled(cocos2d::CCSet*pTouches,cocos2d::CCEvent* pEvent);
void onExit();
CREATE_FUNC(TouchLayer);
};
#endif
void TouchLayer::ccTouchesEnded(CCSet* pTouches,CCEvent*pEvent)
{
if(pTouches->count() == 1)
{
CCTouch* touch = dynamic_cast(pTouches->anyObject());
CCPoint position = touch->getLocationInView();
if(this->getDelegate())
{
this->getDelegate()->singleTouchEndIn(position);
}
}
}

然后我们需要一个代理类TouchLayerDelegateTouchLayerDelegate 相当于一个协议,本身没有什么逻辑。任何一个实现了这个协议的类都可以作为TouchLayer的代理,代码如下
#ifndef TOUCHLAYERDELEGATE_H
#define TOUCHLAYERDELEGATE_H
#include "cocos2d.h"
class TouchLayerDelegate
{
public:
virtual void singleTouchEndIn(cocos2d::CCPoint point) =0;
};
#endif

我们的最终目的是操纵精灵,所以我们让精灵层实现这个代理协议。让精灵层继承TouchLayerDelegate并重载其中的全虚函数。代码如下:
class SpriteLayer: public cocos2d::CCLayer,publicTouchLayerDelegate
{
public:

bool init();
   CREATE_FUNC(SpriteLayer);
void singleTouchEndIn(cocos2d::CCPoint point);
private:
SprBg* background;
SprCowboy* cowboy;
};
#endif
于是我们就可以在重载的函数里实现我们的操作。

最后的最后,我们需要添加一条语句,把精灵层设置为触摸层的代理层
//把精灵层设置为触摸层的代理层
this->touchLayer->setDelegate(this->spriteLayer);
这一句一般放在场景的初始化函数中。

总结:
   采取后面一种方法,我们可以将代码很好的分离,方便管理。简单的操作可以不会有太大的影响,例如上面的单击操作。但是如果操作比较复杂,例如3个点同时往右移动,3个点径向外移动等等,就可以看出这种方法带来的巨大好处。
0 0
原创粉丝点击