Боковая прокрутка карты тайлов, карта запуталась - PullRequest
2 голосов
/ 06 декабря 2011

Я успешно сгенерировал свою карту тайлов, и она работает, но когда я хочу прокрутить ее, верхняя линия тайлов перемещается, и все тайлы перетаскиваются на экран. Трудно объяснить,

Представьте, что это плитки: 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. Уменьшается при удерживании левой кнопки на клавиатуре.

Вот карта тайлов, которую я рисую из массива (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 ]

4 голосов
/ 06 декабря 2011

Похоже, что вы всегда рисуете все плитки на всей вашей карте (я начинаю с 0 и перебираю все плитки). Однако вы не всегда рисуете одинаковое количество плиток в каждом ряду. Если CameraX равен 0, то вы будете рисовать 28 плиток на строку, потому что вы перейдете к следующей строке после 32 * 28 (896) пикселей. Но если CameraX 480, то вы будете рисовать только 13 ((896-480) / 32) плиток в каждом ряду, а остальные плитки первого ряда будут рисовать во втором ряду (потому что вы все еще пытаетесь нарисовать все плитки). Я думаю, что вы должны циклически проходить по каждой строке и столбцу, которые вы хотите нарисовать, и рассчитывать индекс плитки по ним вместо того, чтобы циклически проходить по каждой плитке на карте и вычислять позицию независимо.

EDIT Ниже приведен пример кода для расчета индекса плитки в одномерном массиве с учетом индекса столбца и строки в предположении, что вы знаете количество столбцов. (Или вы можете просто переключиться на использование двумерного массива):

i = row * columnCount + column;
1 голос
/ 06 декабря 2011

Я не совсем понимаю ваш код, но я советую вам использовать двумерный массив или обращаться к одномерному массиву надлежащим образом, как array[ Y * ARRAY_Width + X].Кроме того, почему вы начинаете свой цикл по всему уровню.Важно то, что находится внутри камеры, иначе вы будете выполнять итерацию по множеству плиток, которые все равно не видны.

Начните с камеры X и Y, подсчитайте, сколько горизонтальных и вертикальных плиток вы рисуете в области просмотра камеры:быть единственными плитками, которые вам нужно перебрать.Также кажется, что вы перемещаете плитки.Вы хотите двигать камеру, а не ваши плитки.SpriteBatch.Begin имеет перегрузку для установки матрицы, содержащей движение вашей камеры.Если вы сейчас не знаете, как работать с Matrix, просто вызовите

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

и передайте это в качестве матрицы представления в метод BeginSprite.

Эти изменения значительно облегчат ваш код.

Надеюсь, это поможет.

1 голос
/ 06 декабря 2011

Я считаю, что ваша проблема в том, что, когда вы добираетесь до конца строки, вы устанавливаете CameraX на 0.

Вы не хотите перемещать камеру в конце каждой строки, вы просто хотите сбросить положение рисования х (как вы делаете в следующей строке).

Итак, удалите cameraX = 0;

Я не уверен на 100%, что вызвало бы описанную вами проблему, но это определенно неправильно, как вы говорите, игрок контролирует cameraX, поэтому его не следует изменять в вашей функции рисования.

...