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

在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.于Cocos2d的加速计就分享到此,有讲得不对的地方还望指出进行探讨互相学习!

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值