【问题标题】:(LIBGDX) Rendering Sprite (character) hides a Wall(LIBGDX) 渲染精灵(角色)隐藏一堵墙
【发布时间】:2015-10-18 06:34:18
【问题描述】:

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

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

【问题讨论】:

    标签: java dictionary libgdx render tiled


    【解决方案1】:

    我在其他地方找到了“答案”,所以我与您分享,如果其他人有问题:

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

    【讨论】:

      【解决方案2】:

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

      首先,在 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 可以对 OrthogonalTiledMapRenderer 使用功能增强,因此它可以绘制自动合并到 TileLayer 中的对象,并根据行将它们插入到绘制顺序中。

      【讨论】:

      • 还是同样的问题,我不知道如何检查精灵应该先渲染还是最后渲染..
      • 在 libgdx 中似乎没有一种简单的方法可以做到这一点。我认为您需要在 TileEd 中制作多个图层,每一行可以在玩家后面或前面的对象一个图层,并且对图层进行排序,以便更近的行是更高的图层。然后在所有这些对象行之间创建对象行,并随着他们自己的行的变化将您的播放器从一层移到另一层。如果 libgdx 可以根据问题图块的 Y 自动测试玩家的 Y,并正确地将玩家混合到图层中,所有这一切都会容易得多。
      • 问题是它可能会起作用,但我不打算只使用一个玩家,我的游戏会像帝国时代一样,很多玩家应该检查他们是在前面还是后面一个有问题的瓷砖,我认为它会花费太多
      • 即使 libgdx 内置了对此的支持,您仍然需要检查每个玩家的深度并将它们分类到图层中。但我不认为像这样简单的事情的成本值得担心,除非你同时拥有数千个屏幕上的角色。自动化这个感觉就像可以很容易地添加到 libgdx 中的东西,但我之前没有搞砸过 TileEd。也许有一天,如果我感到无聊,我会尝试一下。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-03-23
      • 1970-01-01
      • 2018-08-27
      • 2016-06-27
      • 1970-01-01
      相关资源
      最近更新 更多