• QQ
  • nahooten@sina.com
  • 常州市九洲新世界花苑15-2

游戏开发

Cocos2d-X之触摸事情

原创内容,转载请注明原文网址:http://homeqin.cn/a/wenzhangboke/jishutiandi/youxikaifa/2019/1028/690.html

 
Cocos2d-x中触摸事情分为单点触摸事情和多点触摸事情。
 
单点触摸常州微信小程序开发事情
1.触摸事情的剖析
(1)第一阶段:触摸开端,当用户的手指接触到手机屏幕上时。 
(2)第二阶段:触摸挪动,当用户的手指在屏幕上滑动时。 
(3)第三阶段:触摸完毕,当用户的手指脱离屏幕时。 
(4)第四阶段:触摸取消,当用户的手指还未脱离屏幕,但手机进入后台,例如来电话,长时间无响应,屏幕关闭之类的状况。
 
这四个阶段都会把映射成程序里详细的函数,当事情发作时都会触发相应的函数。这四个函数都在Layer类里。我们在处置触摸事情时需求重写这四个函数。
 
bool onTouchBegan(Touch *touch, Event *unused_event);
    void onTouchMoved(Touch *touch, Event *unused_event);
    void onTouchEnded(Touch *touch, Event *unused_event);
    void onTouchCancelled(Touch *touch, Event *unused_event);
1
2
3
4
5
我们能够看见这四个函数都有两个参数,第一个参数是Touch* 类型,第二个参数是Event* 类型。 
关于传入函数的Touch* 类型的参数touch,有以下用法:
 
    //1.取得当前的触摸点,它返回的是触摸的点的坐标,这个坐标是相关于世界坐标系的原点
    auto l = touch->getLocation();
   //2.得到第一个点的触摸坐标,它返回的是触摸最开端的点的坐标。
    auto sl = touch->getStartLocation();
    //3.它返回的是前一个触摸点的坐标
    auto pl = touch->getPreviousLocation();
1
2
3
4
5
6
由于常州网站开发建设经过以上三个函数得到的坐标点都是相关于世界坐标系的。所以假如需求把世界坐标系转化成节点坐标系的话,能够调用以下的函数:
 
auto noteP = this->convertToNodeSpace(l);
1
我们经过重写Layer里的三个函数,完成了触摸事情的函数完成。但单是这样当我们触摸屏幕时是不会触发触摸事情的,我们还需求创立一个单点触摸事情监听器。(ps:倡议写在onEnter函数中)
 
void HelloWorld::onEnter(){
    Layer::onEnter();
    //创立一个单点触摸时间监听器
    auto lister = EventListenerTouchOneByOne::create();
    lister->onTouchBegan = CC_CALLBACK_2(HelloWorld::onTouchBegan, this);
    lister->onTouchMoved = CC_CALLBACK_2(HelloWorld::onTouchMoved, this);
    lister->onTouchEnded = CC_CALLBACK_2(HelloWorld::onTouchEnded, this);
    lister->onTouchCancelled = CC_CALLBACK_2(HelloWorld::onTouchCancelled, this);
    Director::getInstance()->getEventDispatcher()->addEventListenerWithSceneGraphPriority(lister, this);
}
1
2
3
4
5
6
7
8
9
10
然后别忘了在适宜的函数内释放这个事情监听器。普通是onExit中释放。
 
void HelloWorld::onExit(){
    Director::getInstance()->getEventDispatcher()->removeEventListenersForTarget(this);
    Layer::onExit();
}
1
2
3
4
触摸优先级
假如了多个Layer都完成了触摸事情,那么当我们点击屏幕时,同时调用了多个触摸事情,他们的先后次第如何肯定呢?cocos2d-x中为我们进步了提供了相关的办法停止设置。
 
    //运用默许的触摸优先级,0
    Director::getInstance()->getEventDispatcher()->addEventListenerWithSceneGraphPriority(lister, this);
    //创立时制定指定的触摸优先级,这里是-128.(数字越小,优先级越高)
    Director::getInstance()->getEventDispatcher()->addEventListenerWithFixedPriority(lister, -128);
1
2
3
4
运用了不同的方式注册,也有不同的方式释放注册。
 
 //游戏开发运营默许的触摸优先级注册后,释放注册
    Director::getInstance()->getEventDispatcher()->removeEventListenersForTarget(this);
    //经过指定的触摸优先级注册,释放注册
    Director::getInstance()->getEventDispatcher()->removeEventListener(lister);
1
2
3
4
3.触摸吞噬
当有多个Layer都设置了触摸事情时,假如我们不想低于某个Layer优先级的其他Layer接纳到这个触摸事情,我们就能够在注册时选择吞噬触摸,这样这个触摸事情就不会再分发下去。
 
    lister->setSwallowTouches(true);
1
多点触摸事情
(1)开启多点触摸,在ios/AppController.mm中第60行修正参数为YES。如下
 
[eaglView setMultipleTouchEnabled:YES];
1
与单点触摸事情相似,Layer类中还有4个函数,也需求重写它们。
 
    void onTouchesBegan(const std::vector<Touch*>& touches, Event *unused_event);
    void onTouchesMoved(const std::vector<Touch*>& touches, Event *unused_event);
    void onTouchesEnded(const std::vector<Touch*>& touches, Event *unused_event);
    void onTouchesCancelled(const std::vector<Touch*>&touches, Event *unused_event);
1
2
3
4
多点触摸事情也需求创立多点事情分发器
 
    //创立一个多点触摸时间监听器
    lister = EventListenerTouchAllAtOnce::create();
    lister->onTouchesBegan = CC_CALLBACK_2(HelloWorld::onTouchesBegan, this);
    lister->onTouchesMoved = CC_CALLBACK_2(HelloWorld::onTouchesMoved, this);
    lister->onTouchesEnded = CC_CALLBACK_2(HelloWorld::onTouchesEnded, this);
    lister->onTouchesCancelled = CC_CALLBACK_2(HelloWorld::onTouchesCancelled, this);
        Director::getInstance()->getEventDispatcher()->addEventListenerWithSceneGraphPriority(lister, this);
1
2
3
4
5
6
7
多点触摸释放办法与单点触摸一样。
 
    Director::getInstance()->getEventDispatcher()->removeEventListenersForTarget(this);
1
单点触摸与多点触摸的区别
1.多点触摸默许是不开启的,需求手动开启 
2.多点触摸一定会承受这次触摸事情,但是单点触摸能够选择能否承受 
3.单点触摸能够有吞噬,多点触摸不能吞噬 
4.单点触摸的优先级永远比多点触摸高

上篇:上一篇:u33d给程序添加运用日期
下篇:下一篇:一个摄像机控制类的总结