几个常用的概念
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
在"PhysicsEditor-Cocos2d-x-Box2d-master"这个项目中,包含了整合Cocos2d-x与Box2D的示例代码和资源,可以帮助开发者快速理解和实践两者之间的交互。项目中可能包括了如下的文件结构: 1. 示例场景文件(.cpp和.h...
Box2D是一个非常知名的开源2D物理引擎,它在JavaScript版本中被称为Box2D--1.0.js。这个引擎主要用于创建具有真实世界物理特性的2D游戏和模拟。它的强大功能使得开发者能够轻松地实现物体碰撞检测、重力、摩擦力、...
在cocos2d-x中,你需要创建一个Box2D的世界实例,这是所有物理模拟的基础。通过设置重力向量和其他参数,你可以控制游戏环境的物理特性。 5. **定义物理对象** 使用Box2D,你可以创建各种形状的物理对象,如矩形...
Box2D_Py是Python中的一个物理引擎库,它是一个基于Box2D C++库的Python绑定,用于在游戏开发、模拟和可视化中创建2D物理效果。Box2D库本身由Erin Catto开发,它广泛应用于各种2D游戏和教育软件中,因为它能够高效地...
6. **固定时间步长(Fixed Time Steps)**:为了确保物理模拟的一致性,Box2D-Lite推荐使用固定时间步长来更新World。这有助于避免因帧率变化导致的不稳定性。 7. **传感器(Sensors)**:传感器形状允许物体进行非...
《cocos2d-x与Box2D物理引擎的适配:深入理解“generic-box2d-plist”》 在游戏开发领域,cocos2d-x是一个广泛应用的2D游戏引擎,而Box2D则是一个强大的物理模拟库。两者结合,为开发者提供了构建具有真实物理效果...
box2d-wasm Box2D编译为WebAssembly。 展示柜 展示自定义重力 使用释放 高性能主回路 WebGL渲染 用法 安装 npm i box2d-wasm 然后查看。 替代发行 有关其他功能: 流体模拟 粒子模拟 软体碰撞 您可以从分支进行...
Box2D是一个开源的2D物理引擎,广泛用于游戏开发,尤其在Cocos2d这样的2D游戏引擎中。Cocos2d是一个流行的跨平台的游戏开发框架,它提供了丰富的功能和工具,使得开发者能够轻松创建各种2D游戏。在本案例中,我们...
总结来说,Cocos2d-x 3.2版本中的Box2d物理引擎为游戏开发者提供了强大的物理模拟能力,Motor Joint是其中一种实现特定物理效果的工具。通过理解和运用Motor Joint,开发者可以创造出更为丰富多样的游戏场景,提升...
《Box2dDemo》是基于Cocos2d-js...总之,《Box2dDemo》是一个很好的学习Box2d和Cocos2d-js结合的起点,通过这个示例,开发者可以深入理解如何在JavaScript游戏中实现物理模拟,为创建更多具有真实感的2D游戏打下基础。
在这个"弹球"项目中,开发者利用了Cocos2d-x的图形功能和Box2D的物理模拟能力,创建了一个类似"打砖块"(Breakout)的游戏。"Breakout"是一款经典的街机游戏,玩家通过控制一个挡板反弹球来击碎屏幕上方的砖块。 **...
总之,YannickL-Box2D-Examples-63f9424是iOS开发者学习和实践2D物理模拟的宝贵资源。通过这个项目,不仅可以学习Box2D引擎的使用,还能提升对iOS应用开发的理解,为开发更丰富的互动体验打下坚实基础。
Box2D是一款广泛应用于2D游戏开发的开源物理引擎,它提供了强大的物理模拟功能,包括刚体动力学、碰撞检测等。在Cocos2d-x框架中,Box2D被用来实现游戏中的物理行为,让游戏物体的运动更加真实。 首先,我们需要...
Box2D 是一种开放源代码的物理引擎,用于模拟2D刚体和碰撞检测。下面是根据 Box2D 2.3.0 用户手册-中文版生成的知识点总结: Chapter 1 导言 1.1 关于 Box2D * Box2D 是一种物理引擎,用于模拟2D刚体和碰撞检测...
通过研究这些笔记,开发者可以更好地理解和掌握在Cocos2d-x 3.2中使用Box2d进行物理模拟的方法。 总的来说,这个笔记提供了一个学习如何在Cocos2d-x游戏中利用Box2D实现自由落体效果的实例。通过实践这些技巧,...
Box2D是一个开源的2D物理引擎,广泛用于游戏开发,模拟和教育领域。它提供了现实世界的物理行为,如重力、碰撞检测、摩擦力和弹力,使得开发者能够创建出更加逼真的游戏环境和交互体验。以下是关于Box2D物理引擎的...
### Box2D-as3版中文教程相关知识点 #### 1. 导言 **1.1 关于** Box2D是一款强大的2D物理仿真库,主要用于游戏开发领域,旨在为游戏提供更为真实的物理效果和更加丰富的互动体验。通过Box2D,游戏开发者可以让...
YannickL-Box2D-Examples-63f9424.zip这个压缩包,包含的是iOS游戏应用的源代码,主要展示了如何使用Box2D进行游戏物理模拟。下面我们将深入探讨这些知识点。 1. **Box2D引擎**:Box2D是由Ernesto San Pablo和Erwin...