zoukankan      html  css  js  c++  java
  • 使用libgdx及其中的box2d 2.1的注意事项

    关于libgdx和box2d的图形

    在libgdx的stage或者spriteBatch里画图.图的对称点是左下角.

    在libgdx的TextureRegion从Texture里取需要的区域时,图的对称点是左上角.

    在box2d里body,图的对称点是中心(可能符合物理的重心吧).

    还有在libgdx里面.导入的Texture图片.一定要是2的幂数.即2,4,8....1024.

    如果想导入不是2的幂数的图片.只能把它放在一个符合2的幂数的Texture里面.再使用TextureRegion从该Texture里提取所需要的区域.

    创造一个世界:

    Vector2 gravity = new Vector2(0.0f, -1f);//设置世界的引力,如果游戏是顶级图的,则都设为0则可.
    boolean doSleep = true;//是否允许刚体睡眠.最好true
    World world = new World(gravity, doSleep);//创建世界

    刚体共有三种类型,分别是staticBody,dynamicBody以及kinematicBody
    其含意分别是指,静态刚体(即不受力影响的物体,比如边界墙),动态刚体(完全模拟真实物理情况的物体),运动刚体(这是2.1版新增的一个类型,和静态刚体相比,就是它可以移动.它也同样不会被环境力所影响)

    创建一个刚体:

    BodyDef bd = new BodyDef();
    bd.type = BodyDef.BodyType.DynamicBody;//指定刚体的类型,默认为静态.
    bd.position.set(x, y);//x和y指出刚体初始的位置.

    Body b = world.createBody(bd);//刚体一定要通过world的createBody来创建,不能new.

    b.setUserData(data);//设定刚体的用户数据.

    PolygonShape p = new PolygonShape();
    p.setAsBox(8.0f, 8.0f);//指定形状为长方形.

    p.set(new Vector2[]{new Vector2(0,1),new Vector2(-1,0),new Vector2(1,0)});指定三角形,也可以指定更多Vector2,为多边形.多边形最多有8个边,并且多边形必须是凸边形.当然,你也可以使用组合来形成更为伪凹边形或者更复杂的形状.但最好请使用逆时针顺序.

    FixtureDef f = new FixtureDef();
    f.shape = p;//夹具的形状
    f.density = 1.0f;//夹具的密度
    f.friction = 0.3f;//夹具的摩擦力
    b.createFixture(f);//刚体创建夹具.

    刚体的createFixture有两种形式:

    createFixture(Shape shape, float density)//传入形状Shape和它的密度.
    createFixture(FixtureDef def)//传入夹具的定义,在传入前,已经定义好它的形状和密度等属性.

    密度是用于计算刚体的质量属性的.就是说密度越大,该刚体越重.

    摩擦力被用于使物体们在彼此间逼真的滑动.如一个刚体的摩擦力越大,撞在墙上反弹得越远.如果摩擦力小,撞在墙上可能会沾着墙一直滑动.

    一个刚体可以创建多个夹具.如为一个世界创建四个边:

    游戏在手机分辨率854*480且打横时运行.

    BodyDef groundBodyDef = new BodyDef();
    groundBodyDef.position.set(0, 0);
    Body groundBody = world.createBody(groundBodyDef);
    groundPolygonShape = new PolygonShape();

    groundPolygonShape.setAsEdge(new Vector2(0, 480), new Vector2(0, 0));//使形状为边,左边.
    groundBody.createFixture(groundPolygonShape, 0);

    groundPolygonShape.setAsEdge(new Vector2(854, 480), new Vector2(854, 0));//右边
    groundBody.createFixture(groundPolygonShape, 0);

    groundPolygonShape.setAsEdge(new Vector2(0, 480), new Vector2(854, 480));//上边
    groundBody.createFixture(groundPolygonShape, 0);

    groundPolygonShape.setAsEdge(new Vector2(0, 0), new Vector2(854, 0));//下边
    groundBody.createFixture(groundPolygonShape, 0);

    开始模拟:

    float timeStep = 1.0f / 60.0f;//刷新时间粒度
    int velocityIterations = 6;//速度计算层级
    int positionIterations = 2;//位置计算层级

    world.step(timeStep, velocityIterations, positionIterations);//在这个Step方法中进行了碰撞的检测,速度的更新等操作,模拟要在一个循环里,才能持续

    碰撞检测:

    如果没有自定义设定world.setContactFilter.则box2d的碰撞是自动的.那么在碰撞后需要执行行为,要怎么做呢.我们可以通过world.setContactListener来检测碰撞,该接口有两个函数,endContact和beginContact,任何刚体开始碰撞都会执行beginContact,结束碰撞都会执行endContact.,参数Contact则是当前的碰撞,通过Contact.getFixtureA获得创建时间比较早的对象,Contact.getFixtureB获得创建时间晚的对象.然后大家可以在这两个函数里加上自定义的东西了.

    碰撞过滤:

    碰撞过滤的意思是我们可以指定哪些刚体会碰撞,哪些不会.如果没有设定world.setContactFilter.则使用默认的过滤,即全部刚体都会发生碰撞,ContactFilter这个接口里只有一个函数shouldCollide,字面意思就是"应该碰撞",是返回boolean类型的,我们就知道如果需要碰撞则返回true,不需要碰撞则返回false.函数有两个Fixture夹具.当两个刚体碰撞时,创建时间较早的是fixtureA,晚的是fixtureB.Fixtrue内置的filter也有相同的功能,但是有了ContactFilter后,也就不需要用了.

    关于world的create和destroy要注意:

    在游戏中create和destroy刚体或者关节的时候,记得要检测world锁的状态,否则有时候会出现错误isLocked()==false.因为当在world模拟step的时候,world.isLocked()是为true的,world无法create或者destroy.而此时我们又执行create或者destroy,所以就会出现错误了.

    还有create和destroy不能在callbacks里面.否则也会出现上面的错误.在destroyBody函数的说明里有:This function is locked during callbacks. 此函数在callbacks里是上锁的,也就是不能使用的.callbacks就是如ContactListener里的beginContact函数,也就是被动执行的函数,被称为callbacks.

    所以我们一定要在world.isLocked()==false的时候才能执行create和destroy.

    在执行create和destroy前应该检测锁的状态:

    if(world.isLocked())

        return;//or do something else

    Gdx中处理输入:

    在Gdx中如果我们需要对输入有相应的操作,则应该Gdx.input.setInputProcessor.InputProcessor是输入处理器接口.里面包括了我们需要的各种回调函数callbacks.

    touch类的:touchUp,touchMoved,touchDragged,touchDown;

    key类的:keyUp,keyTyped,keyDown;

    还有一个scrolled;//Called when the mouse wheel was scrolled. Will not be called on Android.

    Reprinted from:http://kongweile.iteye.com/blog/978718

  • 相关阅读:
    真正的e时代
    在线手册
    UVA 10616 Divisible Group Sums
    UVA 10721 Bar Codes
    UVA 10205 Stack 'em Up
    UVA 10247 Complete Tree Labeling
    UVA 10081 Tight Words
    UVA 11125 Arrange Some Marbles
    UVA 10128 Queue
    UVA 10912 Simple Minded Hashing
  • 原文地址:https://www.cnblogs.com/qiengo/p/2626109.html
Copyright © 2011-2022 走看看