(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.
我正在使用 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.