cocos2d-x 重力感应

2024-09-05 13:32
文章标签 cocos2d 感应 重力

本文主要是介绍cocos2d-x 重力感应,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

本文没你想象的那么,,复杂。其实就是通过重力感应控制个小球移动而已。

先看头文件:

[cpp] view plain copy
  1. #ifndef __HELLOWORLD_SCENE_H__  
  2. #define __HELLOWORLD_SCENE_H__  
  3.   
  4. #include "cocos2d.h"  
  5. USING_NS_CC;  
  6.   
  7. class HelloWorld : public cocos2d::CCLayer  
  8. {  
  9. public:  
  10.     HelloWorld(void);  
  11.     ~HelloWorld(void);  
  12.   
  13.     // Here's a difference. Method 'init' in cocos2d-x returns bool, instead of returning 'id' in cocos2d-iphone  
  14.     virtual bool init();    
  15.   
  16.     // there's no 'id' in cpp, so we recommand to return the exactly class pointer  
  17.     static cocos2d::CCScene* scene();  
  18.       
  19.     // a selector callback  
  20.     void menuCloseCallback(CCObject* pSender);  
  21.   
  22.      virtual void didAccelerate(CCAcceleration* pAccelerationValue);  
  23.   
  24.     // implement the "static node()" method manually  
  25.     CREATE_FUNC(HelloWorld);  
  26.   
  27. protected:  
  28.     CCSprite* m_pBall;  
  29.     double    m_fLastTime;  
  30. };  
  31.   
  32. #endif  // __HELLOWORLD_SCENE_H__  


看.cpp
[cpp] view plain copy
  1. #include "HelloWorldScene.h"  
  2.   
  3. using namespace cocos2d;  
  4.   
  5. #define FIX_POS(_pos, _min, _max) \  
  6.     if (_pos < _min)        \  
  7.     _pos = _min;        \  
  8. else if (_pos > _max)   \  
  9.     _pos = _max;        \  
  10.   
  11. HelloWorld::HelloWorld()  
  12. : m_fLastTime(0.0)  
  13. {  
  14. }  
  15.   
  16. HelloWorld::~HelloWorld()  
  17. {  
  18.      m_pBall->release();  
  19. }  
  20.   
  21. CCScene* HelloWorld::scene()  
  22. {  
  23.     CCScene * scene = NULL;  
  24.     do   
  25.     {  
  26.         // 'scene' is an autorelease object  
  27.         scene = CCScene::create();  
  28.         CC_BREAK_IF(! scene);  
  29.   
  30.         // 'layer' is an autorelease object  
  31.         HelloWorld *layer = HelloWorld::create();  
  32.         CC_BREAK_IF(! layer);  
  33.   
  34.         // add layer as a child to scene  
  35.         scene->addChild(layer);  
  36.     } while (0);  
  37.   
  38.     // return the scene  
  39.     return scene;  
  40. }  
  41.   
  42. // on "init" you need to initialize your instance  
  43. bool HelloWorld::init()  
  44. {  
  45.     bool bRet = false;  
  46.     do   
  47.     {  
  48.         CC_BREAK_IF(! CCLayer::init());  
  49.   
  50.         CCMenuItemImage *pCloseItem = CCMenuItemImage::create(  
  51.             "CloseNormal.png",  
  52.             "CloseSelected.png",  
  53.             this,  
  54.             menu_selector(HelloWorld::menuCloseCallback));  
  55.         CC_BREAK_IF(! pCloseItem);  
  56.   
  57.         // Place the menu item bottom-right conner.  
  58.         pCloseItem->setPosition(ccp(CCDirector::sharedDirector()->getWinSize().width - 20, 20));  
  59.   
  60.         // Create a menu with the "close" menu item, it's an auto release object.  
  61.         CCMenu* pMenu = CCMenu::create(pCloseItem, NULL);  
  62.         pMenu->setPosition(CCPointZero);  
  63.         CC_BREAK_IF(! pMenu);  
  64.   
  65.         // Add the menu to HelloWorld layer as a child layer.  
  66.         this->addChild(pMenu, 1);  
  67.   
  68.     //add Accelerometer  
  69.     CSize size = CCDirector::sharedDirector()->getWinSize();  
  70.   
  71.         setAccelerometerEnabled(true);//打开重力感应  
  72.   
  73.     m_pBall = CCSprite::create("ball.png");  
  74.     m_pBall->setPosition(ccp(size.width/2, size.height/2));  
  75.     addChild(m_pBall);  
  76.   
  77.     m_pBall->retain();  
  78.   
  79.         bRet = true;  
  80.     } while (0);  
  81.   
  82.     return bRet;  
  83. }  
  84.   
  85. <pre name="code" class="cpp">void HelloWorld::menuCloseCallback(CCObject* pSender)  
  86. {  
  87.     // "close" menu item clicked  
  88.     CCDirector::sharedDirector()->end();  
  89. }  
  90.   
  91. void HelloWorld::didAccelerate(CCAcceleration* pAccelerationValue)  
  92. {  
  93. //     double fNow = pAccelerationValue->timestamp;  
  94. //   
  95. //     if (m_fLastTime > 0.0)  
  96. //     {  
  97. //         CCPoint ptNow = convertToUI  
  98. //     }  
  99. //   
  100. //     m_fLastTime = fNow;  
  101.     CCSize size = CCDirector::sharedDirector()->getWinSize();  
  102.   
  103.     CCDirector* pDir = CCDirector::sharedDirector();  
  104.   
  105.      /*FIXME: Testing on the Nexus S sometimes m_pBall is NULL */  
  106.      if ( m_pBall == NULL ) {  
  107.             return;  
  108.         }  
  109.   
  110.      CCSize ballSize  = m_pBall->getContentSize();  
  111.   
  112.     CCPoint ptNow  = m_pBall->getPosition();  
  113.         CCPoint ptTemp = pDir->convertToUI(ptNow);  
  114.   
  115.     //9.8 重力加速度  
  116.         ptTemp.x += pAccelerationValue->x * 9.81f;  
  117.         ptTemp.y -= pAccelerationValue->y * 9.81f;  
  118.   
  119.     CCPoint ptNext = pDir->convertToGL(ptTemp);  
  120.     FIX_POS(ptNext.x, (0+ballSize.width / 2.0), (size.width - ballSize.width / 2.0));  
  121.     FIX_POS(ptNext.y, (0+ballSize.height / 2.0), (size.height - ballSize.height / 2.0));  
  122.     m_pBall->setPosition(ptNext);  
  123. }</pre>  
  124. <p></p>  
  125. <pre></pre> 

