【Cocos2d-X开发学习笔记】第24期:事件处理机制之加速度传感器事件
来源:互联网 发布:c语言标准函数库下载 编辑:程序博客网 时间:2024/05/17 08:13
本系列学习教程使用的是cocos2d-x-2.1.4(最新版为3.0alpha0-pre) ,PC开发环境Windows7,C++开发环境VS2010
智能手机的游戏与应用中,也经常会用到加速传感器事件来丰富用户的操作,比如赛车游戏中摇动手机控制前进
方向、动作过关游戏中通过加速度传感器来控制角色的移动和跳跃方向等。那么这一期,我们就来学习一下如何使用
加速度传感器事件。
一、加速度传感器事件
Cocos2D-X中使用加速度传感器代理CCAccelerometerDelegate提供的方法来接受加速度传感器的数值变化,继承
关系如下图所示。
布景层类CCLayer和其子类继承自CCAccelerometerDelegate类,因此布景层类和其子类可以使用获得加速度传感
器的方法。
二、CCAccelerometerDelegate类的函数
CCAccelerometerDelegate类的公共函数见下图。
didAccelerate函数传入CCAcceleration结构体,其中的数据见下图。
CCAcceleration结构体存储了加速度传感器的数据,包括时间戳和坐标轴上的加速度值,这个值以重力加速度为
单位,因此,要获得相应坐标轴加速度的值时,需要乘上重力加速度g。见如下代码所示。
ptTemp.x += pAccelerationValue->x * 9.81f; ptTemp.y -= pAccelerationValue->y * 9.81f;
三、加速度传感器事件使用实例
要在CCLayer中获得加速度传感器事件的数据,首先要在初始化函数中加入允许接受加速度传感器事件的函数。
1、首先新建Cocos2D-X项目,取名为“MyKeypad”,然后在HelloWorldScene.h文件中声明如下成员函数和变量。
class HelloWorld : public cocos2d::CCLayer{protected: cocos2d::CCSprite* m_pBall; public: // Here's a difference. Method 'init' in cocos2d-x returns bool, instead of returning 'id' in cocos2d-iphone virtual bool init(); // there's no 'id' in cpp, so we recommand to return the exactly class pointer static cocos2d::CCScene* scene(); virtual void didAccelerate(cocos2d::CCAcceleration* pAccelerationValue); // implement the "static node()" method manually CREATE_FUNC(HelloWorld);};
2、在HelloWorldScene.cpp文件中的init函数中添加如下所示代码。
bool HelloWorld::init(){ bool bRet = false; do { CC_BREAK_IF(! CCLayer::init()); setAccelerometerEnabled(true);m_pBall = CCSprite::create("ball.png");m_pBall->setPosition(ccp(100, 150));addChild(m_pBall);m_pBall->retain(); bRet = true; } while (0); return bRet;}
在init函数中加入setAccelerometerEnabled(true),使得加速度事件可以被捕获,然后重写didAccelerate函数。
3、最后在HelloWorldScene.cpp文件中添加如下所示函数。
void HelloWorld::didAccelerate(CCAcceleration* pAccelerationValue){ CCDirector* pDir = CCDirector::sharedDirector(); /*FIXME: Testing on the Nexus S sometimes m_pBall is NULL */ if ( m_pBall == NULL ) { return; } CCSize ballSize = m_pBall->getContentSize(); CCPoint ptNow = m_pBall->getPosition(); CCPoint ptTemp = pDir->convertToUI(ptNow); ptTemp.x += pAccelerationValue->x * 9.81f; ptTemp.y -= pAccelerationValue->y * 9.81f; CCPoint ptNext = pDir->convertToGL(ptTemp); FIX_POS(ptNext.x, (10 + ballSize.width / 2.0), (100 - ballSize.width / 2.0)); FIX_POS(ptNext.y, (50 + ballSize.height / 2.0), (150 - ballSize.height / 2.0)); m_pBall->setPosition(ptNext);}
在didAccelerate函数中获得CCAcceleration结构体,获得x轴和y轴的以重力为单位的加速度值,分别乘以重力加速
度值获得相应的加速度。
4、运行实例效果图
源码下载地址
- 【Cocos2d-X开发学习笔记】第24期:事件处理机制之加速度传感器事件
- 【Cocos2d-X开发学习笔记】第22期:事件处理机制之触屏事件
- 【Cocos2d-X开发学习笔记】第23期:事件处理机制之按键事件
- cocos2d-x基本知识点:事件处理机制之加速度传感器事件
- Cocos2D-X开发学习笔记1:加速度传感器
- Cocos2d-x学习笔记(九)-------->Touch事件处理机制
- Cocos2d-x学习笔记—事件处理机制
- Cocos2d-x之Touch事件处理机制
- Cocos2d-x之Touch事件处理机制
- Cocos2d-x之Touch事件处理机制
- Cocos2d-x之Touch事件处理机制
- Cocos2d-x之Touch事件处理机制
- Cocos2d-x之Touch事件处理机制
- Cocos2d-x之Touch事件处理机制
- Cocos2d-x之Touch事件处理机制
- cocos2d-x-3.0学习笔记之用户事件机制
- Cocos2d-x事件分发机制学习笔记
- Cocos2d-x学习笔记(五)CCLayer分析及输入事件处理(触摸、重力传感器、按键)
- Cocos2d-x的SprideMonkey的JavaScript与C++的交互(三) - 全局变量Obj的操作
- Cocos2d-x的SprideMonkey的JavaScript与C++的交互(二) - 单个全局变量操作
- (Ext基础篇) Ext表格控件
- 3个通用小方法修好内存条故障【xp ghost】
- 一道笔试题:假设在n进制下,下面的等式成立,n的值是(),567*456=150216.
- 【Cocos2d-X开发学习笔记】第24期:事件处理机制之加速度传感器事件
- SQL 函数 参数/功能相关说明
- 笔者精编:使用vos虚拟系统的技巧和建议【386w】
- Codeforces Beta Round #32
- ImageView scaleType
- 如何设置kindle推送,如何推送网页到kindle
- 图片放大缩小的区域点击事件代码例子
- Flatten Binary Tree to Linked List
- 什么和什么 是什么呢