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

相关文章

基于 Cursor 开发 Spring Boot 项目详细攻略

《基于Cursor开发SpringBoot项目详细攻略》Cursor是集成GPT4、Claude3.5等LLM的VSCode类AI编程工具,支持SpringBoot项目开发全流程,涵盖环境配... 目录cursor是什么?基于 Cursor 开发 Spring Boot 项目完整指南1. 环境准备2. 创建

SpringBoot 多环境开发实战(从配置、管理与控制)

《SpringBoot多环境开发实战(从配置、管理与控制)》本文详解SpringBoot多环境配置,涵盖单文件YAML、多文件模式、MavenProfile分组及激活策略,通过优先级控制灵活切换环境... 目录一、多环境开发基础(单文件 YAML 版)(一)配置原理与优势(二)实操示例二、多环境开发多文件版

使用docker搭建嵌入式Linux开发环境

《使用docker搭建嵌入式Linux开发环境》本文主要介绍了使用docker搭建嵌入式Linux开发环境,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面... 目录1、前言2、安装docker3、编写容器管理脚本4、创建容器1、前言在日常开发全志、rk等不同

Python实战之SEO优化自动化工具开发指南

《Python实战之SEO优化自动化工具开发指南》在数字化营销时代,搜索引擎优化(SEO)已成为网站获取流量的重要手段,本文将带您使用Python开发一套完整的SEO自动化工具,需要的可以了解下... 目录前言项目概述技术栈选择核心模块实现1. 关键词研究模块2. 网站技术seo检测模块3. 内容优化分析模

基于Java开发一个极简版敏感词检测工具

《基于Java开发一个极简版敏感词检测工具》这篇文章主要为大家详细介绍了如何基于Java开发一个极简版敏感词检测工具,文中的示例代码简洁易懂,感兴趣的小伙伴可以跟随小编一起学习一下... 目录你是否还在为敏感词检测头疼一、极简版Java敏感词检测工具的3大核心优势1.1 优势1:DFA算法驱动,效率提升10

Python开发简易网络服务器的示例详解(新手入门)

《Python开发简易网络服务器的示例详解(新手入门)》网络服务器是互联网基础设施的核心组件,它本质上是一个持续运行的程序,负责监听特定端口,本文将使用Python开发一个简单的网络服务器,感兴趣的小... 目录网络服务器基础概念python内置服务器模块1. HTTP服务器模块2. Socket服务器模块

Java 与 LibreOffice 集成开发指南(环境搭建及代码示例)

《Java与LibreOffice集成开发指南(环境搭建及代码示例)》本文介绍Java与LibreOffice的集成方法,涵盖环境配置、API调用、文档转换、UNO桥接及REST接口等技术,提供... 目录1. 引言2. 环境搭建2.1 安装 LibreOffice2.2 配置 Java 开发环境2.3 配

Python38个游戏开发库整理汇总

《Python38个游戏开发库整理汇总》文章介绍了多种Python游戏开发库,涵盖2D/3D游戏开发、多人游戏框架及视觉小说引擎,适合不同需求的开发者入门,强调跨平台支持与易用性,并鼓励读者交流反馈以... 目录PyGameCocos2dPySoyPyOgrepygletPanda3DBlenderFife

使用Python开发一个Ditto剪贴板数据导出工具

《使用Python开发一个Ditto剪贴板数据导出工具》在日常工作中,我们经常需要处理大量的剪贴板数据,下面将介绍如何使用Python的wxPython库开发一个图形化工具,实现从Ditto数据库中读... 目录前言运行结果项目需求分析技术选型核心功能实现1. Ditto数据库结构分析2. 数据库自动定位3

Django开发时如何避免频繁发送短信验证码(python图文代码)

《Django开发时如何避免频繁发送短信验证码(python图文代码)》Django开发时,为防止频繁发送验证码,后端需用Redis限制请求频率,结合管道技术提升效率,通过生产者消费者模式解耦业务逻辑... 目录避免频繁发送 验证码1. www.chinasem.cn避免频繁发送 验证码逻辑分析2. 避免频繁