【问题标题】:LibGDX - Displaying player in fron or behind the objectLibGDX - 在对象前面或后面显示玩家
【发布时间】:2015-09-27 06:39:47
【问题描述】:

我正在创建一个游戏,您可以在其中所有四个方向(上、下、右、左),我遇到了一个问题:我找不到让玩家如果玩家在该对象后面,则显示在该对象后面。

虽然我完全采用自上而下的方式,但没关系。但是现在我正在尝试为其添加一些“3D”效果请参见下面的图片)。

还有一件事——我正在制作这样当玩家进入房子时,整个房子的外观(全高的墙壁和屋顶)消失了,只有墙壁的布局(实际的碰撞层在哪里)是正在显示(我还没有这样做,但我对如何实现它有一个非常清晰的愿景)。

为了更清楚,我将举一些图片作为例子:

当玩家在物体下方时 - 一切正常!

但是当玩家在物体后面时 - 事情开始变得很奇怪:D

他应该是幕后黑手……

任何人都知道如何将玩家放在他应该在后面的物体后面吗?

已编辑:

@Override public void show( )
{
    /** Initializing InputProcessor **/
    Gdx.input.setInputProcessor( this );

    /** Creating map **/
    tiledMap = new TmxMapLoader( ).load( "maps/medievalPlace.tmx" );
    mapRenderer = new OrthogonalTiledMapRenderer( tiledMap );

    /** Initializing Camera **/
    camera = new PlayerCamera( ( TiledMapTileLayer ) tiledMap.getLayers( ).get( 0 ) );

    /** Initializing spriteBatch **/
    spriteBatch = new SpriteBatch( );
    spriteBatch.setProjectionMatrix( camera.combined );
    spriteBatch.maxSpritesInBatch = 1;

    /** Initializing uiBatch **/
    uiBatch = new SpriteBatch( );
    uiBatch.maxSpritesInBatch = 5;

    /** Creating Player **/
    player = new Player( new Texture( "char/down/walk0.png" ) );

    // Initializing font for FPS displaying //
    font = new BitmapFont( );
}

private void renderScreen( )
{
    Gdx.gl.glClear( GL20.GL_COLOR_BUFFER_BIT );

    /** Rendering map **/
    mapRenderer.setView( camera );
    mapRenderer.render( );

    /** spriteBatch rendering **/
    spriteBatch.begin( );

    player.draw( spriteBatch );

    spriteBatch.end( );

    /** uiBatch rendering **/
    uiBatch.begin( );

    arrow_right.draw( uiBatch );
    arrow_left.draw( uiBatch );
    arrow_down.draw( uiBatch );
    arrow_up.draw( uiBatch );
    action.draw( uiBatch );

    font.draw( uiBatch, "Fps: " + Gdx.graphics.getFramesPerSecond( ), 100, Gdx.graphics.getHeight( ) - 100 );

    uiBatch.end( );
}

【问题讨论】:

  • 你能发布一些代码吗?可能是duplicate
  • 您需要哪一部分?我渲染一切的那个?
  • 渲染和精灵/背景初始化。
  • 编辑了问题,看看:)
  • 如何将 scene2d 与演员一起使用,这样您就可以更改演员的 z 顺序。

标签: java android libgdx tiled


【解决方案1】:

另一种方法是扩展 OrthogonalTiledMapRenderer 并在渲染图层时处理字符渲染。当我遇到同样的问题时,我发现了这篇文章。

http://www.gamefromscratch.com/post/2014/05/01/LibGDX-Tutorial-11-Tiled-Maps-Part-2-Adding-a-character-sprite.aspx

【讨论】:

  • 这就是我正在做的事情,我可以确认这很容易。您只需将您希望能够在后面和前面走的所有 Tiled 对象精灵添加到列表中。然后你将你的玩家精灵和任何其他实体精灵也添加到列表中。然后使用比较器并使用 Y 坐标对该列表中的所有精灵进行排序。然后让它首先渲染具有较高 Y 坐标的精灵,这将使它们出现在具有较低 Y 坐标值的精灵后面。
【解决方案2】:

最简单的方法是在渲染播放器后渲染播放器可以落后的所有对象,使其看起来像

Gdx.gl.glClear( GL20.GL_COLOR_BUFFER_BIT );

/** Rendering map **/
mapRenderer.setView( camera );
mapRenderer.render( );            //all "background" things here (player is above them)

/** spriteBatch rendering **/
spriteBatch.begin( );

player.draw( spriteBatch );

for(Sprite sprite : firstPlaneSprites) //array with objects player can be behind
sprite.draw( spriteBatch );
spriteBatch.end( );

但需要以特殊方式创建前端对象(我假设您正在使用 Tiled 或类似的东西来渲染地图)


第二个更难的想法是当你使用TextureRegion 进入“前”区域时切断玩家精灵的部分。步骤应该是

  • 检查您必须从顶部切割多少并从原始纹理创建一个 TextureRegion tr1
  • 检查你必须从底部切割多少并从 tr1 创建一个 TextureRegion tr2
  • 检查你必须从左边切割多少,并从 tr2 创建一个 TextureRegion tr3
  • 检查您需要从右侧切割多少并从 tr3 创建一个 TextureRegion tr4
  • 渲染 tr4

你应该添加一些不可见的物体,它们会告诉你是否进入了“前面”区域(你的角色后面的区域)


至少你可以使用Scene2d 和它的 Image actor 类——这将是最好的,但你必须像应用程序中的所有内容一样更改创建类型。使用它的方式与第一个想法一样简单,但您不必渲染它只是为了使用 toFront() 和 toBack() 设置演员位置

【讨论】:

  • 第一种方法是行不通的,因为我的玩家当然可以在不同的时间在同一个物体的后面或前面。在我看来,即使它会起作用,也需要太多的资源来进行计算。但 Scene2D 看起来很有希望。打算试试 EssEllDee 给我的教程。
  • 我宁愿考虑将对象分成两部分 - 一个角色可以在上面(如房子的墙壁),第二个角色可以在后面(如屋顶)并单独渲染它们。是否有一个对象可以让角色一次在后面,一次在上面?
  • 是的,例如树。一旦玩家低于树 - 玩家就在前面。一旦玩家高于树 - 他应该在树后面。
  • 不是在树后面,而是在树的一部分——叶子。你可以分割它
猜你喜欢
  • 2022-11-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-05-11
  • 1970-01-01
  • 2016-02-17
  • 2022-11-05
相关资源
最近更新 更多