问题描述
我正在使用Libgdx制作游戏,并且正在使用等距透视图。 渲染角色时出现问题,因为地图是从“平铺地图编辑器”加载的,并且角色是Sprite。
如果我在地图的第0层上有一堵墙,则在Sprite之前绘制墙时,如果Sprite在墙的后面,我们将看到Sprite而不是wall(我们应该看到墙),如果先渲染Sprite,当子画面在墙的前面时,我们将看到墙而不是子画面(我们应该看到子画面)。 关于解决此问题的任何想法?
1楼
我还没有真正使用平铺地图,但是我认为它像这样。
首先,在TileEd中,创建一个将用于角色精灵的对象层。 因此,该层应该介于背景内容和应该遮盖玩家的内容之间。 将其命名为“字符”。
然后,创建一个可渲染精灵的MapObject子类。 像这样:
public class SpriteMapObject extends MapObject {
private Sprite sprite;
public SpriteMapObject (Sprite sprite) {
this.sprite = sprite;
}
@Override
public Color getColor () {
return sprite.getColor();
}
@Override
public void setColor(Color color){
sprite.setColor(color);
}
public void render(Batch batch){
Color spriteColor = sprite.getColor();
float originalAlpha = spriteColor.a;
spriteColor.a *= getOpacity();
sprite.draw(batch);
spriteColor.a = originalAlpha;
}
}
现在,在加载地图和精灵后,您可以将精灵放置在准备好的图层上:
map.getLayers().get("characters").add(new SpriteMapObject(playerSprite));
您还需要对地图渲染器进行子类化,以便它将为您渲染精灵。 使用您的子类版本而不是原始版本。 例如:
public class SpritesOrthogonalTiledMapRenderer extends OrthogonalTiledMapRenderer {
//Override whichever constructor(s) you need
public SpritesOrthogonalTiledMapRenderer (TiledMap map, Batch batch) {
super(map, batch);
}
@Override
public void renderObject(MapObject object) {
super.renderObject(object);
if(object instanceof SpriteMapObject) {
((SpriteMapObject) object).render(batch);
}
}
}
这是其工作原理的基础。 但是,如果您希望播放器能够像您描述的那样位于墙的前面或后面,那么您将需要创建多个额外的图层,并在必要时将Sprite对象移动到不同的图层。
在我看来,Libgdx可以使用OrthogonalTiledMapRenderer的功能增强功能,以便它可以绘制自动合并到TileLayer中的对象并将其插入到基于行的绘制顺序中。
2楼
我在其他地方找到了“答案”,因此与您分享,以便其他人遇到问题:
- get players tile location.
- get each tile in that stack ( aka, get a reference to every tile in that cell across each layer.
- check for visibility exceptions on each of those tiles. Store exceptions as properties defined in Tiled. ( will cover properties shortly )
- handle accordingly, most likely by raising or lowering the players render layer for that frame.