Перед прочтением данной статьи, прочтите 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 в зависимости от размера слоя (лучше ставить TRUE, чтобы случайно не получить мусорные тайлы на слое)
Таким образом, мы установили размер слоя в 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_COLUMN — скролл мета-тайла (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_COLUMN);
Не используйте данный способ, если собираетесь скроллить по оси X (или воспользоваться MAP_scrollTo), иначе получите колонну мусорных тайлов.
Это баг самой Sega Genesis, поэтому фикса не ждите. А теперь, продолжим.
Установили способ скролла, на тайловый. По оси x скроллим тайлы, по оси y скроллим мета-тайлы (такое ограничение SGDK и Sega Genesis соотвественно).
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;
}
Данный цикл, перемещает:
- четные линии — враво
- нечетные — влево
В итоге, получили такой эффект.
Заключение.
Вот и закончился данный урок, если есть какие либо пожелания по выпуску статей, пишите их в комментариях. Также, в данной серии уроков, я вас плавно подвожу к созданию платформера, и со следующего урока, уже начнем над этим работать, а именно, научимся скроллить карту.