【Cocos2d入门教程九】浅析Cocos2d下的加速计事件
来源:互联网 发布:java语言程序设计基础 编辑:程序博客网 时间:2024/06/06 15:01
在2.x中处理事件需要用到委托代理(delegate),相信学过2.x的触摸事件的同学,都知道创建和移除的流程十分繁琐。而在3.x中由于加入了C++11的特性,而对事件的分发机制通过事件分发器EventDispatcher 来进行统一的管理。
触摸事件 : EventListenerTouchOneByOne、EventListenerTouchAllAtOnce
鼠标响应事件 : EventListenerMouse
键盘响应事件 : EventListenerKeyboard
加速计事件 : EventListenerAcceleration
自定义事件 : EventListenerCustom
事件分发器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 0
- 【Cocos2d入门教程九】浅析Cocos2d下的加速计事件
- 【Cocos2d入门教程十二】浅析Cocos2d下的粒子系统
- 【Cocos2d入门教程八】浅析Cocoss2d下的多点触控
- 【Cocos2d入门教程十三】 浅析Cocos2d下3.x与2.x屏幕截图的区别
- 【学习笔记】Cocos2d-x 重力加速计的使用
- cocos2d-x 事件分发机制 ——加速计事件监听
- cocos2d-x 事件分发机制 ——加速计事件监听
- cocos2d-x 3.0 事件分发机制 —加速计事件监听
- 【Cocos2d入门教程十】浅析Cocos2d内存管理
- 【Cocos2d入门教程十一】浅析Cocoss2d下的音频引擎及封装音频类
- 【Cocos2d入门教程六】Cocos2d-x事件篇之触摸
- Cocos2d-x 定时器的浅析
- Cocos2d-x 定时器的浅析
- Cocos2d-x 定时器的浅析
- Cocos2d-x 定时器的浅析
- iphone游戏开发之cocos2d ( 八 )使用加速计(重力感应)控制精灵移动UIAcceleration
- Cocos2d-x 3.1.1 Lua实例-AccelerometerTest(重力加速计)
- 【Cocos2d入门教程十四】Cocos2d-x与Java的通讯
- LogCat不显示log 模拟器 device disconnected
- 异常、IO流
- 对象建模方法与技术学习笔记(一)
- Python进阶安装第三方模块
- 使用openssl生成PEM格式私钥和公钥及ECDSA签名
- 【Cocos2d入门教程九】浅析Cocos2d下的加速计事件
- 【Lua】table
- CSS整理(4)
- 编程之美:第四章 数字之趣 4.2瓷砖覆盖地板
- 矩阵链相乘
- win7虚拟光驱+iso文件升级win10
- 聚类算法(1)——层次、K-means聚类
- 数据结构导论(一)
- 为什么要使用抽象类