GBA ASM - День 14: Фоновые эффекты

Дата публикации 31 авг 2006

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

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

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

Мозаика

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

Код (Text):
  1.  
  2. ;инициализируем регистр мозаики
  3. ldr r4,=REG_MOSAIC
  4. ldr r3,=0x0012  ; 1 для горизонтальной, 2 для вертикальной или ничего для спрайтов.
  5. str r3,[r4]   ; сохраняем
  6.  
  7. ldr r2,=REG_BG2CNT  ; BG 2. Если вы используете другой фон, измени номер!
  8. ldr r3,[r2] ; загружаем в r3 значение из памяти, на что указывают '[' и ']'
  9. ; код выше загружает в r3 атрибут 0 и атрибут 1 одновременно, так как CPU-регистры
  10. ; 32-х битные, а OAM-атрибуты 16-ти битные.
  11. eor r3,r3,BG_MOSAIC_ENABLE   ; XORим r3 с BG_MOSAIC_ENABLE и помещаем значение в r3.
  12. ; EOR и XOR - это одно и то же, главное помните, что сама инструкция называется EOR.
  13. str r3,[r2]  ; сохраняет измененные значение обратно в память.

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

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

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

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

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

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

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

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

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

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

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

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

Код (Text):
  1.  
  2. ;;--- НАЧАЛО КОДА ---;;
  3. ldr r1,=70<<16|70
  4. ldr r2,=REG_BG2PA     ; этом поместит значение 70 в PA и PB.
  5. str r1,[r2]
  6.  
  7. ldr r1,=70<<16  ;
  8. ldr r3,=0             ; этот код
  9. sub r3,r3,70          ; помещает в r3 PC и PD
  10. mov r3,r3,lsl 16      ; в r3 - отрицательное число, поэтому нам нужно переместить
  11. mov r3,r3,lsr 16      ; его в нижние биты регистра (70 находится в верхних).
  12. orr r3,r3,r1          ; Дальше OR'им вместе и сохраняем полученное значение в PC.
  13. ldr r2,=REG_BG2PC    
  14. str r3,[r2]
  15. ;;--- КОНЕЦ КОДА ---;;

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

Вставляйте, компилируйте и запускайте! © Mike H, пер. Aquila


0 794
archive

archive
New Member

Регистрация:
27 фев 2017
Публикаций:
532