ZXDemo

Информация о пользователе

Привет, Гость! Войдите или зарегистрируйтесь.


Вы здесь » ZXDemo » ОБСУЖДАЕМ DEMO » Illusion (X-Trade)


Illusion (X-Trade)

Сообщений 1 страница 11 из 11

1

Illusion (X-Trade)
https://zxaaa.net/screen/illusion.png https://zxaaa.net/screen2/illusion4.png https://zxaaa.net/screen2/illusion6.png

https://zxaaa.net/view_demo.php?id=4407

2

http://speccy.info/Illusion_(демо)

Illusion — демо, разработанное группой X-Trade в 1996 году. Заняло первое место из двенадцати работ на демопати ENLiGHT 1996.
Разработка демо заняла около полутора месяцев. Графика была в основном сконвертирована из различных источников на компьютере Amiga.
Все тексты в демо на английском языке. При упоминаниях текстовых скроллеров в этих текстах используется название FLP.
Музыка из демо была впоследствии использована в первом демо группы Fatality, Nervous (ноябрь 1999), для портативной игровой консоли Game Boy Color.
Шрифт в интро и части со сферическим скроллом взят из демо Technological Death для Amiga, из части с приветствиями.

Описание

Демо можно условно разделить на несколько частей, не требующих нажатия клавиши для перехода между ними. На протяжении всего демо играет одна музыка, но эффекты не синхронизированы с ней (демо не является трекмо).

Интро
Из за правой границы экрана вылетают надписи с названием группы и демо. При вылетании надписи набирают "яркость" с помощью дитеринга, при исчезании рассыпаются на пиксели. Эффект фреймовый. Автор - Dark.
Realtime ball-mapped scroller
Текстовый горизонтальный скролл внутри сферы размером около 64x64 точки. Эффект фреймовый. Автор - Dark.

Two hens and egg
Два спрайта с изображением курицы, между ними на вращающемся в перспективе поле из точек подпрыгивает спрайт яйца. Поле из точек прогибается при падении и отскоке яйца. В конце эффекта поле исчезает, яйцо падает и разбивается. Эффект фреймовый. Автор - LD.

1024 dots
Вариант предыдущего эффекта - спрайтовый мяч прыгает на поле из 1024 точек. Поле не вращается, и через небольшое время после начала эффекта становится текстовым горизонтальным скроллером. Эффект фреймовый. Автор - LD.

Moving shit
Синусоидальное искажение надписи с названием эффекта. Надпись выводится монохромными пикселями удвоенного размера. Эффект не фреймовый, занимает две трети экрана. Автор - Dark.
После этой части показывается картинка, взятая из демо Technological Death для Amiga.

Jumping balls
Летающие по нижним двум третям экрана небольшие (до 8x8 пикселей) спрайты шариков, накладываемые на фоновое изображение по маске. В верхней трети экрана - название демо. Эффект фреймовый. Автор - Dark.

Zoomrotator
Полноэкранное вращение и масштабирование монохромного изображения, выводимого пикселями удвоенного размера. На изображении присутствует ёжик Sonic (известный персонаж серии видеоигр) и надпись с названием демо. Эффект не фреймовый. Автор - Dark.

Textured ball
Текстурированная сфера размером 56x56 точек, внутри которой скроллится изображение. В качестве изображения используется загрузочная картинка игры Robocop (без атрибутов). В нижней части экрана идёт текстовый горизонтальный скроллинг (символы 8x8 точек). Через небольшое время после начала эффекта сфера начинает подпрыгивать на скроллере. Эффект фреймовый. В скроллере приведены характеристики эффекта: скролл - 7000 тактов, текстурированная сфера - около 57000 тактов, музыка - 4500 тактов. Автор - LD.

Credits
Финальная часть - горизонтальный текстовый скроллинг с перечислением авторов демо. Размер символов 16x16 точек. Через некоторое время после начала эффекта скроллинг начинает увеличиваться (до размера полного экрана) и уменьшаться. Эффект фреймовый. Автор - LD.

Авторы

Код: Dark, LD
Конверсия графики: Dark, Dangerous
Музыка: Deni

3

Интроспека специально для зхдемору!

Давно хотел попробовать написать новый тип заметки, специально для кодеров zxdemo.ru и лично ААА. Я хочу попробовать поговорить о внутренних циклах дем, о том, на чём держаться эффекты и об идеях, которые позволяют эти эффекты реализовать. Я не буду лезть в подробности реализации и не дам вам дизассемблер для сборки чего-то выдранного. Только идеи. Только самое интересное.

