好记性不如铅笔头

C && C++, cocos2dx, 编程

cocos2dx学习笔记:陀螺仪的使用

最近项目中用到了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的文档:

https://developer.apple.com/library/ios/documentation/CoreMotion/Reference/CMAttitude_Class/Reference/Reference.html 】

https://developer.apple.com/library/ios/documentation/EventHandling/Conceptual/EventHandlingiPhoneOS/motion_event_basics/motion_event_basics.html#//apple_ref/doc/uid/TP40009541-CH6-SW1 】

发表评论

4 × 4 =

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据