0

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

另外,如果可能的话,我想有一个可以使用这个的小地图。

如果我问了很多,我很抱歉,只是我对这些东西不熟悉。

4

2 回答 2

2

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

XNA 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;
        }
    }
}

我希望这会让您对如何做到这一点有所了解。我建议在互联网上搜索更多示例。

于 2013-10-21T23:09:45.103 回答
0

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

于 2013-10-21T23:24:23.580 回答