as3 Box2d "Hello box2d"

目前版本2.1a ,flash box2d 目前资料相对还是比较少官方也只放了几个简单的小例子

但是他的强大还是有目共睹的,搞了一段时间flixel 和ape 又转回来学box2d

想做长期开发游戏的 还是建议学box2d比较好点,今天就可以学习,国际惯例HelloBox2d


流程很简单:

1,创建一个世界

2,创建刚体(刚体的定义b2bodyDef,添加装饰b2fixTure)

3,创建用于调试的b2DebugDraw

3,启动世界

需要注意的地方:

box2d以米为单位,约定俗成的(meter = 30pixel)

刚体注册点默认是在中心点上

shape中传入的长宽都是一半,比如要画个100*100的矩形,只要传入50,50即可

package  
{
import adobe.utils.CustomActions;
import Box2D.Collision.Shapes.b2CircleShape;
import Box2D.Collision.Shapes.b2PolygonShape;
import Box2D.Collision.Shapes.b2Shape;
import Box2D.Common.Math.b2Vec2;
import Box2D.Dynamics.b2Body;
import Box2D.Dynamics.b2BodyDef;
import Box2D.Dynamics.b2DebugDraw;
import Box2D.Dynamics.b2Fixture;
import Box2D.Dynamics.b2FixtureDef;
import Box2D.Dynamics.b2World;
import flash.display.GradientType;
import flash.display.Sprite;
import flash.events.Event;
import flash.geom.Matrix;
/**
* ...
* @author My_style
*/
[SWF(width="500",height="300",frameRate="30")]
public class HellowBox2d extends Sprite
{
var world:b2World;
//像素单位转化为物理世界单位米
private const PIXEL_TO_METER:int = 30;
public function HellowBox2d ()
{
drawBackground();
creatWorld();
creatWall();
creatBall();
CraetdebugDraw();
addEventListener(Event.ENTER_FRAME, handler);
}

//创建世界
private function creatWorld()
{
var gravity:b2Vec2 = new b2Vec2(0, 10);//x,0,y-10, 世界里的所有单位都受此引力影响》?
var doSpleep:Boolean = true;//物体停止移动的时候是否进去休眠 减少运算量
world = new b2World(gravity, doSpleep);
world.SetWarmStarting(true);//刚体初始化的时候是否受重力影响
}

//创建墙
private function creatWall()
{

var leftWall:b2Body;
var leftWallDef:b2BodyDef = new b2BodyDef();
leftWallDef.type = b2Body.b2_staticBody;
//注册点是在中心点
leftWallDef.position.Set(10 / PIXEL_TO_METER, stage.stageHeight / 2 / PIXEL_TO_METER);
//工厂模式创建出刚体
leftWall = world.CreateBody(leftWallDef);
//添加刚体装饰物
var leftWallFixtureDef:b2FixtureDef = new b2FixtureDef();
//密度
leftWallFixtureDef.density = 1.0;
leftWallFixtureDef.friction = .3;
leftWallFixtureDef.restitution = 1.0;//弹力,反弹力
//创建shape对象
var leftWallShape:b2PolygonShape = new b2PolygonShape();
leftWallShape.SetAsBox(10 / PIXEL_TO_METER, stage.stageHeight / 2 / PIXEL_TO_METER);//参数 宽度和高度的一半
leftWallFixtureDef.shape = leftWallShape;
leftWall.CreateFixture(leftWallFixtureDef);

//right
leftWallDef.position.Set((stage.width - 10) / PIXEL_TO_METER, stage.stageHeight / 2 / PIXEL_TO_METER);
var rightWall:b2Body = world.CreateBody(leftWallDef);
rightWall.CreateFixture(leftWallFixtureDef);

//bottom
leftWallDef.position.Set(stage.width/2/ PIXEL_TO_METER, (stage.stageHeight-10) / PIXEL_TO_METER);
var bottomWall:b2Body = world.CreateBody(leftWallDef);
leftWallShape.SetAsBox(stage.stageWidth/2 / PIXEL_TO_METER, 10 / PIXEL_TO_METER);
bottomWall.CreateFixture(leftWallFixtureDef);

//top
leftWallDef.position.Set(stage.width/2/ PIXEL_TO_METER, 10 / PIXEL_TO_METER);
var topwall:b2Body = world.CreateBody(leftWallDef);
topwall.CreateFixture(leftWallFixtureDef);


}

private function creatBall()
{
for (var i = 0; i < 10; i++ ) {
var ball:b2Body;
var ballDef:b2BodyDef = new b2BodyDef();
ballDef.type = b2Body.b2_dynamicBody;
ballDef.position.Set(stage.stageWidth/2/PIXEL_TO_METER,20/PIXEL_TO_METER);
ball = world.CreateBody(ballDef);
var ballfixTureDef:b2FixtureDef = new b2FixtureDef();
ballfixTureDef.density = 1;
ballfixTureDef.friction = .3;
ballfixTureDef.restitution = 1.0;
var ballShape:b2CircleShape = new b2CircleShape();
ballShape.SetRadius((Math.random()*20+10)/PIXEL_TO_METER);
ballfixTureDef.shape = ballShape;
ball.CreateFixture(ballfixTureDef);
}
}

//进行测试 因为上面都是抽象设定的概念 并不能显示
private function CraetdebugDraw()
{
var sprite:Sprite = new Sprite();//测试的几何物体可以放里面进行测试
addChild(sprite);
var debugDraw:b2DebugDraw = new b2DebugDraw();
debugDraw.SetSprite(sprite);
debugDraw.SetLineThickness(1.0);//边框厚度
debugDraw.SetAlpha(1);//边框透明度
debugDraw.SetFillAlpha(.5);
debugDraw.SetFlags(b2DebugDraw.e_shapeBit | b2DebugDraw.e_jointBit);//需要显示的格式 shape /关节
debugDraw.SetDrawScale(PIXEL_TO_METER);//测试的尺寸单位
world.SetDebugDraw(debugDraw);
}

//handler
private function handler(e:Event)
{
var timeStep:Number = 1 / 30;//经过多长时间进行碰撞检测
var interation:uint = 10; //物理碰撞是无止境的 告诉box2d多少次就可以停止了
world.Step(timeStep, interation, interation);
world.ClearForces();//清除力 已提高效率
world.DrawDebugData();
}
private function drawBackground():void
{
var bg:Sprite = new Sprite();
var matrix:Matrix = new Matrix();
matrix.translate(100,100);
bg.graphics.beginGradientFill(GradientType.RADIAL,[0xffffff,0xffaa00],[0.3,0.2],[0,255],matrix);
bg.graphics.drawRect(0,0,stage.stageWidth,stage.stage.stageHeight);
bg.graphics.endFill();
addChild(bg);
}
}

}



转载于:https://www.cnblogs.com/randy-1989/archive/2012/03/05/2379809.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值