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

相关文章

Python实例题之pygame开发打飞机游戏实例代码

《Python实例题之pygame开发打飞机游戏实例代码》对于python的学习者,能够写出一个飞机大战的程序代码,是不是感觉到非常的开心,:本文主要介绍Python实例题之pygame开发打飞机... 目录题目pygame-aircraft-game使用 Pygame 开发的打飞机游戏脚本代码解释初始化部

使用Python开发一个现代化屏幕取色器

《使用Python开发一个现代化屏幕取色器》在UI设计、网页开发等场景中,颜色拾取是高频需求,:本文主要介绍如何使用Python开发一个现代化屏幕取色器,有需要的小伙伴可以参考一下... 目录一、项目概述二、核心功能解析2.1 实时颜色追踪2.2 智能颜色显示三、效果展示四、实现步骤详解4.1 环境配置4.

Python使用smtplib库开发一个邮件自动发送工具

《Python使用smtplib库开发一个邮件自动发送工具》在现代软件开发中,自动化邮件发送是一个非常实用的功能,无论是系统通知、营销邮件、还是日常工作报告,Python的smtplib库都能帮助我们... 目录代码实现与知识点解析1. 导入必要的库2. 配置邮件服务器参数3. 创建邮件发送类4. 实现邮件

基于Python开发一个有趣的工作时长计算器

《基于Python开发一个有趣的工作时长计算器》随着远程办公和弹性工作制的兴起,个人及团队对于工作时长的准确统计需求日益增长,本文将使用Python和PyQt5打造一个工作时长计算器,感兴趣的小伙伴可... 目录概述功能介绍界面展示php软件使用步骤说明代码详解1.窗口初始化与布局2.工作时长计算核心逻辑3

python web 开发之Flask中间件与请求处理钩子的最佳实践

《pythonweb开发之Flask中间件与请求处理钩子的最佳实践》Flask作为轻量级Web框架,提供了灵活的请求处理机制,中间件和请求钩子允许开发者在请求处理的不同阶段插入自定义逻辑,实现诸如... 目录Flask中间件与请求处理钩子完全指南1. 引言2. 请求处理生命周期概述3. 请求钩子详解3.1

如何基于Python开发一个微信自动化工具

《如何基于Python开发一个微信自动化工具》在当今数字化办公场景中,自动化工具已成为提升工作效率的利器,本文将深入剖析一个基于Python的微信自动化工具开发全过程,有需要的小伙伴可以了解下... 目录概述功能全景1. 核心功能模块2. 特色功能效果展示1. 主界面概览2. 定时任务配置3. 操作日志演示

JavaScript实战:智能密码生成器开发指南

本文通过JavaScript实战开发智能密码生成器,详解如何运用crypto.getRandomValues实现加密级随机密码生成,包含多字符组合、安全强度可视化、易混淆字符排除等企业级功能。学习密码强度检测算法与信息熵计算原理,获取可直接嵌入项目的完整代码,提升Web应用的安全开发能力 目录

一文教你如何解决Python开发总是import出错的问题

《一文教你如何解决Python开发总是import出错的问题》经常朋友碰到Python开发的过程中import包报错的问题,所以本文将和大家介绍一下可编辑安装(EditableInstall)模式,可... 目录摘要1. 可编辑安装(Editable Install)模式到底在解决什么问题?2. 原理3.

Python+PyQt5开发一个Windows电脑启动项管理神器

《Python+PyQt5开发一个Windows电脑启动项管理神器》:本文主要介绍如何使用PyQt5开发一款颜值与功能并存的Windows启动项管理工具,不仅能查看/删除现有启动项,还能智能添加新... 目录开篇:为什么我们需要启动项管理工具功能全景图核心技术解析1. Windows注册表操作2. 启动文件

使用Python开发Markdown兼容公式格式转换工具

《使用Python开发Markdown兼容公式格式转换工具》在技术写作中我们经常遇到公式格式问题,例如MathML无法显示,LaTeX格式错乱等,所以本文我们将使用Python开发Markdown兼容... 目录一、工具背景二、环境配置(Windows 10/11)1. 创建conda环境2. 获取XSLT