GBA ASM - День 14: Фоновые эффекты — Архив WASM.RU

Все статьи

GBA ASM - День 14: Фоновые эффекты — Архив WASM.RU

Какие именно эффекты?

Как и вчера, мы рассмотрим следующее: мозаику, вращение и масштабирование. Правда, что касается вращения, я не буду рассказывать о SIN() и COS() - мы только обсудим, где и что именно нужно вставить в данных вращения/масштабирование, а остальное вам придётся додумать самим.

Мозаика

Регистр мозаики находится по адресу 0x400004C. Он 16-ти битный - биты 0-3 предназначаются для вертикальной мозаики, а 7-4 - для горизонтальной. Другие биты предназначаются для спрайтов. Кроме инициализации REG_MOSAIC нам также потребуется указать соотвествующий CNT-регистр. Вот код, в котором предполагается, что фон уже отображён:

;инициализируем регистр мозаики
ldr r4,=REG_MOSAIC
ldr r3,=0x0012  ; 1 для горизонтальной, 2 для вертикальной или ничего для спрайтов.
str r3,[r4]   ; сохраняем

ldr r2,=REG_BG2CNT  ; BG 2. Если вы используете другой фон, измени номер!
ldr r3,[r2] ; загружаем в r3 значение из памяти, на что указывают '[' и ']'
; код выше загружает в r3 атрибут 0 и атрибут 1 одновременно, так как CPU-регистры 
; 32-х битные, а OAM-атрибуты 16-ти битные.
eor r3,r3,BG_MOSAIC_ENABLE   ; XORим r3 с BG_MOSAIC_ENABLE и помещаем значение в r3.
; EOR и XOR - это одно и то же, главное помните, что сама инструкция называется EOR.
str r3,[r2]  ; сохраняет измененные значение обратно в память.

И вуаля! У вас получился фон с эффектом мозаики.

*Думаю, понятно, что это совсем как День 13, просто отредактированный для работы с фоном.*

Вращение (здесь вставьте торжественную музыку!)

Я надеюсь, что вы хотя бы прочитали День 4 из C-туториала на ThePernProject.COM, так как в противном случае объяснить будет гораздо сложнее. Идите и прочитайте его.

...
...
Прочитайте ещё раз :).
...
...

Думаете, вы всё поняли? Если нет, то не страшно, так как я всё равно попытаюсь это объяснить.

Хотя всего соответствующих регистров 4, нам потребуются только PA и PC, куда мы будем сохранять параметры вращения. Обратите внимание, что иногда фон можно увращать куда-нибудь за пределы видимости.

(Далее я объясню только вращение фон (что очевидно).)

  • REG_BGxPA должен содержать косинус угла.
  • REG_BGxPB должен содержать синус угла.
  • REG_BGxPC должен содержать отрицательный синус угла.
  • REG_BGxPD должен содержать косинус угла.

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

Давайте начнём писать код!

Мы будем основываться на коде из Дня 9, поэтому если вы уже забыли, о чём там говорилось, вы можете прочитать его ещё раз. Никогда не бывает лишним что-нибудь перечитать. Поэтому вставьте следующий код между последней строкой и метрой infin (или что я там использовал для метки бесконечного цикла):

;;--- НАЧАЛО КОДА ---;;
ldr r1,=70<<16|70
ldr r2,=REG_BG2PA     ; этом поместит значение 70 в PA и PB.
str r1,[r2]

ldr r1,=70<<16  ;
ldr r3,=0             ; этот код
sub r3,r3,70          ; помещает в r3 PC и PD
mov r3,r3,lsl 16      ; в r3 - отрицательное число, поэтому нам нужно переместить
mov r3,r3,lsr 16      ; его в нижние биты регистра (70 находится в верхних).
orr r3,r3,r1          ; Дальше OR'им вместе и сохраняем полученное значение в PC.
ldr r2,=REG_BG2PC     
str r3,[r2]
;;--- КОНЕЦ КОДА ---;;

Это примерно так же, как и для спрайтов, не считая того, что нам не нужно указывать в соответствующем REG_BGxCNT, что нам нужно вращение, мы просто задаём значения и фон вращается.

Вставляйте, компилируйте и запускайте!

2002-2013 (c) wasm.ru