• 使用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

  • 相关阅读:
    个人总结
    第三次个人作业——用例图设计
    结对项目——第二次作业
    结对项目——第一次作业
    第二次个人编程作业
    第一次个人编程作业
    个人总结
    第三次个人作业——用例图设计
    第二次结对作业
    第一次结对作业
  • 原文地址:https://www.cnblogs.com/qiengo/p/2626109.html
Copyright © 2020-2023  润新知