如何将身体从当前世界迁移到另一个

时间:2016-08-10 18:53:29

标签: java libgdx

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

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的方式所以我现在必须尽我所能地设计,谢谢。

1 个答案:

答案 0 :(得分:0)

我建议collision filtering groups而不是使用多个世界。改变一个组只是改变一个参数,而不是将一个整体从一个世界复制到另一个世界,我希望它更高效。

  

仅在您使用时,应使用组而不是类别和蒙版   需要禁用同一类别的对象之间的冲突。

相关问题