我目前有一款游戏需要切换“领域”,我需要找到一种方法将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的方式所以我现在必须尽我所能地设计,谢谢。
答案 0 :(得分:0)
我建议collision filtering groups而不是使用多个世界。改变一个组只是改变一个参数,而不是将一个整体从一个世界复制到另一个世界,我希望它更高效。
仅在您使用时,应使用组而不是类别和蒙版 需要禁用同一类别的对象之间的冲突。