【发布时间】:2010-12-10 21:11:43
【问题描述】:
我将制作一个类似于 XNA 示例游戏“Platformer1”的游戏,它是 XNA 附带的。但是我需要更长的不适合屏幕的关卡(比如超级马里奥关卡)。我该如何管理这种级别?我需要使用跟随精灵的 2d 相机吗?如果我这样做,我该如何加载关卡?我有点困惑,我不确定我是否能清楚地解释我的问题。希望有人能帮忙?
【问题讨论】:
我将制作一个类似于 XNA 示例游戏“Platformer1”的游戏,它是 XNA 附带的。但是我需要更长的不适合屏幕的关卡(比如超级马里奥关卡)。我该如何管理这种级别?我需要使用跟随精灵的 2d 相机吗?如果我这样做,我该如何加载关卡?我有点困惑,我不确定我是否能清楚地解释我的问题。希望有人能帮忙?
【问题讨论】:
基于 MSDN 中 Platformer Starter Kit 的教程有一个步骤 Adding a Scrolling Level 指导您创建更长的关卡。教程很详细,强烈推荐。
我在XNA Game Studio 4.0 部分中找不到教程,但差异应该很小。根据页面底部的评论,您需要更改的只是替换
spriteBatch.Begin(SpriteBlendMode.AlphaBlend, SpriteSortMode.Immediate, SaveStateMode.None, cameraTransform);
与
spriteBatch.Begin(SpriteSortMode.Immediate, BlendState.AlphaBlend, SamplerState.LinearClamp, DepthStencilState.Default, RasterizerState.CullCounterClockwise, null, cameraTransform);
在教程代码中。
【讨论】:
如果你想创建一个横向滚动游戏,那么我会研究视差滚动。快速的 google/bing 将帮助您找到很多教程。另外,另一个有用的提示是在 YouTube 上搜索 XNA 视频,我们有很多张贴者分享他们的源代码。
这里是微软Parallax Scrolling的链接。
【讨论】:
听起来您面临着一些问题。
但我需要更长的不适合屏幕的关卡(如超级马里奥关卡)。我该如何管理这种级别。
有几种方法可以做到这一点,但一个相当简单的方法是拥有一个名为Tile 的类的二维数组(或稀疏数组,取决于你的关卡的大小),它存储有关平铺图像的信息,动画,...随便。
是的,您可能需要一个“相机”。这可以简单到只绘制该数组的某个范围或使用变换来缩小并在您的关卡中平移的更具特色的相机。
希望这将帮助您入门。
【讨论】:
我在 XNA 中做了大量工作,根据我的经验,有两种方法可以绘制 2D 场景:
1) 严格 2D。这种方法要容易得多,但有一些限制。本身没有“相机”,您所做的就是将所有东西移动到固定的 2D“相机”下方。我用引号说“相机”,因为相机是固定的(据我所知)。好处是很容易,坏处是你不能轻易放大或缩小或做其他相机效果。
2) 3D 中的 2D。使用 2D 平面设置 3D 世界。这更灵活,但使用起来也更具挑战性,因为您需要设置 3D 世界和 3D 相机。如果这是您第一次尝试制作游戏,我强烈建议您不要使用这种方法。
我真的只熟悉严格的 2D 方法,您会想要一个具有 2D 坐标的地图对象列表。您还想存储您正在查看的地图的哪个部分,我使用存储它的 Rectangle 或 Vector2 来执行此操作。这个值会随着角色的移动而向前移动。然后,您可以获取 2D 地图对象的坐标并减去您正在查看的左上角的 (X,Y) 以确定对象的屏幕位置。所以:
float screenX = myMapObject.X - focusPoint.X;
float screenY = myMapObject.Y - focusPoint.Y;
另外需要注意的是,使用浮点数或 Vector2/3 来存储位置,你可能认为现在不需要它,但它会下线。
这可能有点矫枉过正,但我的 SF 项目使用 XNA 来绘制可以移动的严格 2D 场景:http://sourceforge.net/projects/asteroidoutpost/
我希望这会有所帮助。
【讨论】:
SpriteBatch.Begin,并将您的实际精灵位置留在“世界空间”中。
查看 Nick Gravelyns 教程。当我刚开始时,他们帮助了我很多 - 真的非常值得一看,可以学到很多关于 2D 游戏的知识。
所有视频现在都在 youtube 上 here
【讨论】: