【问题标题】:How to migrate body from current world to another如何将身体从当前世界迁移到另一个世界
【发布时间】:2016-08-13 09:40:44
【问题描述】:

我目前有一个游戏,你需要切换“领域”,我需要找到一种方法将 Body 从一个领域移动到另一个领域。这是我为玩家做的事情(每个关卡有 n 个领域,每个领域都有 Box2D 身体)这是关卡类:

public class Level {

private Array<Realm> realms;
private Array<Player> players;
private Realm currentRealm;
private int realmIndex = 0;

InputReciever inputReciever;
private CollisionReciever collisionReciever;
public Level(){

    realms = new Array<Realm>();
    realms.add(new Realm("Realm1"));
    realms.add(new Realm("Realm2"));
    currentRealm = realms.get(realmIndex);

    players = new Array<Player>();
    for(Realm realm : realms){
        players.add(new Player(new Vector2(2, 3)));
        players.get(players.size - 1).createBody(realm.getWorld());
    }
    BoxEntity entity = new BoxEntity(new Vector2(2, 1), new Vector2(1, .25f), BodyType.StaticBody);
    entity.createBody(currentRealm.getWorld());

    entity = new BoxEntity(new Vector2(5, 1.75f), new Vector2(1, .25f), BodyType.StaticBody);
    entity.createBody(currentRealm.getWorld());

    entity = new BoxEntity(new Vector2(5.5f, .75f), new Vector2(.5f, .15f), BodyType.StaticBody);
    entity.createBody(currentRealm.getWorld());

    entity = new BoxEntity(new Vector2(7, -1.75f), new Vector2(1, .15f), BodyType.StaticBody);
    entity.createBody(currentRealm.getWorld());

    entity = new BoxEntity(new Vector2(6, -.25f), new Vector2(1, .15f), BodyType.StaticBody);
    entity.createBody(realms.get(1).getWorld());

    entity= new BoxEntity(new Vector2(3, 1), new Vector2(1, .5f), BodyType.StaticBody);
    entity.createBody(realms.get(1).getWorld());

    entity= new BoxEntity(new Vector2(3, -1), new Vector2(1, .25f), BodyType.StaticBody);
    entity.createBody(realms.get(1).getWorld());


    inputReciever = new InputReciever(players.get(realmIndex), this);
    Gdx.input.setInputProcessor(inputReciever);

    collisionReciever = new CollisionReciever();
    collisionReciever.setPlayer(players.get(realmIndex));
    currentRealm.getWorld().setContactListener(collisionReciever);
}

private Player tmpPlayer;
public void switchRealm(){
    tmpPlayer = players.get(realmIndex);
    if(realmIndex < realms.size - 1){
        realmIndex ++;
    }else
        realmIndex = 0;


    currentRealm = realms.get(realmIndex);
    currentRealm.getWorld().setContactListener(collisionReciever);
    inputReciever.setPlayer(players.get(realmIndex));
    //this transforms the player in the list to the position of the original
    players.get(realmIndex).retainState(tmpPlayer);
    collisionReciever.setPlayer(players.get(realmIndex));
}

public void render(OrthographicCamera camera){
    currentRealm.render(camera);
}

public void update(OrthographicCamera camera){
    camera.position.set(players.get(realmIndex).getBody().getTransform().getPosition(), 0);

    currentRealm.update(camera);

    players.get(realmIndex).update();
}

}

我切换领域的方式导致游戏中的一个错误,在我继续之前,这里是方法“retainState();”给玩家

public void retainState(Player player){
    ((Body) bodyObjects.get(BodyReferences.BODY)).setTransform(player.getBody().getPosition(), player.getBody().getAngle());
    ((Body) bodyObjects.get(BodyReferences.BODY)).setLinearVelocity(player.getBody().getLinearVelocity());
}

我的问题是,有没有办法在不重建的情况下将身体放置在另一个世界中?我正在使用多个世界,因此我可以更改光线处理程序效果和关卡编辑器,所以基本上,我需要对多个世界进行此操作。

问题:有没有办法在不使用位过滤的情况下将 Body 从一个世界移动到另一个世界?

我完全了解位过滤,但这是我的开发团队设置 UML 的方式,所以我现在必须尽我所能遵循设计,谢谢。

【问题讨论】:

    标签: java libgdx


    【解决方案1】:

    我推荐collision filtering by groups,而不是使用多个世界。更改组只是更改一个参数,而不是将整个身体从一个世界复制到另一个世界,我希望它的性能更高。

    应该使用组而不是类别和掩码 需要禁用同一类别的对象之间的碰撞。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-08-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-01-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多