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

Java (LIBGDX)渲染精灵(角色)隐藏墙,java,dictionary,libgdx,render,tiled,Java,Dictionary,Libgdx,Render,Tiled,我正在用Libgdx做一个游戏,我正在使用等轴测透视图。 渲染角色时出现问题,因为贴图是从平铺贴图编辑器加载的,并且角色是精灵 如果我在地图的第0层上有一堵墙,当在精灵之前绘制墙时,如果精灵在墙后面,我们将看到精灵而不是墙(我们应该看到墙),如果首先渲染精灵,当精灵在墙前面时,我们将看到墙而不是精灵(我们应该看到精灵)。有没有关于修复此问题的想法?我还没有真正使用平铺贴图,但我认为它是这样的 首先,在TileEd中,创建将用于角色精灵的对象层。因此,该层应该介于背景材料和遮挡玩家的材料之间。把它

我正在用Libgdx做一个游戏,我正在使用等轴测透视图。 渲染角色时出现问题,因为贴图是从平铺贴图编辑器加载的,并且角色是精灵


如果我在地图的第0层上有一堵墙,当在精灵之前绘制墙时,如果精灵在墙后面,我们将看到精灵而不是墙(我们应该看到墙),如果首先渲染精灵,当精灵在墙前面时,我们将看到墙而不是精灵(我们应该看到精灵)。有没有关于修复此问题的想法?

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

首先,在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);
        }
    }
}
这是它工作原理的基础。但是,如果您希望您的播放器能够像您描述的那样位于墙的前面或后面,那么您需要创建多个额外的层,并在必要时将您的精灵对象移动到不同的层

在我看来,Libgdx可以对正交平铺贴图渲染器使用功能增强,这样它可以绘制自动合并到平铺层中的对象,并根据行将它们插入绘制顺序。

我在其他地方找到了“答案”,因此我与您共享它,因此如果其他人有问题:

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

还是同样的问题,我不知道如何检查精灵应该在什么时候第一次或最后一次渲染..在libgdx中似乎没有一种简单的方法可以做到这一点。我认为您需要在TileEd中创建多个层,每行对象一个层,可以位于播放器的后面或前面,层的排序方式应确保较近的行是较高的层。然后在所有这些行之间创建对象行,并在玩家自己的行发生变化时将玩家从一层移动到另一层。如果libgdx能够自动测试玩家的Y和有问题的瓷砖的Y,并将玩家正确地混合到图层中,那么所有这些都会容易得多。问题是它可能会工作,但我不打算只使用一个玩家,我的游戏就像帝国时代一样,很多玩家都应该检查他们是在有问题的地砖前面还是后面,我认为这会花费太多。即使在libgdx中内置了对这一点的支持,你仍然需要检查每个玩家的深度并将其分层次。但是我不认为像这样简单的东西的成本值得担心,除非你同时拥有数千个屏幕上的角色。自动化这感觉像是可以很容易地添加到libgdx中的东西,但我以前从未在TileEd上乱搞过。也许有一天,如果我觉得无聊,我会尝试一下。