http://blog.csdn.net/xuguangsoft/article/details/8656586

本博客例子参考:raywenderlich

我将上面obj-c的翻译成了C++,改动很少。首先在win32下新建新工程

修改HelloWorldScene.h

[cpp]view plaincopy
  1. #ifndef __HELLOWORLD_SCENE_H__
  2. #define __HELLOWORLD_SCENE_H__
  3. #include "cocos2d.h"
  4. #include "Box2D/Box2D.h"
  5. class HelloWorld : public cocos2d::CCLayer
  6. {
  7. public:
  8. HelloWorld();
  9. ~HelloWorld();
  10. virtual bool init();
  11. CREATE_FUNC(HelloWorld);
  12. static cocos2d::CCScene* scene();
  13. void menuCloseCallback(CCObject* pSender);
  14. virtual void update(float dt);
  15. // 启动重力感应后,重力方向改变会回调didAccelerate
  16. void didAccelerate(cocos2d::CCAcceleration* pAccelerationValue);
  17. public:
  18. b2World *m_world;
  19. cocos2d::CCSprite *m_ball;
  20. };
  21. #endif  // __HELLOWORLD_SCENE_H__

HelloWorldScene.cpp代码如下:

[cpp]view plaincopy
  1. #include "HelloWorldScene.h"
  2. using namespace cocos2d;
  3. #define PTM_RATIO 32
  4. HelloWorld::HelloWorld()
  5. {
  6. m_world = NULL;
  7. m_ball = NULL;
  8. }
  9. HelloWorld::~HelloWorld()
  10. {
  11. delete m_world;
  12. m_ball = NULL;
  13. }
  14. CCScene* HelloWorld::scene()
  15. {
  16. CCScene * scene = NULL;
  17. do
  18. {
  19. // 'scene' is an autorelease object
  20. scene = CCScene::create();
  21. CC_BREAK_IF(! scene);
  22. // 'layer' is an autorelease object
  23. HelloWorld *layer = HelloWorld::create();
  24. CC_BREAK_IF(! layer);
  25. // add layer as a child to scene
  26. scene->addChild(layer);
  27. } while (0);
  28. // return the scene
  29. return scene;
  30. }
  31. // on "init" you need to initialize your instance
  32. bool HelloWorld::init()
  33. {
  34. bool bRet = false;
  35. do
  36. {
  37. CC_BREAK_IF(! CCLayer::init());
  38. // quit menu
  39. CCMenuItemImage *pCloseItem = CCMenuItemImage::create(
  40. "CloseNormal.png",
  41. "CloseSelected.png",
  42. this,
  43. menu_selector(HelloWorld::menuCloseCallback));
  44. CC_BREAK_IF(! pCloseItem);
  45. pCloseItem->setPosition(ccp(CCDirector::sharedDirector()->getWinSize().width - 20, 20));
  46. CCMenu* pMenu = CCMenu::create(pCloseItem, NULL);
  47. pMenu->setPosition(CCPointZero);
  48. CC_BREAK_IF(! pMenu);
  49. this->addChild(pMenu, 1);
  50. // window size
  51. CCSize size = CCDirector::sharedDirector()->getWinSize();
  52. // add a sprite
  53. m_ball = CCSprite::create("Ball.jpg");
  54. this->addChild(m_ball);
  55. m_ball->setPosition(ccp(100, 100));
  56. b2Vec2 gravity = b2Vec2(0.0f, -30.0f);                              // 重力系数
  57. m_world = new b2World(gravity);                                     // 创建重力
  58. // create edge ground
  59. b2BodyDef groundBodyDef;                                            // 边缘刚体定义
  60. b2Body *groundBody = m_world->CreateBody(&groundBodyDef);            // 创建边缘刚体
  61. b2PolygonShape groundBox;
  62. // bottom
  63. groundBox.SetAsBox(size.width / PTM_RATIO, 0, b2Vec2(0, 0), 0);
  64. groundBody->CreateFixture(&groundBox, 0);
  65. // up
  66. groundBox.SetAsBox(size.width / PTM_RATIO, 0, b2Vec2(0,size.height/PTM_RATIO), 0);
  67. groundBody->CreateFixture(&groundBox, 0);
  68. // left
  69. groundBox.SetAsBox(0, size.height / PTM_RATIO, b2Vec2(0,0), 0);
  70. groundBody->CreateFixture(&groundBox, 0);
  71. // right
  72. groundBox.SetAsBox(0,  size.height / PTM_RATIO, b2Vec2(size.width/PTM_RATIO,0), 0);
  73. groundBody->CreateFixture(&groundBox, 0);
  74. // create ball body an shape
  75. b2BodyDef ballBodyDef;
  76. ballBodyDef.type = b2_dynamicBody;                              // 刚体类型:动态
  77. ballBodyDef.position.Set(100 / PTM_RATIO, 100 / PTM_RATIO);     // 设置位置
  78. ballBodyDef.userData = m_ball;                                  // 绑定数据:精灵
  79. b2Body *body = m_world->CreateBody(&ballBodyDef);                        // 创建刚体
  80. b2CircleShape circle;                                           // 圆形定义
  81. circle.m_radius = 26.0 / PTM_RATIO;                             // 半径
  82. b2FixtureDef ballFixtureDef;                                    // 定制器
  83. ballFixtureDef.shape = &circle;                                 // 绑定圆形
  84. ballFixtureDef.density = 1.0f;                                  // 密度
  85. ballFixtureDef.friction = 0.2f;                                 // 摩擦系数
  86. ballFixtureDef.restitution = 0.8f;                              // 恢复:用于弹力的
  87. body->CreateFixture(&ballFixtureDef);
  88. this->setAccelerometerEnabled(true);    // 在层里启用重力感应
  89. this->scheduleUpdate();
  90. bRet = true;
  91. } while (0);
  92. return bRet;
  93. }
  94. void HelloWorld::menuCloseCallback(CCObject* pSender)
  95. {
  96. // "close" menu item clicked
  97. CCDirector::sharedDirector()->end();
  98. }
  99. void HelloWorld::update(float dt)
  100. {
  101. int velocityIterations = 8;
  102. int positionIterations = 1;
  103. m_world->Step(dt, velocityIterations, positionIterations);
  104. for (b2Body *b = m_world->GetBodyList(); b; b = b->GetNext())
  105. {
  106. if (b->GetUserData() != NULL)
  107. {
  108. CCSprite *ballData = (CCSprite*) b->GetUserData();
  109. ballData->setPosition(ccp(b->GetPosition().x * PTM_RATIO, b->GetPosition().y * PTM_RATIO));
  110. ballData->setRotation(CC_RADIANS_TO_DEGREES(b->GetAngle()));
  111. }
  112. }
  113. }
  114. void HelloWorld::didAccelerate(CCAcceleration* pAccelerationValue)
  115. {
  116. b2Vec2 gravity(- pAccelerationValue->y * 15, pAccelerationValue->x * 15);
  117. m_world->SetGravity(gravity);
  118. }

