XNA 4.0 中的 2D 自上而下滚动

本文关键字:自上而下 滚动 2D 中的 XNA | 更新日期: 2023-09-27 18:36:16

我想做一个2D俯视射击游戏,可以向各个方向滚动。但是,由于我是 XNA 的初学者,我只能实现光标、播放器(有移动)和向光标旋转的项目符号。我一直在尝试找到一种在 XNA 中实现自上而下滚动的方法,但我不知道。我在互联网上看到的一篇文章很模糊,对我没有多大帮助。我还想确保当我移动时,我周围的物体保持在原位,这样如果我滚动得足够远,它们就会从视线中消失。不过,我不希望所有对象都有这种行为,因为我希望光标始终在屏幕上并且不受我的移动的影响。

另外,如果可能的话,我想有一个可以解决这个问题的小地图。

如果我

问了很多,我很抱歉,只是我不熟悉这些事情。

XNA 4.0 中的 2D 自上而下滚动

当我遇到同样的问题时,这篇文章帮助了我:

新纳2D相机

在小地图部分:您需要为小地图考虑一种设计风格。一种方法是根据墙壁在"真实"游戏世界中的位置为墙壁绘制矩形,并为NPC绘制点。互联网上有很多关于如何做这些的例子,但如果你不想自己搞砸这个。

假设你有一个基于网格的自上而下的游戏。

您的玩家看到 30x30 方

块,而世界是 300x300 方块。例如,您可以使用 120x120 的矩形大小(以像素为单位)将 60x60 块绘制到屏幕的一角作为小地图,这样每个方块就可以绘制为 4 个像素。

现在你只需要知道你的球员两侧有哪 30 个块。如果您知道玩家当前在哪个块上。你可以这样做(在基于网格的游戏中):

// We assume that we created a World class that can get a block based on
// a Vector2D.
var playerBlock = World.GetBlockByPosition(player.Position);
// Set the TopLeft position of the minimap accordingly.
Vector2 minimapTopLeft = new Vector(500, 100);
// Draw each 4 pixel block from that TopLeft position (of minimap).
for (int i = -30; i <= 30; i++)
{
    for (int j = -30; j <= 30; j++)
    {
        // Make sure World.GetBlock doesn't return null.
        // Offset the location with the player's location (playerBlock).
        int blockType = World.GetBlock(playerBlock.X + i, playerBlock.Y + j).Type;
        // Draw the 4 pixel blocks based on the i and j vars and the 
        // minimapTopLeft as offset.
        switch (blockType)
        {
            case 1:
                // Draw dirt.
                break;
            case 2:
                // Etc.
                break;
            default:
                // Draw default black block.
                break;
        }
    }
}

我希望这能让你知道如何做到这一点。我建议在互联网上搜索更多示例。

你真正需要做的就是不要移动角色,而是让他保持在中心,把其他所有东西都移到相反的方向上,然后将偏移因素纳入你的碰撞检查等等。将偏移添加到对象坐标上视为将它们从屏幕坐标转换为地图坐标。