几个常用的概念
rigid body
shape
constraint
contact constraint
joint
joint limit
joint motor
world
Hello Box2D
Creating a World
var worldAABB:b2AABB = new b2AABB();
worldAABB.lowerBound.Set(-100.0, -100.0);
worldAABB.upperBound.Set(100.0, 100.0);
Caution
The world AABB should always be bigger then the region where your bodies are located. It is better to make the world AABB too big than too small. If a body reaches the boundary of the world AABB it will be frozen and will stop simulating.
and b2 allow object to sleep.
var gravity:b2Vec2 = new b2Vec2 (0.0, -10.0);
var doSleep:Boolean = true;
now we create world object.
var world:b2World = new b2World(worldAABB, gravity, doSleep);
we can following the steps as
Creating a World--Creating a Ground Box--Creating a Dynamic Body--
Simulating the World (of Box2D). the following is source code and the attacted is flash.
package{
import flash.display.Sprite;
import flash.events.Event;
// Classes used in this example
import Box2D.Dynamics.*;
import Box2D.Collision.*;
import Box2D.Collision.Shapes.*;
import Box2D.Common.Math.*;
[SWF(width="640", height="360", backgroundColor="#000000", frameRate="30")]
public class HelloWorld extends Sprite{
[Embed(source='assets/PhysBox.swf')]
public var PhysBox:Class;
//public var FGmc:MovieClip = new FG as MovieClip;
[Embed(source='assets/PhysCircle.swf')]
public var PhysCircle:Class;
[Embed(source='assets/PhysGround.swf')]
public var PhysGround:Class;
public function HelloWorld(){
// Add event for main loop
addEventListener(Event.ENTER_FRAME, Update, false, 0, true);
// Creat world AABB
var worldAABB:b2AABB = new b2AABB();
worldAABB.lowerBound.Set(-100.0, -100.0);
worldAABB.upperBound.Set(100.0, 100.0);
// Define the gravity vector
var gravity:b2Vec2 = new b2Vec2(0.0, 10.0);
// Allow bodies to sleep
var doSleep:Boolean = true;
// Construct a world object
m_world = new b2World(worldAABB, gravity, doSleep);
// set debug draw
/*var dbgDraw:b2DebugDraw = new b2DebugDraw();
var dbgSprite:Sprite = new Sprite();
addChild(dbgSprite);
dbgDraw.m_sprite = dbgSprite;
dbgDraw.m_drawScale = 30.0;
dbgDraw.m_fillAlpha = 0.0;
dbgDraw.m_lineThickness = 1.0;
dbgDraw.m_drawFlags = 0xFFFFFFFF;
m_world.SetDebugDraw(dbgDraw);*/
// Vars used to create bodies
var body:b2Body;
var bodyDef:b2BodyDef;
var boxDef:b2PolygonDef;
var circleDef:b2CircleDef;
// Add ground body
bodyDef = new b2BodyDef();
//bodyDef.position.Set(15, 19);
bodyDef.position.Set(10, 12);
//bodyDef.angle = 0.1;
boxDef = new b2PolygonDef();
boxDef.SetAsBox(30, 3);
boxDef.friction = 0.3;
boxDef.density = 0; // static bodies require zero density
/*circleDef = new b2CircleDef();
circleDef.radius = 10;
circleDef.restitution = 0.2*/
// Add sprite to body userData
bodyDef.userData = new PhysGround();
//bodyDef.userData = new PhysCircle();
bodyDef.userData.width = 30 * 2 * 30;
bodyDef.userData.height = 30 * 2 * 3;
addChild(bodyDef.userData);
body = m_world.CreateBody(bodyDef);
body.CreateShape(boxDef);
//body.CreateShape(circleDef);
body.SetMassFromShapes();
// Add some objects
for (var i:int = 1; i < 10; i++){
bodyDef = new b2BodyDef();
bodyDef.position.x = Math.random() * 15 + 5;
bodyDef.position.y = Math.random() * 10;
var rX:Number = Math.random() + 0.5;
var rY:Number = Math.random() + 0.5;
// Box
if (Math.random() < 0.5){
boxDef = new b2PolygonDef();
boxDef.SetAsBox(rX, rY);
boxDef.density = 1.0;
boxDef.friction = 0.5;
boxDef.restitution = 0.2;
bodyDef.userData = new PhysBox();
bodyDef.userData.width = rX * 2 * 30;
bodyDef.userData.height = rY * 2 * 30;
body = m_world.CreateBody(bodyDef);
body.CreateShape(boxDef);
}
// Circle
else {
circleDef = new b2CircleDef();
circleDef.radius = rX;
circleDef.density = 1.0;
circleDef.friction = 0.5;
circleDef.restitution = 0.2
bodyDef.userData = new PhysCircle();
bodyDef.userData.width = rX * 2 * 30;
bodyDef.userData.height = rX * 2 * 30;
body = m_world.CreateBody(bodyDef);
body.CreateShape(circleDef);
}
body.SetMassFromShapes();
addChild(bodyDef.userData);
}
}
public function Update(e:Event):void{
m_world.Step(m_timeStep, m_iterations);
// Go through body list and update sprite positions/rotations
for (var bb:b2Body = m_world.m_bodyList; bb; bb = bb.m_next){
if (bb.m_userData is Sprite){
bb.m_userData.x = bb.GetPosition().x * 30;
bb.m_userData.y = bb.GetPosition().y * 30;
bb.m_userData.rotation = bb.GetAngle() * (180/Math.PI);
}
}
}
public var m_world:b2World;
public var m_iterations:int = 10;
public var m_timeStep:Number = 1.0/30.0;
}
}
分享到:
相关推荐
NULL 博文链接:https://ottoliu.iteye.com/blog/1159979
box2d-wasm Box2D编译为WebAssembly。 展示柜 展示自定义重力 使用释放 高性能主回路 WebGL渲染 用法 安装 npm i box2d-wasm 然后查看。 替代发行 有关其他功能: 流体模拟 粒子模拟 软体碰撞 您可以从分支进行...
高清带目录《Box2D物理游戏... 《Box2D物理游戏编程初学者指南》最后,通过大量的游戏效果模拟,直截了当地介绍相关知识点的实际应用,这些游戏包括《愤怒的小鸟》《叫醒盒子》《跨越重力》《星星大盗》《割绳子》等
这是Box2D(https://github.com/erincatto/Box2D)的端口,Box2D是Erin Catto用C ++编写的用于游戏的2D物理引擎。 该端口是完整的,并且基于截至201 Box2D.go的最新Box2D提交。这是什么? 这是Box2D...
多伦多大学自动驾驶专业的项目模板(提供...它是流行的 Box2D 物理引擎的一个版本,经过修改以支持模拟汽车在赛道上行驶的物理过程。模块化组件 (Modular Pipeline) 分为 低层次感知与场景解析、路径训练 和车辆控制。
这里只是我们对Box2d的一个简单介绍,让大家明白其用处,关于更多详细信息,大家可以参考其官方网站http://www.box2d.org/,图12-1则是cocs2d中演示的Box2d物理引擎效果,学完这部分内容,你也可以很轻松将其运行在...
第1章 Cocos2D-X引擎的介绍 1 1.1 何为游戏引擎 1 1.1.1 游戏的核心—引擎 1 1.1.2 引擎的特点 2 1.1.3 知名的引擎介绍 4 1.1.4 引擎的分类 5 1.2 Cocos2D-X引擎的来历 8 1.3 引擎的版本 9 1.4 下载与安装 10 1.5 ...
简单的box2D 环境搭配 世界 -全局-(模拟物理系统) 世界坐标系-上限 下限(同上) 重力加速度 g 是否沉溺 boolean 初始化 世界坐标系(模型物理) 刚体-物理引擎 刚体定义-userData- movieclip的处理 用世界去创建- ...
模拟真实的世界是个比较麻烦的事情 通常这种事情都是交给物理引擎来做 但它们使用的过程中有个令人讨厌的地方 参数太多了 为了初始化一个简单的场景要写很多代码 在cocos2d x 3 0版本中 出现了一个新类族 physicals ...
BOX2D 物理2D引擎。 模拟2D世界物理环境。 WinDows版本
Box2D集成了大量的物理力学和运动学的计算,并将物理模拟过程封装到类对象中,将对物体的操作,以简单友好的接口提供给开发者。我们只需要调用引擎中相应的对象或函数,就可以模拟现实生活中的加速、减速、抛物线...
Box2D是一个用于模拟2D刚体物体的C++引擎。作者为Erin Catto。Box2D使用zlib许可。zlib许可是一个自由软件授权协议,但并非copyleft。 它已被用于蜡笔物理学、愤怒的小鸟、Rolando、Fantastic Contraption、...
让你轻松学会box2d中的使用,以及指导物理模拟中使用手机传感器的应用,比如本文的加速度计的使用
Box2Dweb物理游戏编程基础,试读版。用浅显易懂的语言讲述物理世界的模拟。
Android Box2d 例子,物理模拟效果很好,唯一的缺点是运行速度有些慢。
IOS 开发源码:cocos2dx+box2d的库和演示实例.包含cocos2d-x的库和box2d的库,实现模拟物理碰撞、弹跳的源码