Box2D 物理引擎---创建一个简单的模拟物理世界
来源:互联网 发布:macbook卸载windows 编辑:程序博客网 时间:2024/04/29 20:28
效果展示:
首先:我们进行名词解释:
b2BodyDef 确定位置 包括旋转角度 以及userData
b2BodyDef bodyDef;
bodyDef.type =b2_dynamicBody; //设置动态类型
bodyDef.position =b2Vec2(3,6);//设置位置,单位为米
b2Body *body =world->CreateBody(&bodyDef);
body->SetUserData(ss);
b2PolygonShape和b2CircleShape 作为隐形的形状 包括宽高
b2PolygonShape shape;
shape.SetAsBox(0.5,0.5);//单位是m
b2FixtureDef 是材料,用来设定密度质量恢复力等
b2FixtureDef fixtureDef;
fixtureDef.density =1;//设置密度
fixtureDef.friction =0.3;//设置摩擦力
fixtureDef.shape = &shape;//设置形状
body->CreateFixture(&fixtureDef);
最后由world->CreateBody(&bodyDef);在世界里创建 b2Body
最后通过 body->CreateFixture(&fixtureDef); 将以及定形的材料加进body中
b2PolygonShape是隐形的形状 通过FixtureDef将其形状做出来(它只是一部分),还要组装b2doy ,
1。初始化物理世界:
void HelloWorld::initWorld(){ world = new b2World(b2Vec2(0, -8));//初始化重力环境}
2.添加精灵,然后把精灵和世界进行绑定:
void HelloWorld::initSprite(){ //先创建一个精灵: auto ss = Sprite::create("CloseNormal.png"); this->addChild(ss); ss->setScale(3, 3); //用来确定物体的位置,类型(动态。静态); b2BodyDef bodyDef; bodyDef.type = b2_dynamicBody; bodyDef.position = b2Vec2(5, 6); b2Body *body = world->CreateBody(&bodyDef); //指定精灵的形状,这个步骤不能省略, b2PolygonShape shape; shape.SetAsBox(ss->getContentSize().width/RATIO, ss->getContentSize().height/RATIO);//单位是m //材料,用来设置物体的属性(质量,密度,摩擦力,形状,) b2FixtureDef fixtureDef; fixtureDef.density =1; fixtureDef.friction = 0.3; fixtureDef.shape = &shape; //如果形状为0的话,这个属性是必须的。 body->CreateFixture(&fixtureDef); body->SetUserData(ss);//物体和世界关联代码:}
3,对世界中的物体进行实时更新:
void HelloWorld::myupdata(float dt){ world->Step(dt, 8, 3); Sprite * bird; //对于动态的物体,我们要实时的更新它的位置和状态。静态的就不用判断了。 for (b2Body *body = world->GetBodyList(); body; body = body->GetNext()) { if (body->GetType() == b2_dynamicBody) { bird = (Sprite*)body->GetUserData(); bird->setPosition(Vec2(body->GetPosition().x*RATIO, body->GetPosition().y*RATIO));//设置动态物体的位置 } }}
4.上面步骤只是创建了一个可以按照自由落体运动的物体,我们还需要给世界一个边界
void HelloWorld::initGround(){ //地板的位置和类型,(静态) b2BodyDef bodyDef; bodyDef.type = b2_staticBody; bodyDef.position = b2Vec2(0, 0.1); b2Body *body = world->CreateBody(&bodyDef); //指定形状,这一步骤必须有 b2PolygonShape groundShape; groundShape.SetAsBox(960/RATIO, 0.5); b2FixtureDef fixture; fixture.density = 1;//密度 fixture.friction = 0.3;//摩擦力 fixture.restitution = 0.8; fixture.shape = &groundShape; body->CreateFixture(&fixture); //设置地板,这里用的是精灵,图片可以自己设定,也可以用UI 进行绘图: Sprite *sp = Sprite::create("HelloWorld.png"); sp->setAnchorPoint(Vec2(0, 0)); sp->setPosition(Vec2(0, 0)); sp->setScale(3, 0.1); this->addChild(sp); body->SetUserData(sp);}
这样。我们的一个简单的Box模拟物理世界就创建成功了。。。
- Box2D 物理引擎---创建一个简单的模拟物理世界
- 物理引擎Box2D之世界
- 物理引擎box2d的学习心得
- Box2D物理引擎模拟炸弹爆炸效果
- Box2D物理引擎模拟炸弹爆炸效果
- 简单的物理世界
- box2d物理引擎学习
- Box2D物理引擎介绍
- Box2d,物理引擎
- box2D 物理引擎例子
- Box2d 物理引擎
- 物理引擎Box2D 入门
- Box2d,物理引擎
- Box2D物理引擎
- cocos Box2D物理引擎
- Box2D物理引擎入门
- /LGC物理引擎/javascript 版的 Box2D
- 物理引擎Box2D-- 愤怒的小鸟
- Hadoop中的Hive与Hbase的理解
- hadoop-2.7.1:Error: Cannot find configuration directory: /etc/hadoop
- 数字图像处理1--图像增强技术
- 多态,继承 联系与区别
- OC学习_第四天 NSString、NSArray、NSNumber、使用苹果帮助文档、值对象
- Box2D 物理引擎---创建一个简单的模拟物理世界
- OpenJudge1538 Gopher II
- Codevs 1048 石子归并
- JSP中request属性的用法
- Java学习笔记之内部类和匿名类
- iOS 开发之FMDB的使用指南
- Collection 和 Collections 的区别(Array和Arrays区别)
- 连通域提取MSER
- iOS UIAppearance使用详解