C# 基于2D Tile的游戏引擎-使用C在XNA中进行层管理#

C# 基于2D Tile的游戏引擎-使用C在XNA中进行层管理#,c#,xna,2d,C#,Xna,2d,我要建立一个先进的2D上下RPG 它将是我现有的2D Flash RPG引擎(AdobeAIR)的C#+XNA版本 嗯,在Flash Pro中,我只是在不同的层中使用了不同的MovieClips,但在C#使用XNA时,我怎么能意识到这一点 我希望能够使用我制作的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.

我要建立一个先进的2D上下RPG

它将是我现有的2D Flash RPG引擎(AdobeAIR)的C#+XNA版本

嗯,在Flash Pro中,我只是在不同的层中使用了不同的MovieClips,但在C#使用XNA时,我怎么能意识到这一点

我希望能够使用我制作的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>
.
.
.
Layers[2].Add( tile, x, y );
所以我想简单地循环这些线,保存在数组中,并将共同响应的精灵添加到特定层,可能如下所示:

<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>
.
.
.
Layers[2].Add( tile, x, y );
我怎么能意识到这一点?还有,我如何管理z-排序,因为我更希望能够在桥下行走,或者开车穿过隧道

(如图所示,可能有一艘船驶过大桥)

甚至是一些楼梯,以进入下一阶段(切换层)

你们对我有什么想法或是参考吗

谢谢你的回答

编辑:

hirachy图层应如下所示:

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

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();

希望这能有所帮助。

我做过类似的工作,将精灵的Z设置为其底部的Y坐标,并添加了一些偏移量来解释层。但这是一个比这更简单的游戏。这场比赛够了吗?我真的不明白。你为每个精灵设置了z轴吗?我希望以后能够像“切换(层[2],层[4])那样切换层,所以我只想设置“层[2].Z=4”和“层[4].Z=2”,而不是设置该层中每个精灵的Z。@Ace:XNA中没有层概念。你最终需要实现这种逻辑。我没有预先设置精灵的Z,因为它会改变。每次他们在Y轴上迈出一步,它都会发生变化。如果精灵走到另一层,或者层被切换(虽然在我的游戏中,这两种情况都没有发生),它也会改变。在绘制精灵之前,我会根据当前的Y和图层计算Z。@Heisenbug我知道没有初始化的方法,这就是为什么我会问“如何实现”这个问题,我会尝试一下,看看它是否能与vurrent图层管理设置配合使用。谢谢