读书人

haxe的nem与box2d入门例证

发布时间: 2012-09-02 21:00:34 作者: rapoo

haxe的nem与box2d入门例子
nme下载地址:http://www.haxenme.org/。
安装过程很简单,安装完成后,再安装box2d库,在cmd中输入:haxelib install box2d。
如果你还怎么熟悉haxe,我有一个电子版的教程Professional_haXe_and_Neko,下载地址:http://163.fm/Z5npQv2,提取码:uxoOvw7w。

开IDE推荐使用flashdevelop,这个IDE可以集成nme项目,调试很方便。下载地址:http://www.flashdevelop.org/。
安装好后点击“Tools”->“Program Settings”->“HaXeContext”,将右侧的“Generate”设置为“True”,可以自动导入类包。

haxe的语法与flash的as3很类似,目前好象还没有nme版的box2d手册,所有只有借鉴flash版的box2d手册,手册地址:http://www.box2dflash.org/。
haxe的nem与box2d入门例证
新建一个Haxe的NME Project,项目名称为“SimpleApp”,打开src目录中的Main.hx,如果你按F5运行调试,你会发现一个错误,因为“package”至少要3个参数,打开文件application.nmml,在第6行修改为package="com.sinaapp.gentwolf.SimpleApp"即可。在第18行加入,如果不加这行,会提示找不到box2d的类库。

打开Main.hx,
添加两个私有变量:
//定义一个世界
private var world : B2World;
//在box2d中,是以米为单位而不是像素,1米为30个像素
private var meterToPixel : Float = 1 / 30;


我们的代码文件放在init方法中:
//初始化一个世界,重力向量为9.8,
world = new B2World(new B2Vec2(0, 9.8), true);

//创建一个地面
createBox(313, 350, 600, 10, true);

//创建一个自由落体的小球
createBall(250, 40, 20, false);

//将世界中的物体绘画出来
drawDebug();
//更新世界中物体的位置
addEventListener(Event.ENTER_FRAME, update);


添加的方法
private function createBall(x : Float, y : Float, radius : Float, isStatic : Bool) : Void {
//定义一个物体
var wheelBodyDef : B2BodyDef = new B2BodyDef();
//将物体设置为动态物体
if (!isStatic) wheelBodyDef.type = B2Body.b2_dynamicBody;
//设置物体的位置,将像素转换为米
wheelBodyDef.position.set(x * meterToPixel, y * meterToPixel);
//将上面定义的物体传入世界来创建一个物体
var wheelBody : B2Body = world.createBody(wheelBodyDef);
//定义一个形状
var circleShape : B2CircleShape = new B2CircleShape(radius * meterToPixel);
//定义附着物
var wheelFixtureDef : B2FixtureDef = new B2FixtureDef();
wheelFixtureDef.shape = circleShape;
//物体的密度
wheelFixtureDef.density = 1.0;
//摩擦系数
wheelFixtureDef.friction = 0.1;
//反弹系数
wheelFixtureDef.restitution = 0.8;
//将附着物添加到物体上
wheelBody.createFixture(wheelFixtureDef);
}

private function createBox(x : Float, y : Float, w : Float, h : Float, isStatic : Bool) : Void {
var bodyDef : B2BodyDef = new B2BodyDef();
bodyDef.position.set(x * meterToPixel, y * meterToPixel);
if (!isStatic) bodyDef.type = B2Body.b2_dynamicBody;
var body = world.createBody(bodyDef);

var shape : B2PolygonShape = new B2PolygonShape();
//box2d中以物体的中心为原点,而不是左上角
shape.setAsBox(w / 2 * meterToPixel, h / 2 * meterToPixel);

var fixtureDef : B2FixtureDef = new B2FixtureDef();
fixtureDef.shape = shape;

body.createFixture(fixtureDef);
}

private function drawDebug() : Void {
var sprite : Sprite = new Sprite();
addChild(sprite);

//因为没有给物体贴皮肤,所以是看不见的,在调试阶段时使用B2DebugDraw,正式发布时不要使用,
var draw : B2DebugDraw = new B2DebugDraw();
draw.setSprite(sprite);
draw.setLineThickness(1.0);
draw.setFlags(B2DebugDraw.e_shapeBit);
draw.setDrawScale(1 / meterToPixel);

world.setDebugDraw(draw);
}

private function update(event : Event) : Void {
world.step(1 / 30, 10, 10);
world.clearForces();
world.drawDebugData();
}
保存后按F5调试,如果没有错误会打开生成的flash文件,你会看到一个自由落体的小球。

haxe的资料在国内很不好找,nme版的box2d资料则理少。

最后给出这个例子的下载地址:
共享链接:http://163.fm/5SXkSwu

提取码:5NPEhNlx

如果不能下载,请与博主联系。


原文地址:http://gentwolf.sinaapp.com/index/detail/163.html


读书人网 >编程

热点推荐