当前位置: 代码迷 >> java >> (LIBGDX)渲染精灵(角色)隐藏墙
  详细解决方案

(LIBGDX)渲染精灵(角色)隐藏墙

热度:57   发布时间:2023-08-02 11:11:55.0

我正在使用Libgdx制作游戏,并且正在使用等距透视图。 渲染角色时出现问题,因为地图是从“平铺地图编辑器”加载的,并且角色是Sprite。

如果我在地图的第0层上有一堵墙,则在Sprite之前绘制墙时,如果Sprite在墙的后面,我们将看到Sprite而不是wall(我们应该看到墙),如果先渲染Sprite,当子画面在墙的前面时,我们将看到墙而不是子画面(我们应该看到子画面)。 关于解决此问题的任何想法?

我还没有真正使用平铺地图,但是我认为它像这样。

首先,在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中的对象并将其插入到基于行的绘制顺序中。

我在其他地方找到了“答案”,因此与您分享,以便其他人遇到问题:

- 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.