2D瓦片游戏引擎 - 在XNA中使用C#进行图层管理

4
我将要建立一个高级的二维上下行动角色扮演游戏。
它将是我的现有二维Flash RPG引擎(Adobe Air)的C# + XNA版本。
在Flash Pro中,我仅仅使用不同的MovieClips来处理不同的图层,但是我应该如何在使用XNA的C#中实现呢?
我想使用我制作的Flash地图编辑器的输出(地图数据文件)。
输出文件看起来像这样:
<layer1>
0.0.0.A.A.A.A.B.B.A.A.0.0.0
0.0.0.A.A.A.A.B.B.B.A.A.0.0
0.0.A.A.A.B.B.B.B.B.B.A.0.0
0.A.A.A.A.B.B.B.B.B.B.A.A.0
0.A.A.A.A.B.B.B.B.B.B.A.A.0
0.A.A.A.A.A.B.B.B.B.B:B.A.0
0.0.A.A.A.A.B.B.B.B.A.A.A.0
0.0.A.A.A.A.A.B.B.A.A.A.0.0
0.0.0.A.A.A.A.B.B.A.A.0.0.0

<layer2>
. . . . . 
. . .
.
.

<layer3>
.
.
.

an so on...

where:

0 = Blank;
A = Gras;
B = Water;

我希望能够简单地遍历这些行,将它们保存在数组中,并将相应的精灵添加到特定的图层中,可能是这样:

Layers[2].Add( tile, x, y );

如何实现这个功能?还有,如何管理z排序,因为我希望能够在桥下行走或通过隧道驾车。(就像在这张图片中,船可以在桥下行驶。)
甚至有些楼梯可以到达下一层(切换图层)。
你们有任何想法或给我提供参考吗?
谢谢你们的回答!
编辑:
层次结构应如下所示:
map{
    Layer[0] { // "bg"
        xyArray{ .... }
    }
    Layer[1] { // "static" - bottom part / stairs of the bridge
        xyArray{ .... }
    }
    Layer[2] { // "items"
        xyArray{ .... }
    }
    Layer[3] { // "player"
        xyArray{ .... }
    }
    Layer[4] { // "static2" - top part of bridge
        xyArray{ .... }
    }
}

// if the player is ON a tile that hat a Stair funktion, the "player" layer will be
// moved on top of the "static2" layer, so 'Layer[3].Z = 4;' and 'Layer[4].Z = 3;'
// like i showed in the Switch funktion up there

@Heisenbug 我知道没有集成的方法,这就是为什么我问了“如何实现”的问题。 - Ace
啊,好的,我只是在寻找一种合适的方法来告诉SpriteBatch这个瓦片是Z = 3,那个瓦片是Z = 6,或者我为Z定义了什么...我应该只是按正确的顺序绘制它们吗?还是我可以告诉渲染器哪一个在顶部/底部/中间??? - Ace
SpriteBatch很烂。一开始看起来很有用,但后来往往会搞砸事情。按顺序绘制它们是可行的。 - harold
那么,如果spriteBatch不好用,我还能用什么来绘制这些东西呢? - Ace
区别在于它不尝试为你做任何事情。因此使用起来会更困难,但SpriteBatch有一种习惯,自动帮你做错误的事情。 - harold
显示剩余9条评论
1个回答

1

SpriteBatch.Draw 方法有多个重载,可以让您指定图层。

具体来说,在表格的最后两个条目中 这里

图层是介于 0 和 1 之间的浮点数。您还需要在 SpriteBatch.Begin() 中指定一个 SpriteSortMode。下面是我编写的一个棋盘游戏的示例,它会对玩家代币进行着色,并将活动玩家移动到堆栈的最前面,以便当多个玩家占据同一方格时使用:

if (i == currentPlayer)
{
     SpriteColor = Color.White;
     spriteDepth = 0f; // Front
}
else
{
     SpriteColor = Color.Gray;
     spriteDepth = 0.1f; // Back
}
spriteBatch.Begin(SpriteSortMode.BackToFront, BlendState.AlphaBlend);
spriteBatch.Draw(players[i].Sprite, SquareCentre, null, SpriteColor, 0f, SpriteCentre,0.5f, SpriteEffects.None, spriteDepth);
spriteBatch.End();

希望这能有所帮助。

我会试一试,看看它是否适用于我的当前图层管理设置。谢谢。 - Ace

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接