运行效果如下:

在移植到android真机调试时,发现重力感应方向并不对,

这里我将didAccelerate的实现,重新设置重力修改成如下:

b2Vec2 gravity(pAccelerationValue->x * 15, pAccelerationValue->y * 15);
m_world->SetGravity(gravity);

它就能正确感应了。

box2d弹球 cocos2d-x重力感应(cocos2d-x2.1)相关推荐

  1. 关于物理引擎的使用,及其重力感应的小test

    好久没写博文了,过去那些天比较忙,一直在做点别的东西,不过作为小菜的我也不忘记学习,现在跟大家分享下我的小知识吧! 首先建立个带有box2d物理引擎的项目,在头文件中加入 public:// Here ...

  2. Cocos2d-x3.2 重力感应

    为什么80%的码农都做不了架构师?>>>    //GameScene.h#include "cocos2d.h"USING_NS_CC;class GameSc ...

  3. [寒江孤叶丶的Cocos2d-x之旅_11]Cocos2d-x的重力感应Demo。如何使用重力感应。

    在开发一些赛车类,或者躲避类的游戏中,经常会用到重力感应的功能.比如以前玩儿的控制一个金属球走迷宫的游戏. 在最近这个版本的TestCPP中我没有找到关于重力感应的例程,不知道是官方没有添加还是我自己 ...

  4. 我的雷电游戏(重力感应控制)

    算是第一个写的比较满意的游戏吧,肯定还有很多很多不足,希望高手能指点下,呵.现在在看图灵出版的一本android游戏的书籍,有点难,涉及底层有点多,都是JNI.NDK.linux shell脚本等,主 ...

  5. 【转】重力感应和罗盘

    iPad 的玩家大概都用过 StarWalk 这款应用--强力到无以附加的星图软件.StarWalk 里的世界其实就是虚拟了一个环绕用户的天球,当然还能够与真实的天球对应得上,当用户举着 iPad 对 ...

  6. [Unity 3D] 重力感应与罗盘

    原址:http://blog.csdn.net/lijing_hi/article/details/7252954 [Unity 3D] 重力感应与罗盘(一) iPad 的玩家大概都用过 StarWa ...

  7. [Unity 3D] 重力感应与罗盘(二)

    让世界旋转起来: 游戏世界的主摄像机就是我们在游戏里的"眼睛",为了让"眼睛"能够与手持 iPad 的我们保持协调,跟随着我们自己转身而转动,好像我们自己就站在 ...

  8. Kinect for windows的重力感应和角度马达

    上图是Kinect的重力感应方向图,Kinect右边为X正方向,最大值为1,反方向为-1,Kinect下方为Y正方向,最大值为1,反方向为-1,Kinect后面为Z正方向,最大值为1,反方向为-1. ...

  9. 重力感应的测试程序andriod源代码

    2019独角兽企业重金招聘Python工程师标准>>> 重力感应的测试程序andriod源代码,不多说了适合初学者,界面需要改进 转载:http://www.adobex.com/a ...

  10. Unity3D 游戏引擎之平面小球重力感应详解【转】

    http://blog.csdn.net/xys289187120/article/details/6969333       手机重力感应应该对大多数开发者并不陌生,在新一代智能手机Android  ...

