SGDK. Сколл слоя, тайлов, линий.

Перед прочтением данной статьи, прочтите SGDK. Создание изображения.

Предисловие.

В этом уроке мы рассмотрим все 3 способа скролла в SGDK. И т.к. все 3 способа, используют одну и ту же функцию VDP_setScrollingMode, я решил написать о них в одном уроке.

Перед началом, скачайте файлы проекта с MEGA.

Что-ж, приступим.

Передвигаем слой.

Откройте PlaneScroll/out/rom.bin.

Данная сцена, сделана с помощью скролла одной картинки.

та самая картинка

Теперь, разберем код. Для этого, откройте в проекте PlaneScroll файл main.c.

s16 x_offset = 0;

Хранит смещение слоя по оси x.

VDP_setPlaneSize(32,32, TRUE);

VDP_setPlaneSize — указывает размер слоя в тайлах. Синтаксис у него следующий.

VDP_setPlaneSize(ширина_в_тайлах,высота_в_тайлах, оптимизация_VRAM);
  • ширина_в_тайлах — задает ширину слоя (доступны значения 32, 64, 128)
  • высота_в_тайлах — задает высоту слоя (доступны значения 32, 64, 128)
  • оптимизация_VRAM — если TRUE, то тайловые карты, будут автоматически распределятся по VRAM в зависимости от размера слоя.

Таким образом, мы установили размер слоя в 256×256 px или 32×32 тайла (1 тайл = 8×8 px).

VDP_setScrollingMode(HSCROLL_PLANE, VSCROLL_PLANE);

Здесь, мы устанавливаем режим скролла, по следующему синтаксису.

VDP_setScrollingMode(горизонтальный_скролл, вертикальный_скролл)

У горизонтального скролла есть следующие режимы:

  • HSCROLL_PLANE — скролл слоя.
  • HSCROLL_TILE — скролл тайлов.
  • HSCROLL_LINE — скролл линий.

В то время как у вертикального:

  • VSCROLL_PLANE — скролл слоя.
  • VSCROLL_2TILE — скролл мета-тайла (1 метатайла = 4 тайла = 16×16 px)
VDP_setScrollingMode(HSCROLL_PLANE, VSCROLL_PLANE);

В данном примере, мы установили горизонтальный и вертикальный скролл слоя.

VDP_setHorizontalScroll(BG_A, x_offset);

Здесь, с помощью функции VDP_setHorizontalScroll, установили слой для скролла (BG_A) и смещение x_offset.

По вертикали скроллим точно так же, только вместо VDP_setHorizontalScroll используется VDP_setVerticalScroll

x_offset += 10;
if(x_offset > 256) {
	x_offset -= 256;
}

Смещение увеличивается каждый кадр на 10 пикселей. Что-бы смещение не увеличивалось до бесконечности, я ограничил числом 256 (размер слоя по оси x).

Со скроллом слоя разобрались, переходим к скроллу тайлов.

Двигаем тайлы.

В проекте TileScroll откройте rom.bin.

Здесь происходит вертикальный скролл мета-тайлов (тайл 16×16 px).

Теперь, разберем код в main.c.

VDP_setScrollingMode(HSCROLL_TILE , VSCROLL_2TILE);

Установили способ скролла, на тайловый. По оси x скроллим тайлы, по оси y скроллим мета-тайлы (такого ограничение SGDK).

VDP_setVerticalScrollTile(BG_A, 3, offset_mask, 6, CPU);

VDP_setVerticalScrollTile — отвечает за вертикальное скролл тайлов. Синтаксис здесь следующий.

VDP_setVerticalScrollTile(слой, начальный_тайл, маска, конечный_тайл, способ_передачи);
  • Слой — это слой который будем скроллить (BG_A или BG_B)
  • Начальный тайлмета-тайл по оси x, начиная с которого будет применятся маска.
  • Макса массив значений, хранящий скорость скролла мета-тайлов.
  • Конечный тайл — последний мета-тайл.
  • Способ передачи — принимает значения (CPU, DMA, DMA_QUEUE, DMA_QUEUE_COPY)

Посмотрите на маску.

s16 offset_mask[6] = {0,5,10,15,20,25};

А теперь на анимацию.

  • В 3-ем мета-тайле, скорость равна 0.
  • Во 4-ом равна 5
  • А, в 5-ом равна 10
  • В VDP_setVerticalScrollTile мы указали что, маска будет применятся с 3-его мета-тайла, что и видим на анимации.
for(i = 0; i < 6; i++) offset_mask[i] = offset_mask[i]+i;

Данный цикл, двигает двигает смещение всех тайлов.

Вертикальный скролл тайлов разобрали, теперь замените эту строку.

VDP_setVerticalScrollTile(BG_A, 3, offset_mask, 6, CPU);

На эту. Агументы те же самые, только название функции другое.

VDP_setHorizontalScrollTile(BG_A, 3, offset_mask, 6, CPU);

И скомпилируйте.

Как видите, логика тут та же самая. Только вместо мета-тайлов, используются тайлы, и скролл горизонтальный.

Перейдем к скроллу линий.

Перемещаем линии.

Откройте в проекте LineScroll файл rom.bin

Скролл линий на случайное расстояние

Теперь, откройте main.c. Разберем его.

s16 offsetMaskLine[224]; 

Как и со скроллом тайлов, нам понадобится маска, в данной макске, будут хранится смещения всех линий на экране.

for(int i=0; i< 224; i++)
  offsetMaskLine[i] = 0;

Заполняем массив нулями.

VDP_setScrollingMode(HSCROLL_LINE, VSCROLL_PLANE);

Устанавливаем режим скролла, на скролл линий (HSCROLL_LINE).

VDP_setHorizontalScrollLine(BG_A, 0, offsetMaskLine, 224, CPU);

И скроллим линии, синтаксис тут тот же, что и с тайлами. Только вместо тайлов, используются линии.

for(int i=0; i< 224; i++)
  offsetMaskLine[i] += random() % 10;

В этом цикле, я каждую линию сместил на случайное число, от 0 до 9.

Теперь, закоментируйте цикл выше, и раскоментируйте другой цикл.

for(int i=0; i <= 224; i+=2) {
  offsetMaskLine[i] += 1;
  offsetMaskLine[i-1] -= 1;
}

Данный цикл, перемещает:

  • четные линии — враво
  • нечетные — влево

В итоге, получили такой эффект.

Заключение.

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

Итоговый результат.