http://hype.retroscene.org/uploads/images/00/00/05/2017/03/18/6d07a2.png

Ну и поскольку мне нужно с чего-то начать, я хочу начать с Illusion от X-Trade. Мне это демо всегда было симпатично.

Первый эффект в демо, это скроллер натянутый на шар. По сути, этот же самый эффект повторён ближе к концу, там где на шар натянута картинка из робокопа:

http://hype.retroscene.org/uploads/images/00/00/05/2017/03/18/71f8d1.png
http://hype.retroscene.org/uploads/images/00/00/05/2017/03/18/2efc7e.png

Итак, как это делается? У нас в памяти есть чёрно-белая картинка, либо скроллер, либо робокоп, но хранится она в виде байтов (байт на пиксель). Байт = 1 означает «есть пиксель», байт = 0 — «нет пикселя». Это неэкономно по памяти, но позволяет собрать из пикселей новую картинку. В чём идея? Алгоритм рисует сферу горизонтальными полосами вот в таком вот цикле:

Код:
  DUP 8
add a : add (hl)
    DUP ?
    inc l
    EDUP
EDUP
ld (de),a : inc de ; (4+7+4*x)*8+7+6 = 101+32x тактов на байт (в среднем)
   


В HL — наша исходная картинка (байт на пиксель), в DE — буфер для результата, а в А накапливаются пиксели. Т.е. мы идём слева направо, умножаем А на 2 и добавляем в А текущий пиксель. Теперь фокус, почему я написал DUP? — потому что следующий пиксель может быть тем же, может быть действительно следующим, через 1, или даже, когда мы рисуем самый верх или самый низ сферы, через несколько пикселей от предыдущего. Т.е. программа генерирует такой код для вывода сферы заранее, и кол-во INC L вообще говоря всё время меняется, во время движения по сфере. Самое большое что я нашёл — пропуск 4 пикселей, но я не могу сказал что искал так уж старательно, где-то могло быть пропущено и 5.

Насколько эффективный это вывод? Можно предположить, что у нас в среднем один пропущенный байт. Размер шарика — 56 х 56 пикселей. Тогда выходит, что сфера занимает 56*56/8=392 байт экранной памяти, и поэтому выведется за 133*392 ~ 52136 тактов. Если бы пропущенных байтов было в среднем два, вышло бы (133+32)*392 ~ 64680 тактов, что с учётом вывода на экран, плейера (4.5 тысячи тактов) и задержек памяти, уже не влезало бы во фрейм на классике. Плюс вывод буфера на экран и т.д. Фреймовый эффект.

Второй заинтересовавший меня эффект — это большой поточечный скроллер с прыгающим по нему мячом:

http://hype.retroscene.org/uploads/images/00/00/05/2017/03/18/2ff7ad.png

Мячик это конечно спрайт, физика, конечно, ненастоящая. Меня интересовал сам скроллер. Рисуется он в текстуру в памяти, а потом выводится в экран вот таким образом:

Код:
  ld a,(bc) : inc c
DUP 8
pop hl : rla : jr nc,0f
set ?,(hl)
0:
EDUP ; 10+4+7+15 = 36t на пиксель 


В BC — текстура в памяти. Стек настроен на таблицу адресов в экране, куда нужно будет выводить пиксели. Конкретные биты пикселей не меняются (движение батута строго вверх-вниз, движение получено просто сменой таблицы адресов пикселей). Читаем адрес и проверяем, зажжён ли текущий бит, если да — ставим его в экран.

Время вывода одного пикселя — 36 тактов (или меньше, если пиксель погашен), поэтому экран из 1024 пикселей выводится за 1024*36 ~ 36864 тысяч тактов. Заметили, что батут в нижней трети? Значит у нас есть верхний бордер (64 строки на пентагоне), плюс две трети экрана на рисование (ещё 128 строк), т.о. у нас есть до начала отрисовки батута где-то (64+128)*224 = 43008 тактов. Т.е. эффект спокойно успевает в один экран, могли ещё больше точек нарисовать без проблем :)

Теперь, два «главных» эффекта в демо, moving shit и ротосоник:

http://hype.retroscene.org/uploads/images/00/00/05/2017/03/18/d656dc.png
http://hype.retroscene.org/uploads/images/00/00/05/2017/03/18/6d5a2e.png

