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

时间:2013-10-21 22:49:42

标签: c# xna scroll

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

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

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

2 个答案:

答案 0 :(得分:2)

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

XNA 2D Camera

在小地图部分: 您需要考虑小地图的设计风格。一种方法是根据“真实”游戏世界中墙壁的位置和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;
        }
    }
}

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

答案 1 :(得分:0)

你真正需要做的就是不要移动你让他保持在中心的角色,而是将相反方向的其他东西移动,然后将这个偏移量计入你的碰撞检查和诸如此类的东西。考虑将偏移量添加到对象坐标上,将它们从屏幕坐标转换为地图坐标。