【Cocos2d入门教程九】浅析Cocos2d下的加速计事件

【Cocos2d入门教程九】浅析Cocos2d下的加速计事件,第1张

概述在2.x中处理事件需要用到委托代理(delegate),相信学过2.x的触摸事件的同学,都知道创建和移除的流程十分繁琐。 而在3.x中由于加入了C++11的特性,而对事件的分发机制通过事件分发器EventDispatcher 来进行统一的管理。 事件分发器EventDispatcher,用于统一管理事件监听器的所有事件的分发。为Node节点的属性,通过导演类的单例获得 事件监听器主要有:  触摸事 在2.x中处理事件需要用到委托代理(delegate),相信学过2.x的触摸事件的同学,都知道创建和移除的流程十分繁琐。 而在3.x中由于加入了C++11的特性,而对事件的分发机制通过事件分发器Eventdispatcher 来进行统一的管理。

事件分发器Eventdispatcher,用于统一管理事件监听器的所有事件的分发。为Node节点的属性,通过导演类的单例获得

事件监听器主要有:
触摸事件 : EventListenertouchOneByOne、EventListenertouchAllAtOnce
鼠标响应事件 :EventListenerMouse

键盘响应事件 :EventListenerKeyboard
加速计事件 :EventListeneracceleration
自定义事件 :EventListenerCustom

这里我们主要来了解Cocos2d3.x版本下的加速计事件如何实现

移动设备上一个很重要的输入源是设备的方向,大多数设备都配备了加速计,用于测量设备静止或匀速运动时所受到的重力方向。

重力感应来自移动设备的加速计,通常支持X、Y和Z三个方向的加速度感应,又称为三向加速计。实际应用中,可以根据三个方向的力度大小来计算手机倾斜的角度和方向。

3.0机制中,我们只需要创建一个加速计监听器EventListeneracceleration,实现响应的回调函数,在回调函数中实现相应的游戏逻辑即可,最后把创建的监听器注册到事件分发器_eventdispatcher中即可。EventListenerAccerlation的静态create方法中有个Accerlation的参数,这个Accerlation是一个类,包含了加速计获得的三个方向的加速度

bool HelloWorld::init(){      Device::setAccelerometerEnabled(true);    Size visibleSize = Director::getInstance()->getVisibleSize();    Vec2 origin = Director::getInstance()->getVisibleOrigin();    //设定开启加速计驱动      Device::setAccelerometerEnabled(true);           sprite = Sprite::create("HelloWorld.png");    sprite->setposition(Vec2(visibleSize.wIDth/2,visibleSize.height/2));    this->addChild(sprite,0);        //监听    auto Listener =EventListeneracceleration::create(CC_CALLBACK_2(HelloWorld::onacceleration,this));    _eventdispatcher->addEventListenerWithSceneGraPHPriority(Listener,this);        return true;}

voID HelloWorld::onacceleration(cocos2d::acceleration *acc,cocos2d::Event *unused_event){    Size visibleSize = Director::getInstance()->getVisibleSize();    Size Spritesize = sprite->getContentSize();    Point p0 = sprite->getposition();        //防止x轴上出界 SPEED为宏定义的一个固定值20    float p1x =  p0.x + acc->x *SPEED ;    if ((p1x - Spritesize.wIDth/2) <0)     {        p1x = Spritesize.wIDth/2;    }    if ((p1x + Spritesize.wIDth / 2) > visibleSize.wIDth)     {        p1x = visibleSize.wIDth - Spritesize.wIDth / 2;    }     //防止y轴上出界    float p1y =  p0.y + acc->y *SPEED ;    p1y = p1y < 0 ? -p1y : p1y;    if ((p1y - Spritesize.height/2) < 0)    {        p1y = Spritesize.height/2;    }    if ((p1y + Spritesize.height/2) > visibleSize.height)    {        p1y = visibleSize.height - Spritesize.height/2;    }    sprite->runAction(Place::create(Point( p1x,p1y)));}
跑到手机上可以看到helloworld精灵因我们手机的重力偏向而朝重力加速度大的过去。

注意:关于先开启硬件设备驱动,不然完全没有效果,当时自己在学的时候就吃了点亏。弄了很久才知道是小小的细节忽略了。


ok.@H_301_66@于Cocos2d的加速计就分享到此,有讲得不对的地方还望指出进行探讨互相学习!

总结

以上是内存溢出为你收集整理的【Cocos2d入门教程九】浅析Cocos2d下的加速计事件全部内容,希望文章能够帮你解决【Cocos2d入门教程九】浅析Cocos2d下的加速计事件所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1067325.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-26
下一篇 2022-05-26

发表评论

登录后才能评论

评论列表(0条)

保存