【问题标题】:Changing FixtureDef properties Java Libgdx更改 FixtureDef 属性 Java Libgdx
【发布时间】:2016-07-17 09:19:19
【问题描述】:

我使用工厂模式在我的游戏中创建 Box2D 实体。以下是创建主体的代码:

public static HashMap<String, Object> createAndGet(Vector2 position, Vector2 dimensions,
        BodyType type, boolean isCircle){
    HashMap<String, Object> bodyObjectsHash = new HashMap<String, Object>();

    BodyDef bodyDef = new BodyDef();
    bodyDef.type = type;
    bodyDef.position.set(new Vector2(position.x, position.y));

    Body body = EntityManager.createBody(bodyDef, dimensions);

    FixtureDef fixtureDef = new FixtureDef();
    Fixture fixture;
    if(isCircle){
        CircleShape circle = new CircleShape();
        circle.setRadius(dimensions.x);
        fixtureDef.shape = circle;
        fixture = body.createFixture(fixtureDef);
        circle.dispose();
    }else{
        PolygonShape rectangle = new PolygonShape();
        rectangle.setAsBox(dimensions.x, dimensions.y);
        fixtureDef.shape = rectangle;
        fixture = body.createFixture(fixtureDef);
        rectangle.dispose();
    }


    bodyObjectsHash.put(BodyReferences.BODY, body);
    bodyObjectsHash.put(BodyReferences.BODY_DEF, bodyDef);
    bodyObjectsHash.put(BodyReferences.FIXTURE, fixture);
    bodyObjectsHash.put(BodyReferences.FIXTURE_DEF, fixtureDef);


    return bodyObjectsHash;


}

现在,您将看到它返回一个 HashMap。键是字符串并返回一个对象。这样的代码可以完成:

public void attachNewSprite(String internalPath){
    entitySprite = new Sprite(new Texture(Gdx.files.internal(internalPath)));
    ((Body)bodyObjects.get(BodyReferences.BODY)).setUserData(entitySprite);
}

返回的HashMap存储在bodyObjects中

但是您会注意到,在创建实体的静态方法中,没有设置密度和摩擦力等属性。这是因为我认为通过返回对象我可以编辑它们。这是我假设我会编辑 FixtureDef 的方式:

public void addFixtureDefProperties(float density, float friction, float restitution){
    ((FixtureDef)(bodyObjects.get(BodyReferences.FIXTURE_DEF))).density = density;
    ((FixtureDef)(bodyObjects.get(BodyReferences.FIXTURE_DEF))).friction = friction;
    ((FixtureDef)(bodyObjects.get(BodyReferences.FIXTURE_DEF))).restitution = restitution;

    /*This line will be discussed */
    ((Body)(bodyObjects.get(BodyReferences.BODY))).getFixtureList().removeRange(0, ((Body)(bodyObjects.get(BodyReferences.BODY))).getFixtureList().size - 1);
    ((Body)(bodyObjects.get(BodyReferences.BODY))).createFixture(((FixtureDef)(bodyObjects.get(BodyReferences.FIXTURE_DEF))));
} 

所以我基本上设置了新属性,从主体中删除了fixturedef,然后添加了新的。执行此操作时,我会收到 fatal error。我删除了删除fixturedef 的行并得到相同的fatal error。这是致命错误:

谁能帮我找到一种方法来编辑这些属性,这样我就不必用更多的参数来淹没我的静态createBody 方法。谢谢!

【问题讨论】:

    标签: java libgdx


    【解决方案1】:

    您可以使用其设置方法更改夹具的属性,但其形状除外。您可以使用 getter 方法获取所有属性。仔细查看 Fixture API。因此,您不需要保存 fixtureDef 对象。 BodyDef 和 Body 的关系类似。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-24
      相关资源
      最近更新 更多