cocos2dx游戏开发加速度计

2024-06-17 10:08

本文主要是介绍cocos2dx游戏开发加速度计,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

在cocos2d-x引擎中 使用了类CCAccelerometer来存储加速度计的信息 类CCAccelerometer的作用和用户操作的分发器类似 区别在于用户操作的分发器可以拥有很多委托对象 而加速度计只存在一个委托对象 这是因为一个移动设备只有一个硬件 所以接口进行了简化 CCAccelerometerDelegate就是加速度计的委托对象 

和触摸事件事件一样 重力感应的处理先被引擎抽象为一个触摸代理的协议 然后由CCLayer提供了一个接口 在实际开发中 只需要重载加速度计事件即可

virtual void didAccelerate(CCAcceleration* pAccelerationValue);

CCAcceleration是一个结构体 包含加速度计获得的三个方向的加速度

[cpp] view plaincopy
  1. typedef struct  
  2.  
  3. double x;  
  4. double y;  
  5. double z;  
  6. double timestamp;  
  7. }CCAcceleration;  

为了便于游戏中开发使用 每一个结构体中的每一个方向的加速度大小都是以一个重力加速度为单位9.8m/s的平方 举例来说 当手机放置得桌子上的时候 获得的加速度应该为(0,1,0)

 正常使用的时候 总的加速度应该在1上下波动 如果检测到一个大幅度的偏离1 可以判断为突然动作:手摇手机 会在一个或者多个方向上出现出很大的加速度 投掷或者坠落则很容易检测到一个很小的加速度 


[cpp] view plaincopy
  1. void AccelerometerTest::onEnter()  
  2.  
  3.     CCLayer::onEnter();  
  4.   
  5.     setAccelerometerEnabled(true);//想要当前CCNode对象可以接收加速度计的操作信息 必须在初始化函数中调用此函数  
  6.   
  7.   
  8.     CCLabelTTF* label CCLabelTTF::create(title().c_str(), "Arial"32);  
  9.     addChild(label, 1);  
  10.     label->setPosition( ccp(VisibleRect::center().x, VisibleRect::top().y-50) );  
  11.   
  12.     m_pBall CCSprite::create("Images/ball.png");  
  13.     m_pBall->setPosition(ccp(VisibleRect::center().x, VisibleRect::center().y));  
  14.     addChild(m_pBall);  
  15.   
  16.     m_pBall->retain();  
  17.  

重写didAccelerate这个函数 获得CCAcceleration结构体信息 获得X,Y,Z方向上的加速度 分别乘以重力加速度获得相应的加速度

[cpp] view plaincopy
  1.   
[cpp] view plaincopy
  1. void AccelerometerTest::didAccelerate(CCAcceleration* pAccelerationValue)  
  2.  
  3. //     double fNow pAccelerationValue->timestamp;  
  4. //   
  5. //     if (m_fLastTime 0.0)  
  6. //     {  
  7. //         CCPoint ptNow convertToUI  
  8. //     }  
  9. //   
  10. //     m_fLastTime fNow;  
  11.   
  12.     CCDirector* pDir CCDirector::sharedDirector();  
  13.   
  14.       
  15.     if m_pBall == NULL  
  16.         return 
  17.      
  18.   
  19.     CCSize ballSize  m_pBall->getContentSize();  
  20.   
  21.     CCPoint ptNow  m_pBall->getPosition();  
  22.     CCPoint ptTemp pDir->convertToUI(ptNow);  
  23.   
  24.     ptTemp.x += pAccelerationValue->x 9.81f;  
  25.     ptTemp.y -= pAccelerationValue->y 9.81f;  
  26.   
  27.     CCPoint ptNext pDir->convertToGL(ptTemp);  
  28.     FIX_POS(ptNext.x, (VisibleRect::left().x+ballSize.width 2.0), (VisibleRect::right().x ballSize.width 2.0));  
  29.     FIX_POS(ptNext.y, (VisibleRect::bottom().y+ballSize.height 2.0), (VisibleRect::top().y ballSize.height 2.0));  
  30.     m_pBall->setPosition(ptNext);  
  31.  
  32.   
  33. //------------------------------------------------------------------  
  34. //  
  35. // AccelerometerTestScene  
  36. //  
  37. //------------------------------------------------------------------  
  38. void AccelerometerTestScene::runThisTest()  
  39.  
  40.     CCLayer* pLayer new AccelerometerTest();  
  41.     addChild(pLayer);  
  42.     pLayer->release();  
  43.   
  44.     CCDirector::sharedDirector()->replaceScene(this);  
  45.  



初始化加速度计信息:
[cpp] view plaincopy
  1. class CC_DLL CCAccelerometer  
  2.  
  3. public 
  4.     CCAccelerometer();  
  5.     ~CCAccelerometer();  
  6.   
  7.     void setDelegate(CCAccelerometerDelegate* pDelegate);  
  8.     void setAccelerometerInterval(float interval);  
  9.     void update( double x,double y,double z,double timestamp );  
  10. private 
  11.     CCAcceleration m_obAccelerationValue;  
  12.     CCAccelerometerDelegate* m_pAccelDelegate;  
  13. };  
  14.   
  15. NS_CC_END  

