(LIBGDX) Rendering Sprite (character) 隐藏了一个Wall

(LIBGDX) Rendering Sprite (character) hides a Wall

我正在使用 Libgdx 制作游戏,并且我使用的是等轴测视角。 我在渲染角色时遇到问题,因为地图是从 Tiled Map Editor 加载的,而角色是 Sprite。

如果我在地图的0层有一面墙,在Sprite之前绘制墙时,如果Sprite在墙后面,我们会看到Sprite而不是墙(我们应该看到墙),如果首先渲染精灵,当精灵在墙前面时,我们将看到墙而不是精灵(我们应该看到精灵)。有解决这个问题的想法吗?

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

首先,在 TileEd 中,创建一个将用于您的角色精灵的对象层。因此,该层应该介于背景内容和应该遮挡播放器的内容之间。将其命名为 "characters".

然后,创建一个可以渲染精灵的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);
        }
    }
}

这就是它的工作原理。但是如果你想让你的玩家能够像你描述的那样在墙的前面或后面,那么你将需要创建多个额外的层,并在必要时将你的精灵对象移动到不同的层。

在我看来 Libgdx 可以使用 OrthogonalTiledMapRenderer 的功能增强功能,这样它就可以绘制自动合并到 TileLayer 中的对象,并根据行将它们插入到绘制顺序中。

我在别处发现了一个 "answer",所以我与您分享,如果其他人有问题:

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