box2d弹球 cocos2d-x重力感应(cocos2d-x2.1)
http://blog.csdn.net/xuguangsoft/article/details/8656586
本博客例子参考:raywenderlich
我将上面obj-c的翻译成了C++,改动很少。首先在win32下新建新工程
修改HelloWorldScene.h
- #ifndef __HELLOWORLD_SCENE_H__
- #define __HELLOWORLD_SCENE_H__
- #include "cocos2d.h"
- #include "Box2D/Box2D.h"
- class HelloWorld : public cocos2d::CCLayer
- {
- public:
- HelloWorld();
- ~HelloWorld();
- virtual bool init();
- CREATE_FUNC(HelloWorld);
- static cocos2d::CCScene* scene();
- void menuCloseCallback(CCObject* pSender);
- virtual void update(float dt);
- // 启动重力感应后,重力方向改变会回调didAccelerate
- void didAccelerate(cocos2d::CCAcceleration* pAccelerationValue);
- public:
- b2World *m_world;
- cocos2d::CCSprite *m_ball;
- };
- #endif // __HELLOWORLD_SCENE_H__
HelloWorldScene.cpp代码如下:
- #include "HelloWorldScene.h"
- using namespace cocos2d;
- #define PTM_RATIO 32
- HelloWorld::HelloWorld()
- {
- m_world = NULL;
- m_ball = NULL;
- }
- HelloWorld::~HelloWorld()
- {
- delete m_world;
- m_ball = NULL;
- }
- CCScene* HelloWorld::scene()
- {
- CCScene * scene = NULL;
- do
- {
- // 'scene' is an autorelease object
- scene = CCScene::create();
- CC_BREAK_IF(! scene);
- // 'layer' is an autorelease object
- HelloWorld *layer = HelloWorld::create();
- CC_BREAK_IF(! layer);
- // add layer as a child to scene
- scene->addChild(layer);
- } while (0);
- // return the scene
- return scene;
- }
- // on "init" you need to initialize your instance
- bool HelloWorld::init()
- {
- bool bRet = false;
- do
- {
- CC_BREAK_IF(! CCLayer::init());
- // quit menu
- CCMenuItemImage *pCloseItem = CCMenuItemImage::create(
- "CloseNormal.png",
- "CloseSelected.png",
- this,
- menu_selector(HelloWorld::menuCloseCallback));
- CC_BREAK_IF(! pCloseItem);
- pCloseItem->setPosition(ccp(CCDirector::sharedDirector()->getWinSize().width - 20, 20));
- CCMenu* pMenu = CCMenu::create(pCloseItem, NULL);
- pMenu->setPosition(CCPointZero);
- CC_BREAK_IF(! pMenu);
- this->addChild(pMenu, 1);
- // window size
- CCSize size = CCDirector::sharedDirector()->getWinSize();
- // add a sprite
- m_ball = CCSprite::create("Ball.jpg");
- this->addChild(m_ball);
- m_ball->setPosition(ccp(100, 100));
- b2Vec2 gravity = b2Vec2(0.0f, -30.0f); // 重力系数
- m_world = new b2World(gravity); // 创建重力
- // create edge ground
- b2BodyDef groundBodyDef; // 边缘刚体定义
- b2Body *groundBody = m_world->CreateBody(&groundBodyDef); // 创建边缘刚体
- b2PolygonShape groundBox;
- // bottom
- groundBox.SetAsBox(size.width / PTM_RATIO, 0, b2Vec2(0, 0), 0);
- groundBody->CreateFixture(&groundBox, 0);
- // up
- groundBox.SetAsBox(size.width / PTM_RATIO, 0, b2Vec2(0,size.height/PTM_RATIO), 0);
- groundBody->CreateFixture(&groundBox, 0);
- // left
- groundBox.SetAsBox(0, size.height / PTM_RATIO, b2Vec2(0,0), 0);
- groundBody->CreateFixture(&groundBox, 0);
- // right
- groundBox.SetAsBox(0, size.height / PTM_RATIO, b2Vec2(size.width/PTM_RATIO,0), 0);
- groundBody->CreateFixture(&groundBox, 0);
- // create ball body an shape
- b2BodyDef ballBodyDef;
- ballBodyDef.type = b2_dynamicBody; // 刚体类型:动态
- ballBodyDef.position.Set(100 / PTM_RATIO, 100 / PTM_RATIO); // 设置位置
- ballBodyDef.userData = m_ball; // 绑定数据:精灵
- b2Body *body = m_world->CreateBody(&ballBodyDef); // 创建刚体
- b2CircleShape circle; // 圆形定义
- circle.m_radius = 26.0 / PTM_RATIO; // 半径
- b2FixtureDef ballFixtureDef; // 定制器
- ballFixtureDef.shape = &circle; // 绑定圆形
- ballFixtureDef.density = 1.0f; // 密度
- ballFixtureDef.friction = 0.2f; // 摩擦系数
- ballFixtureDef.restitution = 0.8f; // 恢复:用于弹力的
- body->CreateFixture(&ballFixtureDef);
- this->setAccelerometerEnabled(true); // 在层里启用重力感应
- this->scheduleUpdate();
- bRet = true;
- } while (0);
- return bRet;
- }
- void HelloWorld::menuCloseCallback(CCObject* pSender)
- {
- // "close" menu item clicked
- CCDirector::sharedDirector()->end();
- }
- void HelloWorld::update(float dt)
- {
- int velocityIterations = 8;
- int positionIterations = 1;
- m_world->Step(dt, velocityIterations, positionIterations);
- for (b2Body *b = m_world->GetBodyList(); b; b = b->GetNext())
- {
- if (b->GetUserData() != NULL)
- {
- CCSprite *ballData = (CCSprite*) b->GetUserData();
- ballData->setPosition(ccp(b->GetPosition().x * PTM_RATIO, b->GetPosition().y * PTM_RATIO));
- ballData->setRotation(CC_RADIANS_TO_DEGREES(b->GetAngle()));
- }
- }
- }
- void HelloWorld::didAccelerate(CCAcceleration* pAccelerationValue)
- {
- b2Vec2 gravity(- pAccelerationValue->y * 15, pAccelerationValue->x * 15);
- m_world->SetGravity(gravity);
- }
运行效果如下:
在移植到android真机调试时,发现重力感应方向并不对,
这里我将didAccelerate的实现,重新设置重力修改成如下:
b2Vec2 gravity(pAccelerationValue->x * 15, pAccelerationValue->y * 15);
m_world->SetGravity(gravity);
它就能正确感应了。
box2d弹球 cocos2d-x重力感应(cocos2d-x2.1)相关推荐
- 关于物理引擎的使用,及其重力感应的小test
好久没写博文了,过去那些天比较忙,一直在做点别的东西,不过作为小菜的我也不忘记学习,现在跟大家分享下我的小知识吧! 首先建立个带有box2d物理引擎的项目,在头文件中加入 public:// Here ...
- Cocos2d-x3.2 重力感应
为什么80%的码农都做不了架构师?>>> //GameScene.h#include "cocos2d.h"USING_NS_CC;class GameSc ...
- [寒江孤叶丶的Cocos2d-x之旅_11]Cocos2d-x的重力感应Demo。如何使用重力感应。
在开发一些赛车类,或者躲避类的游戏中,经常会用到重力感应的功能.比如以前玩儿的控制一个金属球走迷宫的游戏. 在最近这个版本的TestCPP中我没有找到关于重力感应的例程,不知道是官方没有添加还是我自己 ...
- 我的雷电游戏(重力感应控制)
算是第一个写的比较满意的游戏吧,肯定还有很多很多不足,希望高手能指点下,呵.现在在看图灵出版的一本android游戏的书籍,有点难,涉及底层有点多,都是JNI.NDK.linux shell脚本等,主 ...
- 【转】重力感应和罗盘
iPad 的玩家大概都用过 StarWalk 这款应用--强力到无以附加的星图软件.StarWalk 里的世界其实就是虚拟了一个环绕用户的天球,当然还能够与真实的天球对应得上,当用户举着 iPad 对 ...
- [Unity 3D] 重力感应与罗盘
原址:http://blog.csdn.net/lijing_hi/article/details/7252954 [Unity 3D] 重力感应与罗盘(一) iPad 的玩家大概都用过 StarWa ...
- [Unity 3D] 重力感应与罗盘(二)
让世界旋转起来: 游戏世界的主摄像机就是我们在游戏里的"眼睛",为了让"眼睛"能够与手持 iPad 的我们保持协调,跟随着我们自己转身而转动,好像我们自己就站在 ...
- Kinect for windows的重力感应和角度马达
上图是Kinect的重力感应方向图,Kinect右边为X正方向,最大值为1,反方向为-1,Kinect下方为Y正方向,最大值为1,反方向为-1,Kinect后面为Z正方向,最大值为1,反方向为-1. ...
- 重力感应的测试程序andriod源代码
2019独角兽企业重金招聘Python工程师标准>>> 重力感应的测试程序andriod源代码,不多说了适合初学者,界面需要改进 转载:http://www.adobex.com/a ...
- Unity3D 游戏引擎之平面小球重力感应详解【转】
http://blog.csdn.net/xys289187120/article/details/6969333 手机重力感应应该对大多数开发者并不陌生,在新一代智能手机Android ...
最新文章
- 机电传动控制第二周学习笔记
- Android 网易云信获取图片,Android 网易云信集成(一)
- 使用Fork/Join框架优化归并排序
- spring 注解上传文件 @RequestParam,FormData上传文件
- fdopen()和fileno()函数
- QT 动态创建对象(第一种方法)
- 针对提高48V 配电性能的诸多思考!
- flask json传输失败_GO小知识之实例演示 json 如何转化为 map 和 struct
- spring boot配置ip_Zookeeper作为配置中心使用说明
- java机房收费管理系统课程设计_(c语言)机房收费管理系统课程设计
- 电子电路基础——知识点(上篇)
- 设计师配色宝典!教你从零开始学配色(一)
- 一个农村博士的独白:全家为什么只有我读到了博士
- 如何培养自己的商业思维能力?
- window.scrollTo滚动
- 【腾讯Bugly干货分享】Android 进程保活招式大全
- python水浒传名字次数_梁山上,小李广的“小”是什么意思?“病关索”是生病的关索?...
- python 鼠标连点脚本
- How to Have a Healthy Relationship --shanbei 为单身节写
- 机器学习之集成学习(实验记录)