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