Автор Тема: Небольшое понятие о спрайтах  (Прочитано 634 раз)

Оффлайн jaws

  • Administrator
  • Hero Member
  • *****
  • Сообщений: 10194
  • Karma: +504/-0
    • Просмотр профиля
Небольшое понятие о спрайтах
« : Февраль 15, 2013, 10:41:03 pm »
И так, поговорим о спрайтах или как их еще называют «Передвижные блоки».
Для начала возьмём таблицу регистров для VIC II.
Очень много регистров используется именно для управления спрайтами.
В Commodore 64 есть возможность управлять восемью спрайтами одновременно.
В принципе в таблице регистров указано всё, что нужно для управления спрайтами.
Добавить можно лишь только то, что на каждый спрайт требуется выделять память в компьютере.
Для отдельно взятого спрайта есть свой регистр (ячейка), который указывает в каком месте памяти находится собственно сам спрайт, точнее его битовое выражение.
 
Спрайт 1    2040
Спрайт 2    2041
Спрайт 3    2042
Спрайт 4    2043
Спрайт 5    2044
Спрайт 6    2045
Спрайт 7    2046
Спрайт 8    2047
   

Чтобы компьютер считал спрайт из памяти нужно набрать : POKE 2040,XX (для спрайта 1),
где XX - блок памяти спрайта .
Допустим XX=36, это значит что битовое выражение спрайта начинается с адреса 2304($0900).
Получили мы этот адрес очень просто: 36х64=2304.
Т.е. адрес должен быть кратен 64. Можно задать другой адрес, например 40 (POKE2040,40),
тогда  блок спрайта будет начинаться с адреса 40х64=2560($0A00).

Рисовать спрайты можно различными способами.
Можно «спрайт мейкерами».
Можно поглумиться и нарисовать на бумажке, переводя в битовые значения.
Я по привычке рисую при помощи FINAL CARTRIDGE III, так как он имеет встроенный монитор,
который в свою очередь имеет возможность выводить, как символьные так и спрайтовые значения.


Теперь приступим к созданию спрайта.
В Commodore 64 на спрайт выделяется 63 байта или 504 бита:
по горизонтали - 24 бита, по вертикали - 21 бит.
Соответственно блок спрайта выглядит следующим образом:

128 64 32  16  8   4   2   1 128 64 32 16   8   4   2   1 128 64 32 16   8   4   2   1

  0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0
  0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0
  0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0
  0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0
  0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0
  0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0
  0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0
  0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0
  0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0
  0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0
  0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0
  0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0
  0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0
  0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0
  0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0
  0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0
  0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0
  0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0
  0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0
  0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0
  0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0
 
Если Вы обратите внимание, то увидите, что по горизонтали спрайт занимает 3 ячейки памяти, а по вертикали - 21 ячейку, из чего мы получаем 63 байта (ячейки) по 8 бит.


Теперь давайте чего-нибудь нарисуем:

 128 64 32 16  8   4   2   1 128 64 32 16   8   4   2   1 128 64 32 16   8   4   2   1

  0   0   0   0   0   0   1   1   1   1   1   1   1   1   1   1   1   0   0   0   0   0   0   0
  0   0   0   0   0   1   0   0   0   0   0   0   0   0   0   0   0   1   0   0   0   0   0   0
  0   0   0   0   1   0   0   0   0   0   0   0   0   0   0   0   0   0   1   0   0   0   0   0
  0   0   0   1   0   0   1   1   0   0   0   0   0   0   0   1   1   0   0   1   0   0   0   0
  0   0   0   1   0   0   1   1   0   0   0   1   0   0   0   1   1   0   0   1   0   0   0   0
  0   0   0   1   0   0   0   0   0   0   0   1   0   0   0   0   0   0   0   1   0   0   0   0
  0   0   0   1   0   0   0   0   0   0   0   1   0   0   0   0   0   0   0   1   0   0   0   0
  0   0   0   1   0   0   0   0   0   0   0   1   0   0   0   0   0   0   0   1   0   0   0   0
  0   0   0   1   0   0   0   1   0   0   0   0   0   0   0   1   0   0   0   1   0   0   0   0
  0   0   0   1   0   0   0   0   1   0   0   0   0   0   1   0   0   0   0   1   0   0   0   0
  0   0   0   1   0   0   0   0   0   1   1   1   1   1   0   0   0   0   0   1   0   0   0   0
  0   0   0   0   1   0   0   0   0   0   0   0   0   0   0   0   0   0   1   0   0   0   0   0
  0   0   0   0   0   1   0   0   0   0   0   0   0   0   0   0   0   1   0   0   0   0   0   0
  0   0   0   0   0   0   1   1   1   1   1   1   1   1   1   1   1   0   0   0   0   0   0   0
  0   0   0   0   0   0   0   0   0   1   0   0   0   1   0   0   0   0   0   0   0   0   0   0
  0   0   0   0   0   0   0   0   0   1   0   0   0   1   0   0   0   0   0   0   0   0   0   0
  0   0   0   0   0   0   0   0   0   1   0   0   0   1   0   0   0   0   0   0   0   0   0   0
  0   0   0   0   0   0   0   0   0   1   0   0   0   1   0   0   0   0   0   0   0   0   0   0
  0   0   0   0   0   0   0   0   0   1   0   0   0   1   0   0   0   0   0   0   0   0   0   0
  0   0   0   0   0   0   0   0   0   1   0   0   0   1   0   0   0   0   0   0   0   0   0   0
  0   0   0   0   0   0   1   1   1   1   0   0   0   1   1   1   1   0   0   0   0   0   0   0
 
Насколько Вы поняли 1 это включенный бит, а ноль выключенный (для наглядности).

В мониторе финала 3 -  точка выключенный, звёздочка включенный бит.
В различных спрайт мейкерах, как правило, полностью закрашенный квадратик или пустота.
Также Вы можете написать бейсик программу для размещения спрайта в нужной области, используя READ и DATA утверждения или только POKE.
Рассматривая первые три байта можем заключить следующее:
(для блока 36 ($0900))

POKE 2304,3:POKE2305,255:POKE2306,128

ну и так далее.

Допустим мы разместили спрайт в 36-ом блоке или с адреса 2304($0900).

Всё, что нужно для того, чтобы увидеть спрайт на экране - это набрать следующее:

POKE 2040,36               считывание спрайта 1 с 36 блока ($0900)
POKE 53269,1               включение спрайта 1
POKE 53248,170           Х координата для спрайта 1
POKE 53249,135           Y координата для спрайта 1

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

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

Также, как я говорил раннее, экспериментируйте.
Таблица регистров ВИКа имеет всю необходимую информацию.

Кое-какую инфу добавлю чуть позже, для завершения темки.
Ну и демо проги небольшие.
« Последнее редактирование: Февраль 17, 2013, 12:01:53 pm от jaws »