GBA ASM - День 14: Фоновые эффекты — Архив WASM.RU
Какие именно эффекты?
Как и вчера, мы рассмотрим следующее: мозаику, вращение и масштабирование. Правда, что касается вращения, я не буду рассказывать о SIN() и COS() - мы только обсудим, где и что именно нужно вставить в данных вращения/масштабирование, а остальное вам придётся додумать самим.
Мозаика
Регистр мозаики находится по адресу 0x400004C. Он 16-ти битный - биты 0-3 предназначаются для вертикальной мозаики, а 7-4 - для горизонтальной. Другие биты предназначаются для спрайтов. Кроме инициализации REG_MOSAIC нам также потребуется указать соотвествующий CNT-регистр. Вот код, в котором предполагается, что фон уже отображён:
Код (Text):
;инициализируем регистр мозаики 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 (или что я там использовал для метки бесконечного цикла):
Код (Text):
;;--- НАЧАЛО КОДА ---;; 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, что нам нужно вращение, мы просто задаём значения и фон вращается.
Вставляйте, компилируйте и запускайте! © Mike H, пер. Aquila
GBA ASM - День 14: Фоновые эффекты
Дата публикации 31 авг 2006