Из журнала Adventurer#15, Ярославская область, г.Рыбинск, ? More Colours! Poisoned Cyberjack/TriebkraftNE Больше цвета!!! poisoned cyberjack//triebkraftNE Пытаясь сделать что-нибудь впе- чатляющее для нашей демы WeeD, я даже и не ожидал, что получится так неплохо. Многие подходили ко мне с вопросом - мультиколор или как? Между тем все просто -это всего на всего полноэкранная цветная анимация :) Правда, непло- хо запакованная, но все же... Буйство цвета, видимое на экране - результат не движка, а правильно сделанной оригинальной картинки. Как это сделать, лучше спрашивать не у меня, а у G.D.//tbk//4d, кото- рый все это рендерил в lightwave 7.5 на пц. После чего я их конвер- тировал из avi'шников при помощи BMP2SCR_1.75 by LCD. И лишь с по- лученными после этого спектру- мовскими цветными экранами я работал... Вот в принципе и все, что мне тре- бовалось вам рассказать :) Но по поводу хорошего настроения я расскажу еще и об своем пакере... В деме за небольшое время пока- зывается 198 цветных полноэкран- ных скринов. Все это занимает 1.368.576 байт в не пакованном ви- де и около 290К в zip'е (hrust при- мерно так же жмет). Если запако- вать laser compact'ом будет нем- ного меньше, что не играет боль- шой роли, так как все равно это очень и очень много. Поэтому ис- пользуется свой пакер, который сжал эти 198 экранов в 80К, то есть каждый экран в среднем за- нимает 400 байт!!! Пускай и с поте- рей качества :) Идею подкинул diver//4d в дале- ком 2001 году - а почему бы не сов- местить hi-res и low-res, пиксель- ную графику и атрибуты в самом движке, получив много цвета и бо- льшую скорость. Реализовать это до конца я не смог до сих пор (хотя не буду смешить народ, дока- зывая, что занимаюсь этим с ночи до утра). А теперь немного истории... Пару лет назад у diver'а созрела мысль сделать дему, абсолютно невидан- ную на спектруме. Выжать из спектрума все, что можно - при- чем без мультиколора, все за счет различных извратов с совмеще- нием low-res и hi-res, атрибутов и пикселов. Ведь не забывайте, что именно в этом и заключена вся мощь спектрума - иначе он проиг- рал бы на старте другим компью- терам, которые вышли позже и по многим параметрам обставляли наш zx. Из-за довольно высокого разрешения, цветного экрана и очень высокой скорости обновле- ния экрана (пускай скорость не ве- лика, но и объем-то небольшой) за- падные авторы и делали игры до се- редины 90х годов, хотя многие ос- тальные домашние компьютеры были уже мертвы. А сейчас эта фишка практически не использу- ется - либо работают только с пик- селами (вектора, точки, чанки 4х4), либо с атрибутами, но опять же как с чанками (8х8, мультико- лоры всяческие). Реально же сов- мещение не используется практи- чески никогда - слишком сложно все это кодится и слишком для спе- цифических целей это можно испо- льзовать. Но у diver'а голова ва- рит неплохо, и он смог придумать много идей (правда из которых бо- льше половины, на мой взгляд реа- лизовать нельзя :). Но дема у нас не заладилась, как из-за нашей за- нятости (Harm demo, Moorhuhn game), так и из-за того, что Леха в данный момент находился в армии... Про идейки эти я не забывал, но ру- ки никак не доходили довести все это до ума. И вспомнил об этом лишь в этом году, во время доде- лывания нашей весенней вещи Det- roYT. Не хватало эффекта в сере- дину - вернее идея была, но кодить было некогда, а на анимашку не хватало памяти. Немного пому- чавшись, я поднял свой недописан- ный чанковый энжин, обрезал все замашки на реалтаймовый кальку- ляйтинг, пофиксил все баги, пере- делал под 2 цвета, и как результат посмотрите часть с летающими шестеренками. Для сведения - 230 экранов заняли 22.5К. Практически тогда же в апреле и родилась идея - сделать цветную анимашку. Но возник ряд труднос- тей - энжин из DetroYT'а под цвета переделывался неохотно, паковка получалась никакая, да и скорость распаковки упала ниже 5 фреймов (установленный нами порог). Поэ- тому я плюнул слюной на все это мучение с распаковкой чанков, геморрой с c2p, и сделал все так просто, насколько можно - просто-напросто запаковал все эк- раны :) правда, для этого я все же воспользовался теми же чанками, поэтому нечто от того подхода ос- талось... Идея этого мифического чанково- го движка в принципе проста, хотя и извратна до кучи. Мы отстраи- ваем экран в чанковый буфер (то есть без всякой маеты с адреса- цией экрана и работы с битами) 1х1 или 2х2 (я выбрал этот вариант как более оптимальный по скорости и объему данных - chanky 2x2 roxx!!!). Но так как это сделать в чистом виде нельзя (почему не спрашивайте - и так все ясно), то пришлось извратиться - обрабаты- вать экран в два прохода. На пер- вом проходе мы обсчитываем толь- ко цвета вершин -сетку 33х25 зна- комест. Для крупных цветных ве- щей получится много (больше по- ловины точно) знакомест, в кото- рых все четыре вершины будут од- ного цвета. Такие знакоместа c2p просто закрашивает этим цветом через установку нужных атрибутов и забывает про них. Все же осталь- ные надо детализировать -обсчи- тывать ребра знакомест (в моем случае с шагом 2 пикселя), после этого находим нужный чанк (или спрайт - как вам проще для пони- мания), который и выводим в этом знакоместе на экране. С цветом сложнее - но я решил брать цвета первых двух вершин и не пари- ться... Вот так кратко изложена идея нового полноцветного чудо-движка, который не реализо- ван до сих пор :))) Доделать все это до ума не хватило времени и желания (лень -вечный отмаз :) Единственное, что я сде- лал почти до конца - это нарисовал чанки (можно было бы и сгенерить, но наш принцип handmade :) Основ- ная проблема связана с вторичным проходом по чанковому экрану - слишком уж заумно все выходит :((( Поэтому невиданным реалтай- мом в наших последних демах и не пахнет -просто очень крюютая па- ковка... В DetroYT'е сделано так: распако- вывается сетка цветов для вершин знакомест. Затем по четырем вер- шинам знакоместа определяется, какой тип спрайта надо рисовать. Получается 16 типов спрайтов, при- чем сразу скажу, что два я не ри- совал совсем (вместо них были черные знакоместа :), а два это просто-напросто знакоместа зак- рашенные paper=ink. Осталось 12 видов спрайтов, для каждого из ко- торых я руками нарисовал по 16 спрайтов. Номер спрайта (4 бита) достается из пакованных данных. Объяснять что, почему и как, по- жалуй не буду :) Прилагается экран, на котором эти спрайты на- рисованы. Кому очень уж инте- ресно - обращайтесь ко мне. В WeeD'е никакой сетки нет, ника- кого определения тоже нет. Для каждого знакоместа после распа- ковки получаем цвет и, если надо, номер спрайта. Спрайты рассчиты- вать или перерисовывать мне было немного непонятно как, поэтому были взяты спрайты из предыдуще- го продукта. Именно поэтому их не 256, а 163 :) Почему не 192? Пото- му что некоторые из них слегка одинаковые (читай -полностью), и я их со спокойной душой выкинул... Определение типа и номера спрай- та на этапе паковки тоже упро- щено. На цвета вершин вообще не обращается никакого внимания, все обсчитывается банальным пе- ребором всех вариантов. Спрайт, у которого минимальное количество несовпадающих пикселов, и счита- ется нужным. В принципе это ло- гично, но это машинная логика - человек бы выбрал хотя бы подхо- дящий по форме... В приложении вы сможете найти два исходника. MY_BATCH - мой личный исходник, предназначен- ный для сборки демы. В таком виде он и использовался. Что к чему - no comments, сделано все для своих нужд. COLORFULL - исходник, максимально приведенный к куль- турному виду (насколько это воз- можно). Комментарии я писал уже сейчас, поэтому сильно не смей- тесь. Также не обращайте особого внимания на ужасающий код - ра- ботает, и это главное! Не знал же я, в самом деле, что это кому-то понадобится :) Оба исходника в формате Storm As- sembler by X-Trade. Как быть пок- лонникам других асмов я не знаю, так как конвертация практически невозможна. А я по-другому сей- час писать уже не могу :((( Пускай вас не смущает многократ- ное повторение некоторых строк в некоторых местах :) Раскрытие внутренних циклов плохо сказыва- ется на объеме и модифицируе- мости кода, зато очень хорошо на скорости и читабельности, упро- щает кодинг в конце концов - а иногда просто регистров не хва- тает... Перед упаковкой вызывается про- цедура Check, которая приводит экран в нужный вид для пакера - все пустые знакоместа закраши- вает ink=paper. В связи с особен- ностями пц-конвертора bmp2scr полностью залитые знакоместа не ищутся, ибо они не получаются ни- когда. Еще есть одна хитрость... В некото- рых знакоместах могут находи- ться 1-2 пикселя. Подходящие (разумно) спрайты находятся не всегда, в результате получаются различные глюки на экране. На момент пати-версии я обошел это добавлением в спрайтовый набор двух спрайтов - полностью пустого и полностью залитого, хотя это и не особо помогло - избранные то- варищи, видевшие данное тво- рение, это подтвердят. После пати же я написал нормальный оптими- затор, который такие знакоместа просто очищает. Процедура Optim - это все и делает. Параметр P_min как раз и задает количество пик- селов, меньше которого знакомес- то очищается. Так как проверка идет как в меньшую сторону, так и в большую (1-2 и 62-63 пикселя для p_min=2), то установка параметра равным 32 превратит всю картинку в чистые атрибуты. Некоторым нра- вится :))) Check и Optim делают немного пе- ресекающуюся работу, но исправ- лять я уже не стал. Также применен простенький rle-пакер со странной логикой. Блок пакованных данных представ- ляет собой непрерывное битовое поле, в котором содержатся ко- манды и их аргументы. Команды 2хбитовые, соответственно их це- лых 4 штуки: 00 - новый цвет, 3b - код цвета 01 - спрайт, 8b - номер спрайта 10 - цепочка, 4b - длина цепочки 11 - одиночное залитое знакоместо Чуть подробнее... Работа с цветом идет так - у нас есть два цвета, paper и ink. Команда "новый цвет" задает новое значение ink, а paper становится равным старому ink. Такая схема оказалась наиболее выгодной. Спрайт... Рисуется спрайт с нужным номером, цвет задается текущими цветами. Оди- ночное залитое знакоместо - ink=paper_current, paper=paper_current, при этом текущие цвета не меняются. Це- почка - последовательность зали- тых знакомест. Длина задается че- тырьмя битами, это число подобра- но опытным путем, более меньшую или большую разрядность оказа- лось использовать невыгодно. Алгоритм паковки я описал, распа- ковка аналогична. Вся работа идет с данными, структура которых при- ведена выше. Можно написать по-своему, ничуть не удивлюсь, если будет проще и быстрее, чем у меня. Просто нас полностью устро- ило сие творение - скорость паков- ки невысока, но не каждые же пять минут надо что-нить запаковы- вать, а распаковка еще лучше - ук- ладывается в 3 фрейма при нашей задержке в 5. А все знают, что лучшее враг хорошего :) В приложении кроме вышеупомяну- тых исходников вы найдете неско- лько скринов для тестинга, а в ка- честве бонуса небольшую прог- раммку, демонстрирующую дан- ный метод паковки/распаковки специально для тех, кто не видел нашей демы :))) wbw, poisoned cyberjack/ /triebkraftNE