Идея реализации в обоих случаях одна и та же, стандартная для ротаторов и вобблеров. Мы опять хотим текстуру с пикселем на байт. В случае этих двух эффектов у нас пиксели 2х2, ну т.е. всё равно храним в байте #03 если пиксель есть или #00 если пиксель пустой. В начале кадра нам нужно сгенерировать процедуру, которая будет идти по экрану строго горизонтально, слева направо, и, одновременно — по текстуре. По текстуре идти придётся под углом (чтобы получилось вращение) или вообще по какой-нибудь кривульке, чтобы вышло moving shit. Такая процедура в Illusion выглядит вот так:

Код:
 ld a,(hl)
	inc l : dec h ; эти команды меняются в зависимости как наша линия идёт по текстуре
add a : add a : add (hl)
	inc l : dec h
add a : add a : add (hl)
	inc l
add a : add a : add (hl)
	inc l : dec h
ld (de),a : inc e ; 7+4+4 + 4+4+7+4+4 + 4+4+7+4+4 + 4+4+7+4+4 + 7+4 = 95t на 4 чанка (один байт)    


В HL адрес в текстуре. Чанк 2х2 добавляется в А, а потом мы сдвигаемся по текстуре inc l — влево, dec h — вверх. Конкретные команды пересчитываются каждый фрейм. В DE — адрес буфера в памяти, куда осуществляется вывод. Когда буфер целиком собран, кадр выводится на экран используя стандартный код:

Код:
  pop hl : ld (),hl : ld (),hl ; 10+16+16=42t на 4 экранных байта  


Считаем скорость вывода. Размер экрана в Moving Shit — 128 x 96 чанков, которые обсчитываются за 95*(128*96/4) = 291840 тактов. С учётом времени на вывод из буфера и музыки, это 4-5 фреймов на каждый кадр. У соника вывод на весь экран, поэтому скорость на треть медленнее, 5-6 фреймов на кадр.

Один эффект я что-то не понял — zoomscroller в конце. Там несколько кусков кода, который выглядит не так понятно как примеры выше. Если кто-то может рассказать, как он устроен, буду очень благодарен. На этом всё на сегодня, счастливо и попутного кода :)

4

Интроспектпум48к мозга написал(а):

Один эффект я что-то не понял — zoomscroller в конце. Там несколько кусков кода, который выглядит не так понятно как примеры выше. Если кто-то может рассказать, как он устроен, буду очень благодарен. На этом всё на сегодня, счастливо и попутного кода


Ну ка годбай и Титус обоснуйте интроспеку в чем орех, а то пацан не рубит поляну, ночами не спит переживает.

5

Зумскроллер совсем понятный) Не верю, что он в нем не разобрался)

6

dr.Titus написал(а):

Зумскроллер совсем понятный) Не верю, что он в нем не разобрался)

Помоги парню! Он молод ещё,  ему подсказать некому. Дай совет дня. Хватит в себе держать всеобще звонкий пук. Взорви сцену, напиши обоснование эффекта.

7

Самому разобраться будет полезнее, я думаю. Эффект не сложный, разберется.

8

Что странно: интроспек давно говорил, что не любит олдскул, и тут раритетом заинтересовался. Я туп и необразован, но из описания нихера не пнял.

9

Шыншыл написал(а):

Что странно: интроспек давно говорил, что не любит олдскул, и тут раритетом заинтересовался. Я туп и необразован, но из описания нихера не пнял.


Кодер кодера понять не может по определению.

10

В предпоследнюю ночь перед призывом в 96 году я заменил все тексты в этой демке на свои, перерисовал кое-где графику, назвал дему FUCKING ARMY. На следующий день была отвальная, всем друзьям со двора показал этот высер, напиздел что я такой охуенный программист и съебал в армию. Было придурку 18 лет и у него, очевидно, цвел комплекс неполноценности...

11

Лас написал(а):

В предпоследнюю ночь перед призывом в 96 году я заменил все тексты в этой демке на свои, перерисовал кое-где графику, назвал дему FUCKING ARMY. На следующий день была отвальная, всем друзьям со двора показал этот высер, напиздел что я такой охуенный программист и съебал в армию. Было придурку 18 лет и у него, очевидно, цвел комплекс неполноценности...

Так где эта прекрасная версия?


Вы здесь » ZXDemo » ОБСУЖДАЕМ DEMO » Illusion (X-Trade)