Box2D例子——Hello 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


转载:http://blog.csdn.net/dyllove98/article/details/8811130

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值