侧面滚动瓷砖地图,地图搞砸了

时间:2011-12-06 16:24:41

标签: c# xna side-scroller

我成功生成了我的瓷砖地图并且它可以工作但是当我想要滚动它时,瓷砖的顶行正在移动并且所有的瓷砖都被拖动了屏幕..很难解释,

想象一下这是瓷砖:X

XXXXXXXXXXXXXXXXXXXXXXXXXX //在相机移动时,它开始逐层移除。

XXXXXXXXXXXXXXXXXXXXXXXXXX //导致所有其他图块向上移动。

XXXXXXXXXXXXXXXXXXXXXXXXXX

XXXXXXXXXXXXXXXXXXXXXXXXXX

看看我的代码:

public void Draw(SpriteBatch spriteBatch)
{
    currentLevel = level1;
    //Its here i need the value from Player class!
    int currentX = cameraX; //The current x cordiate to draw the tile too
    int currentY = 0; //The current y cordiate to draw the tile too
    for (int i = 0; i < currentLevel.Length; i++)
    {
        /*
         * A switch statement to see if the current level1[i] is either a grass, sky or stone tile
         */
        switch(currentLevel[i])
        {
            case 1:
                //Draw a sky tile
                spriteBatch.Draw(tileSheet, new Rectangle(currentX, currentY, 32, 32), skyTile, Color.White);
                break;

            case 2:
                //Draw a grass tile
                spriteBatch.Draw(tileSheet, new Rectangle(currentX, currentY, 32, 32), grassTile, Color.White);
                break;

            case 3:
                //Draw a stone tile
                spriteBatch.Draw(tileSheet, new Rectangle(currentX, currentY, 32, 32), stoneTile, Color.White);
                break;
        }

        //Add 32 to the current cordinate so we don't draw to the same spot all the time
        currentX = currentX + 32; 
        if (currentX >= 896) //If we hit the width of the map we want:
        {
            //Start drawing from X cordinate zero
            cameraX = 0;
            currentX = cameraX;
            //And Y cordinate + 32
            currentY = currentY + 32;
            //This will make so we draw one line and when we hit a full line on the map then we draw next line and soo on.
        }
    }
}

CameraX变量是来自Player类的getter ..当按住键盘上的左键时,它会递减。

这是我从数组中绘制的瓷砖地图(1 =天空,2 =草,3 =石头:

int[] level1 = { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 3,
                         1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 3,
                         1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 3,
                         1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 3,
                         1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 3,
                         1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 3,
                         1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 3,
                         1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 3, 3, 3, 1, 1, 3,
                         1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 3, 3, 3, 1, 1, 1, 1, 1, 1, 3,
                         1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 3,
                         1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 3, 3, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 3,
                         1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 3,
                         1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 3, 3, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 3,
                         1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 3,
                         2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3};

有什么想法吗?

3 个答案:

答案 0 :(得分:4)

看起来你总是在整个地图中绘制所有的图块(我从0开始并遍历每个图块)。但是,您并不总是在每行上绘制相同数量的图块。如果CameraX为0,那么每行将绘制28个图块,因为您将在32 * 28(896)像素后移动到下一行。但是如果CameraX是480,那么你只会在每一行上绘制13((896-480)/ 32)个图块,而第一行图块的其余部分将在第二行绘制(因为你仍在尝试绘制所有瓷砖)。我认为你应该遍历你想要绘制的每一行和一列,并从那些行计算瓦片索引,而不是遍历地图中的每个瓦片并独立计算位置。

修改 下面是一些示例代码,用于在给定列和行索引的情况下计算1维数组中的tile索引,假设您知道列数。 (或者您可以切换到使用二维数组):

i = row * columnCount + column;

答案 1 :(得分:1)

我相信您的问题是,当您到达某一行的末尾时,您将CameraX设置为0

您不想在每一行的末尾移动相机,只想重置x绘图位置(就像在下一行中那样)。

因此,请删除cameraX = 0;

我不是百分之百确定会导致您描述的问题,但它肯定是不对的,因为您说播放器控制cameraX,所以它不应该在您的绘制功能中更改。

答案 2 :(得分:1)

我真的不了解您的代码,但我建议您使用二维数组或以array[ Y * ARRAY_Width + X]之类的正确方式访问一维数组。除此之外,为什么要在整个关卡上开始循环。相机里面的东西很重要,否则你会迭代很多看不见的瓷砖。

从相机X开始Y,计算在相机视口内绘制的水平和垂直平铺块数:这些应该是您需要迭代的唯一平铺块。你好像在移动瓷砖。你想移动相机,而不是你的瓷砖。 SpriteBatch.Begin设置包含相机移动的矩阵时会超载。如果您现在还没有使用Matrix,请致电

Matrix view = Matrix.CreateTranslate(new Vector3( myCam.X, myCam.Y, 0));

并将其作为视图矩阵传递给BeginSprite方法。

这些更改将使您的代码更容易。

希望有所帮助。