2016-08-10 12 views
0

私は現在、「領域」を切り替える必要のあるゲームを持っています。私は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(); 
} 

}

私はレルムを切り替える方法はstudderでの原因ゲームを続行する前に、ここではメソッド "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()); 
} 

私の質問があるプレイヤーのために、それを再作成することなく、別の世界の内側に体を配置する方法はありますか?私は複数の世界を使用しているので、レインハンドラの効果やレベルエディタを変更する可能性があります。基本的に、私は複数の世界でこれを行う必要があります。

質問:ボディをある世界から別の世界にビットフィルタリングを使用せずに移動する方法はありますか?

私はビットフィルタリングについて十分に理解していますが、これは私の開発チームがUMLを設定する方法です。

答えて

0

複数の世界を使用する代わりに、collision filteringgroupsをお勧めします。グループを変更するということは、ある世界から別の世界へ全身をコピーするのではなく、ただ一つのパラメータを変更するだけです。

のみが同じカテゴリのオブジェクト間の衝突を無効にする必要がある場合は、カテゴリとマスクの代わりにグループを使用する必要があります。