最新文章

  1. 机电传动控制第二周学习笔记
  2. Android 网易云信获取图片,Android 网易云信集成(一)
  3. 使用Fork/Join框架优化归并排序
  4. spring 注解上传文件 @RequestParam,FormData上传文件
  5. fdopen()和fileno()函数
  6. QT 动态创建对象(第一种方法)
  7. 针对提高48V 配电性能的诸多思考!
  8. flask json传输失败_GO小知识之实例演示 json 如何转化为 map 和 struct
  9. spring boot配置ip_Zookeeper作为配置中心使用说明
  10. java机房收费管理系统课程设计_(c语言)机房收费管理系统课程设计
  11. 电子电路基础——知识点(上篇)
  12. 设计师配色宝典!教你从零开始学配色(一)
  13. 一个农村博士的独白:全家为什么只有我读到了博士
  14. 如何培养自己的商业思维能力?
  15. window.scrollTo滚动
  16. 【腾讯Bugly干货分享】Android 进程保活招式大全
  17. python水浒传名字次数_梁山上,小李广的“小”是什么意思?“病关索”是生病的关索?...
  18. python 鼠标连点脚本
  19. How to Have a Healthy Relationship --shanbei 为单身节写
  20. 机器学习之集成学习(实验记录)

热门文章

  1. php 公众号管理系统源码,SmartWx微信公众号管理系统 v2.0
  2. linux设置mysql开机启动
  3. 常用的vim命令,主要是写给宝贝儿方便工作查看的
  4. 2016 博客导读总结 个人感悟
  5. 智能交通系列产品-电子警察(宇视)
  6. 身份证实名认证接口,实名认证API接口文档
  7. 六一儿童节(python)
  8. java笔试题-六一儿童节
  9. 基于epoll,socket与protobuf的简单帧同步游戏服务器
  10. 大专生从零开始重新学习c#的第八天