最近项目中用到了cocos2dx来开发一个基于陀螺仪的demo,忙了半个星期,一边学习一边开发,总算搞了出来。这里备份下开发中学习到的一些cocos2dx知识。
CONTENTS
陀螺仪的使用:
demo的核心就是陀螺仪的使用,怎么用,这里就不说了,楼主语文不好,大家可以参考另一款APP【 疯狂射手 】,我的DEMO就是仿照它的。
整理后的代码如下:
++ .h文件 ++ #ifndef __MOTION_CONTROL_H__ #define __MOTION_CONTROL_H__ #include "cocos2d.h" class MotionControl { public: virtual bool init(void); void release(); void setbaseMotion(void); void updateMotion(void); float getYawOffset(void) { return m_fYawOffset;} float getRollOffset(void) { return m_fRollOffset;} float getPitchOffset(void) { return m_fPitchOffset;} private: void* getCurrAttitude(); void* m_pMotionManger; bool m_bAvailable; void* m_BaseAttitude; float m_fYaw; float m_fRoll; float m_fPitch; float m_fLastYaw; float m_fLastRoll; float m_fLastPitch; float m_fYawOffset; float m_fRollOffset; float m_fPitchOffset; bool m_bIsMotionUpdate; }; #endif //___MOTION_CONTROL_H__ ++ .m文件 ++ #include "MotionControl.h" #include <CoreMotion/CoreMotion.h> #import <CoreFoundation/CoreFoundation.h> USING_NS_CC; bool MotionControl::init(void) { CMMotionManager* motionManager = [[CMMotionManager alloc] init]; motionManager.deviceMotionUpdateInterval = 1.0/60.f; if ( motionManager.isDeviceMotionAvailable) { [motionManager startDeviceMotionUpdates]; } m_BaseAttitude = NULL; m_pMotionManger = (void *)motionManager; setbaseMotion(); return true; } void MotionControl::release() { if ( m_pMotionManger != NULL) { CMMotionManager* tmpMotion = (CMMotionManager *)m_pMotionManger; [tmpMotion release]; m_pMotionManger = NULL; } if (m_BaseAttitude != NULL) { CMAttitude *tmpAttitude = (CMAttitude *)m_BaseAttitude; [tmpAttitude release]; m_BaseAttitude = NULL; } } void* MotionControl::getCurrAttitude() { CMMotionManager* temMotion = (CMMotionManager *)m_pMotionManger; CMDeviceMotion *currentDeviceMotion = temMotion.deviceMotion; CMAttitude *currentAttitude = currentDeviceMotion.attitude; return currentAttitude; } void MotionControl::setbaseMotion(void) { if (m_BaseAttitude != NULL) { CMAttitude *tmpAttitude = (CMAttitude *)m_BaseAttitude; [tmpAttitude release]; m_BaseAttitude = NULL; } CMAttitude *currentAttitude = (CMAttitude *)getCurrAttitude(); m_BaseAttitude = [currentAttitude retain]; m_bIsMotionUpdate = false; m_fYawOffset = 0; m_fRollOffset = 0; m_fPitchOffset = 0; } void MotionControl::updateMotion(void) { if (NULL == m_BaseAttitude) { setbaseMotion(); } CMAttitude *currentAttitude = (CMAttitude *)getCurrAttitude(); [currentAttitude multiplyByInverseOfAttitude:(CMAttitude *)m_BaseAttitude]; m_fYaw = CC_RADIANS_TO_DEGREES(currentAttitude.yaw); m_fRoll = CC_RADIANS_TO_DEGREES(currentAttitude.roll); m_fPitch = CC_RADIANS_TO_DEGREES(currentAttitude.pitch); if (!m_bIsMotionUpdate) { m_bIsMotionUpdate = true; m_fLastYaw = m_fYaw; m_fLastRoll = m_fRoll; m_fLastPitch = m_fPitch; } m_fYawOffset = m_fYaw - m_fLastYaw; m_fRollOffset = m_fRoll - m_fLastRoll; m_fPitchOffset = m_fPitch - m_fLastPitch; m_fLastYaw = m_fYaw; m_fLastRoll = m_fRoll; m_fLastPitch = m_fPitch; }
备注:
作者当时比较赶项目,结果欲速而不达了,在网上搜索的各种代码均不靠谱,反而浪费了时间,最后还是老老实实的看了下apple的文档,结果发现很简单。这里备份下几个网址,以备不时之需。
【 http://blog.csdn.net/aiyongyyy/article/details/7986810http://www.cnblogs.com/binbingg/p/3442624.html 】
【 http://blog.csdn.net/cocos2der/article/details/7030384 】
【 http://blog.sina.com.cn/s/blog_7b9d64af0101cu4p.html 】
apple的文档:
发表评论