cocos2d-x 重力感应

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

先看头文件:

[cpp] view plaincopy

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

看.cpp

[cpp] view plaincopy

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

cocos2d-x 重力感应的相关文章

Cocos2D-X2.2.3学习笔记9(处理重力感应事件,移植到Android加入两次返回退出游戏效果)

这节我们来学习Cocos2d-x的最后一节,怎样处理重力感应事件,移植到Android后加入再按一次返回键退出游戏等.我这里用的Android,IOS不会也没设备呃 效果图不好弄,由于是要移植到真机上的. #ifndef __HELLOWORLD_SCENE_H__ #define __HELLOWORLD_SCENE_H__ #include "cocos2d.h" using namespace cocos2d; class HelloWorld : public cocos2d:

Cocos2d-x3.2 重力感应

//GameScene.h #include "cocos2d.h" USING_NS_CC; class GameScene : public cocos2d::Layer { public:     static cocos2d::Scene* createScene();          virtual bool init();          void menuCallback(Ref* pSender);          //重写重力感应函数     virtual v

进阶一之Android重力感应(一)

书山有路勤为径,学海无涯苦作舟. 本讲内容:Android重力感应 下面是三轴方向 android重力感应系统的坐标系以屏幕的左下方为原点([注意]2d编程的时候,是以屏幕左上方为原点的),箭头指向的方向为正.从-10到10,以浮点数为等级单位,想象一下以下情形: 手机屏幕向上(z轴朝天)水平放置的时侯,(x,y,z)的值分别为(0,0,10); 手机屏幕向下(z轴朝地)水平放置的时侯,(x,y,z)的值分别为(0,0,-10); 手机屏幕向左侧放(x轴朝天)的时候,(x,y,z)的值分别为(1

进阶二之Android重力感应(二)

路途再远也要一步步的走不止为了生存而是对其的热爱 本讲内容:Android重力感应 一.SensorMannager传感器管理对象 1.取得SensorMannager 手机中的所有传感器都须要通过SensorMannager来访问,调用getSystemService(SENSOR_SERVICE)方法就可以拿到当前手机的传感器管理对象. sm = (SensorManager) getSystemService(SENSOR_SERVICE); 2.取得Sensor目标各类的值(getSen

coocs2d-html5在使用cocoseditor时调用设备的accelerometer来使用重力感应

在使用大牛touchsnow开发的插件cocoseditor开发游戏时遇到了一些问题,然后就试着解决,最近想试下coocs2d-html5能否使用重力感应,发现是可以的,不过这个只能在移动真机上测试,电脑上的模拟器是不行的, 首先需要在onDidloadFromCCB()方法内设置可以使用Accelerometer: this.rootNode.onAccelerometer = function (event) { this.controller.onAccelerometer(event);

Unity之手机重力感应

做重力感应的朋友兴许能用上,我这里写上来用于有时候自己忘了还能看一下,因为我不认为学东西就能一辈子都记得很牢,所以有时候还是为自己行一下方便,给自己写博客,哈哈. 做Unity的重力感应游戏的时候,我们需要用到这样一个参数:Input.acceleration,这是一个Vectors3类型的一个Input的属性,它里面有三个参数分别是x,y,z.接下来给我大家贴上我画的一张图,这样大家看起来就很明了喽: 哈哈,其它我就不多说了,看不懂的朋友,说明是基础还不够

【Android开发日记】初次探秘Android Service!Service开机启动+重力感应+弹窗+保持运行

前言: 最近在写一个小程序,需求是手机摇一摇就弹窗出来.第一次使用了Service,学习了两天,实现了Service弹窗,开机启动,Activity启动和销毁.满足了自己的需求.现记录学习心得.希望能给你带来一些帮助. 1.Service创建:重写4个方法 onBind():返回一个IBinder对象,这个对象可以使应用程序与Service通信.如果用startService.stopService启动和关闭Service的话,Service和访问者是无法通信交换数据的.onBind()返回值设

android小游戏模版—重力感应

好久没更新博客了,今天来谈谈android小游戏---重力感应,一般在游戏里运用的比较多,比如这类游戏有:神庙逃亡,极品飞车,平衡球,三围重力迷宫,重力赛车等. 首先什么是重力感应,重力感应是指现在手机中常用的一个器件,及加速度传感器.当手机静止时,加速度就是重力,所以一般也叫做重力传感器.这个硬件可以感应加速度的变化,转化为数据提供给系统.还有一种传感器是陀螺仪,检测围绕某轴的旋转动作,是利用有质量的刚体的在做旋转或震动时,如果发生垂直于旋转或震动轴的旋转,因为惯性会产生垂直于旋转或震动轴的柯

HTML5重力感应小球冲撞动画实现教程

今天我们来分享一款很酷的HTML5重力感应动画教程,这款动画可以让你甩动页面中的小球,小球的大小都不同,并且鼠标点击空白区域时又可以生成一定数量的小球.当我们甩动小球时,各个小球之间就会发生互相碰撞的效果,并且在运动过程中模拟了重力感应的物理效果.你可以在DEMO演示中来尝试一下. 你也可以在这里查看在线演示 接下来我们来分析一下这款超酷的HTML5重力动画实现的思路及源码,主要由HTML代码和Javascript代码组成. HTML代码: <div id="canvas">