这篇关于cocos2d-x 重力感应的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

【无线通信发展史⑧】测量地球质量?重力加速度g的测量?如何推导单摆周期公式?地球半径R是怎么测量出来的?

前言:用这几个问答形式来解读下我这个系列的来龙去脉。如果大家觉得本篇文章不水的话希望帮忙点赞收藏加关注,你们的鼓舞是我继续更新的动力。 我为什么会写这个系列呢? 首先肯定是因为我本身就是一名从业通信者,想着更加了解自己专业的知识,所以更想着从头开始了解通信的来源以及在每一个时代的发展进程。 为什么会从头开始写通信? 我最早是学习了中华上下五千年,应该说朝代史,这个算个人兴趣,从夏

Cocos2d-x自适应Android屏幕分辨

ndroid下分辨率太多,不太可能为每种分辨率做一套资源,目前一般来说比较流行的是320*480, 800*400, 854*400。当然现在720P的也出来了,但至少目前不是主流机型^_^. 对于不支持的分辨率,我希望的是能够按照屏幕大小按比例缩放,即有了下面的代码。 1:ViewAutoScale 写了一个ViewAutoScale函数,如下:   #include "ViewAuto

cocos2d-x Android实现广告条竖立放置

 2:实现 原理:将屏幕设置为竖屏,然后CCDirector::setDeviceOrientation()设置为cocos2d-x为横屏。            在这种转屏模式下,控件是不会旋转的 缺点:所有Android原生控件仍然是竖立的 注意事项: ccTouchesBegan,ccTouchesMoved, ccTouchesEnded传入的坐标值仍然是屏幕坐标

基于PI控制算法的异步感应电机转速控制系统simulink建模与仿真

目录 1.课题概述 2.系统仿真结果 3.核心程序与模型 4.系统原理简介 5.完整工程文件 1.课题概述        基于PI控制算法的异步感应电机转速控制系统simulink建模与仿真。PI控制器是一种经典的线性控制器,它通过将控制量的比例部分和积分部分相结合来实现对系统输出的调节。比例部分用于快速响应偏差,而积分部分则用于消除稳态误差。 2.系统仿真结果 (完整程

Cocos2d-x 场景切换深入篇

接着上一次的场景切换1,要补充一些内容 如果Last对应的回调函数是这样写的 void MyScene::LastSceneCallback(CCObject* pSender)  {   //CCScene* scene =new MyScene();   //CCLayer* pLayer = new LayerPanda();   //scene->addChild(pLayer

cocos2d-x ScrollView(上)

scrollView 的调用问题困扰我很久,昨天才有时间继续研究这个,可惜最后还是没能完全解决它存在的问题。。。 看头文件: [cpp] view plain copy #ifndef __HELLOWORLD_SCENE_H__  #define __HELLOWORLD_SCENE_H__    #include "cocos2d.h"    #include "../..

Cocos2D-X开发神器CocoCreator使用介绍

你还在为搭建Cocos2d-x开发环境而头痛么,还在为平台移植问题而困扰么,我想大家都想更加快速得进行开发,今天才知道这个神器的,稍微使用了一下,觉得还是挺ok的一个开发工具,所以这里推荐给大家。   可以到下面地址下载:    http://cococreator.com/         更详细的介绍请参考CSDN认证专家小巫的博客文章:  ,手机游戏开发培训;      http:/

cocos2d-x 如何使用CCProgressTimer作为血条,实现跟随怪物进行移动,自动掉血,然后死亡。

Cocos2d-x中类CCProgressTimer实现游戏人物血条 一、CCProgressTimer的基本使用步骤: cocos2d-x的进度条函数CCProgressTimer,我们可以这样定义: 1. //s_pPathSister1为图片的路径 2. CCProgressTimer *left = CCProgressTimer::create(

cocos2d的暂停/恢复

cocos2d提供了比较重要的有3种暂停、恢复的机制 分别是CCDirector, CCActionManager, CCScheduler提供的 1 CCDirecotor: -(void) pause; -(void) resume; 导演类的暂停恢复是针对整个运行场景的,所以如果我们还想在暂停的画面上做其他事情,不推荐这种方法 2 CCActionManager -(voi

cocos2d-x基础知识(四) 简单菜单及坐标系

关于cocos2d坐标系的一点点心得   cocos2d-x 中关于convertToNodeSpace 的用法: cocos2d-x 中关于convertToNodeSpace 的用法: A->converToNodeSpace(CCPoint point )的意思是将point 转换成A的坐标系中的位置点。 我在做连连游戏中由于精灵在自定义的CC