你好,游客 登录 注册 搜索
背景:
阅读新闻

Android 游戏引擎libgdx之Box2D Hello Box2D -

[日期:2013-04-16] 来源:  作者: [字体: ]

Box2D官网 ----> 传送门 http://box2d.org/

Box2D v2.1.0用户手册翻译 ----> 传送门 http://blog.csdn.net/complex_ok/article/category/871440

Libgdx使用jni封装了box2d的c++版本,使得其运行效率比其他同级的物理引擎如jbox2d快不少。

今后我们讨论都是在Libgdx中的Box2D。

 

一、基础类

Body

A rigid body. These are created via World.CreateBody.

这是一个很坚硬的物体,不要妄想去改变它的形状,我们只能通过World.CreateBody方法来创建它。

BodyDef 

A body definition holds all the data needed to construct a rigid body. You can safely re-use body definitions. Shapes are added to a body after construction.

定义Body所需要的所有数据都由它负责,我们可以重复使用。Shape与Body的绑定必须在它之后完成。

Box2DDebugRenderer

用于测试Box2D的图形显示,会把图形的形状通过不同颜色绘制出来。

ChainShape、CircleShape 、EdgeShape 、PolygonShape  

他们都继承于Shap,是最基本的图形

Fixture

将形状绑定到物体之上, 并有一定的材质属性, 比如密度(density)等。必须由Body.createFixture生成。

FixtureDef 

Fixture的属性申明,可重复使用。

World 

The world class manages all physics entities, dynamic simulation, and asynchronous queries. The world also contains efficient memory management facilities.

管理所有物理实体,动态模拟,异步查询。还包含高效的内存管理机制。

 

二、Hello Box2D

我们用到一个Game一个Stage,下面是一个简单的初始化例子。

public class Box2DTestActivity extends AndroidApplication {

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        initialize(new DemoGame(), true);
    }

    public class DemoGame extends Game {

        HelloBox2D demo1;

        @Override
        public void create() {
            demo1 = new HelloBox2D();
        }

        @Override
        public void render() {
            demo1.draw();
        }

        @Override
        public void dispose() {
            demo1.dispose();
            super.dispose();
        }
    }
}

我们主要看Stage是怎么实现的,我们先来定义测试绘制器和一个物理世界

    private Box2DDebugRenderer renderer; // 测试用绘制器
    private World world;

初始化Stage,为什么是48和80?Box2D的世界中单位都是米,一米大概控制在30像素左右,过大的世界会影响其模拟的准确度。

    public HelloBox2D() {
        super(48f, 80f, true);
                ......
        }    

继续初始化变量,设置world参数,9.8是重力加速度,true代表不去模拟已经停止失效的物体。

        renderer = new Box2DDebugRenderer();
        world = new World(new Vector2(0, -9.8f), true);

再来设计一个会下落的图形——圆,我们把它设为动态物体(动态物体与静态物体在最后显示时颜色是不同的)。

        CircleShape circleShape = new CircleShape();// 创建一个圆
        circleShape.setRadius(3f); // 设置半径
        addShape(circleShape, new Vector2(16, 70), BodyType.DynamicBody);

再来设计一个图形——线,设为静态物体。因为我们确定了2点,所以再去设置它的位置就无效了。

        EdgeShape edgeShape = new EdgeShape();// 创建一个边
        edgeShape.set(new Vector2(5, 35), new Vector2(30, 20));// 设置2点
        addShape(edgeShape, new Vector2(1, 0), BodyType.StaticBody);

加入到物理世界的方法,body,shape,fixture是相辅相成的。

    public void addShape(Shape shap, Vector2 pos, BodyType type) {
        BodyDef bd = new BodyDef();
        bd.position.set(pos.x, pos.y);
        bd.type = type;
        Body b = world.createBody(bd);
        b.createFixture(shap, 1f);
    }

最后我们需要绘制图像,不断去刷新world,6和2分别为速度、位置模拟的迭代计数。

将世界与相机传入到绘制器中即可。

    @Override
    public void draw() {
        Gdx.gl.glClear(GL10.GL_COLOR_BUFFER_BIT);
        world.step(Gdx.app.getGraphics().getDeltaTime(), 6, 2);
        renderer.render(world, camera.combined);
        super.draw();
    }

 

三、程序截图

四、源代码下载

https://github.com/dwintercode/Box2D.git






收藏 推荐 打印 | 录入:admin | 阅读:
相关新闻