[cpp] view plaincopy
  1. CCAccelerometer::CCAccelerometer()   
  2.     m_pAccelDelegate(NULL)  
  3.  
  4.     memset(&m_obAccelerationValue, 0, sizeof(m_obAccelerationValue));  
  5.  
  6.   
  7. CCAccelerometer::~CCAccelerometer()   
  8.  
  9.   
  10.  
  11.   
  12. void CCAccelerometer::setDelegate(CCAccelerometerDelegate* pDelegate)   
  13.  
  14.     m_pAccelDelegate pDelegate;  
  15.   
  16.     // Enable/disable the accelerometer.  
  17.     // Well, there isn't one on Win32 so we don't do anything other than register  
  18.     // and deregister ourselves from the Windows Key handler.  
  19.     if (pDelegate)  
  20.      
  21.         // Register our handler  
  22.         CCEGLView::sharedOpenGLView()->setAccelerometerKeyHook( &myAccelerometerKeyHook );  
  23.      
  24.     else  
  25.      
  26.         // De-register our handler  
  27.         CCEGLView::sharedOpenGLView()->setAccelerometerKeyHook( NULL );  
  28.         resetAccelerometer();  
  29.      
  30.  
  31.   
  32. void CCAccelerometer::setAccelerometerInterval(float interval)  
  33.  
  34.   
  35.  
  36.   
  37. void CCAccelerometer::update( double x,double y,double z,double timestamp   
  38.  
  39.     if (m_pAccelDelegate)  
  40.      
  41.         m_obAccelerationValue.x            x;  
  42.         m_obAccelerationValue.y            y;  
  43.         m_obAccelerationValue.z            z;  
  44.         m_obAccelerationValue.timestamp timestamp;  
  45.   
  46.         // Delegate  
  47.         m_pAccelDelegate->didAccelerate(&m_obAccelerationValue);  
  48.          
  49.  
  50.   
  51. NS_CC_END 

这篇关于cocos2dx游戏开发加速度计的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1069156

相关文章

Android 悬浮窗开发示例((动态权限请求 | 前台服务和通知 | 悬浮窗创建 )

《Android悬浮窗开发示例((动态权限请求|前台服务和通知|悬浮窗创建)》本文介绍了Android悬浮窗的实现效果,包括动态权限请求、前台服务和通知的使用,悬浮窗权限需要动态申请并引导... 目录一、悬浮窗 动态权限请求1、动态请求权限2、悬浮窗权限说明3、检查动态权限4、申请动态权限5、权限设置完毕后

基于Python开发PPTX压缩工具

《基于Python开发PPTX压缩工具》在日常办公中,PPT文件往往因为图片过大而导致文件体积过大,不便于传输和存储,所以本文将使用Python开发一个PPTX压缩工具,需要的可以了解下... 目录引言全部代码环境准备代码结构代码实现运行结果引言在日常办公中,PPT文件往往因为图片过大而导致文件体积过大,

使用DeepSeek API 结合VSCode提升开发效率

《使用DeepSeekAPI结合VSCode提升开发效率》:本文主要介绍DeepSeekAPI与VisualStudioCode(VSCode)结合使用,以提升软件开发效率,具有一定的参考价值... 目录引言准备工作安装必要的 VSCode 扩展配置 DeepSeek API1. 创建 API 请求文件2.

基于Python开发电脑定时关机工具

《基于Python开发电脑定时关机工具》这篇文章主要为大家详细介绍了如何基于Python开发一个电脑定时关机工具,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录1. 简介2. 运行效果3. 相关源码1. 简介这个程序就像一个“忠实的管家”,帮你按时关掉电脑,而且全程不需要你多做

Java中的Opencv简介与开发环境部署方法

《Java中的Opencv简介与开发环境部署方法》OpenCV是一个开源的计算机视觉和图像处理库,提供了丰富的图像处理算法和工具,它支持多种图像处理和计算机视觉算法,可以用于物体识别与跟踪、图像分割与... 目录1.Opencv简介Opencv的应用2.Java使用OpenCV进行图像操作opencv安装j

基于Qt开发一个简单的OFD阅读器

《基于Qt开发一个简单的OFD阅读器》这篇文章主要为大家详细介绍了如何使用Qt框架开发一个功能强大且性能优异的OFD阅读器,文中的示例代码讲解详细,有需要的小伙伴可以参考一下... 目录摘要引言一、OFD文件格式解析二、文档结构解析三、页面渲染四、用户交互五、性能优化六、示例代码七、未来发展方向八、结论摘要

在 VSCode 中配置 C++ 开发环境的详细教程

《在VSCode中配置C++开发环境的详细教程》本文详细介绍了如何在VisualStudioCode(VSCode)中配置C++开发环境,包括安装必要的工具、配置编译器、设置调试环境等步骤,通... 目录如何在 VSCode 中配置 C++ 开发环境:详细教程1. 什么是 VSCode?2. 安装 VSCo

C#图表开发之Chart详解

《C#图表开发之Chart详解》C#中的Chart控件用于开发图表功能,具有Series和ChartArea两个重要属性,Series属性是SeriesCollection类型,包含多个Series对... 目录OverviChina编程ewSeries类总结OverviewC#中,开发图表功能的控件是Char

鸿蒙开发搭建flutter适配的开发环境

《鸿蒙开发搭建flutter适配的开发环境》文章详细介绍了在Windows系统上如何创建和运行鸿蒙Flutter项目,包括使用flutterdoctor检测环境、创建项目、编译HAP包以及在真机上运... 目录环境搭建创建运行项目打包项目总结环境搭建1.安装 DevEco Studio NEXT IDE

Python开发围棋游戏的实例代码(实现全部功能)

《Python开发围棋游戏的实例代码(实现全部功能)》围棋是一种古老而复杂的策略棋类游戏,起源于中国,已有超过2500年的历史,本文介绍了如何用Python开发一个简单的围棋游戏,实例代码涵盖了游戏的... 目录1. 围棋游戏概述1.1 游戏规则1.2 游戏设计思路2. 环境准备3. 创建棋盘3.1 棋盘类