Inferno
#02
01 мая 2001 |
|
Gameland - Как написать игру. Том 3. Часть первая.
Как написать игру. Том 3 Часть вторая (c) Дронов Константин Пункт 4: Спецэффекты ... да здесь слож- но что-либо сказать конкретное, но поп- робуем. Поговорим о двух спецэффектах. Сразу оговорюсь, как правило в растровой графике все спецэффекты сводяться к за- ранее просчитаной анимации, но я расска- жу о том, что делается без анимации и используется в 3D играх, но с натягом применимо и у нас в 2D. 1. Освещение в реальном времени. Мы не будем останавливаться на стати- ческом освещении, так как оно и так по- нятно задается заранее примером может служить освещение из DOOM'а, но там кро- ме статического есть и подобие динами- ческого от выстрелов. Но и здесь мы рас- смотрим лишь простой способ динамическо- го освещения. Свет в игре, как правило, представлен в виде статических изображений. Но как быть со светом от выстрелов или факела ? А очень просто, разумеется сделать даже более менее реалистичную картинку без трассировки лучей невозможно, кое-как же раскрасить картинку можно. К примеру, свет распространяется во все стороны, но по окружности. То есть и вы создаете из- менение света расчитывая по формулам: X := SIN a * R Y := COS a * R где X,Y - координаты, a - угол, R - ра- диус Изменяя R мы получим траекторию измене- ния интенсивноси света. Можно заранее составить таблицу значений в памяти и работать с ней не тратя время на расчет. Длина окружности в пикселях должна под- бираться в ручную на максимальном ра- диусе. Радиус же подберите исходя из изменения интенсивности света, которую вы будете задавать. Например, максималь- ная интенсивность 64, значить радиус бо- лее 64 не особо нужен (хотя это правиль- но не для цветного освещения, в котором нужно учитывать не одну а три состов- ляющих цвета). 1.пусть a=0-угол , l-интенсивнoсть све- та, m-длина окружности в пикселах, c- интенсивность в предидущей точке, k=1- выбраный вами коэффициент, Xy/Yy-центр источника света 2.пусть r=0-радиус, c=l 3.берем данные X,Y (по формулам или из таблицы, если из таблицы то лучше если бы таблица выглядела так: угол a ┌─── радиус r │┌────────── ││ X00,Y00,X01,Y01,X02,Y02,... ...,X0r,Y0r X10,Y10,X11,Y11,X12,Y12,... ...,X1r,Y1r ....................................... Xa0,Ya0,Xa1,Ya1,Xa2,Ya2,... ...,Xar,Yar ...) 4.u=цвет точки в координате X+Xy,Y+Yy 5.c=c-k 6.u=c+u или попробуйте так u=(c+u)/2, что даст интересный результат, но тогда исключите пункт 5. Это позволит эмулиро- вать тень, чем выше объект тем ниже его цветовой код, но следите что бы цветовые состовляющие изменялись плавно от цвета к цвету (R1G1B1=R0+1,G0+1,B0+1) 7.u->занести по координатам X+Xy,Y+Yy 8.r=r+1 9.если r<маскимального радиуса R, то перейти к пункту 3 10.a=a+1 11.если a<максимального количества пик- селей A, то перейти к пункту 2 12. все Можно конечно попробовать доработать эту схему, но возможно ли? Речь идет о растровой графике и даже такой подход труден в реализации. На SPECCY такое вообще трудно представить . 2.Alpha-канал Что такое альфа канал знают не все, но слышали о нем безусловно многие. На мно- гих современных карточках пишут 32 бита. Но зачем нужны эти 32 бита? А как раз для альфаканала, по 8 бит на RED, GREEN, BLUE плюс 8 бит альфа-канал. Все супер красивые взрывы, прозрачная вода и есть результат этой технологии. Например, од- нобитный альфа-канал может указать 0- пиксель прозрачен, 1-непрозрачен, а 8 бит дадут вам поистине безграничные воз- можности по управлению светом. Можно, например, делать по-настоящему прозрач- ную воду. Можно также применить для бо- лее красочного взрыва и каждое изображе- ние анимации взрыва, можно сопровождать альфа-каналом (хватит и двух бит): а-байт изображения, которое накладывают b-байт альфа-канала c-байт изображения, на которое наклады- вают d-байт полученного изображения Поскольку используем 2 бита то примем следующие значения если b=0, то d=a если b=1, то d=c если b=2, то d=c+a если b=3, то d=c-a В результате мы получим изображение, которое является гибридом. В данном слу- чае альфа-канал это специфическое изоб- ражение, но чем больше бит доступно в альфа-канале тем красивее изображение и вы можете управлять отдельно каждой состовляющей. 3.LENS-FLARE эффект LENS - это эффект, который появляется в оптических приборах от источников света. Он применяется в основном в 3D играх и поэтому мы его рассматривать не будем. Но если кому интересно, то он создается при помощи нескольких простых спрайтов в прозрачном виде (вот здесь и пригодиться alpha-канал). Спрайты как правило круг- лые и их три (почему ?). Спрайты выстраиваются вдоль линии от источника света. Пункт 5: Вроде все можно теперь, что у вас в буффере после процедуры синхрони- зации вывести из буффера на экран. "Голова нужна не только, чтоб шапку носить ..." Пару слов об AI Искуственный интелект является важным компонентом игры, будь то типичный боевик или заумная стратегия, но созда- ние его на сегодня не продвинулось ни на шаг с 80-х годов. Причина в неимоверной сложности его реализации. К примеру, заставте монстра зайти за угол, вроде все просто. Но что такое угол? Как его описать? Как описать врага для монстра? Стандартный подход, который называется искуственный интелект, отнял бы у вас уйму времени. Пришлось бы писать огромую подпрограмму, все ходы которой пришлось бы вам осмыслить. Я даже не могу себе представить все что нужно для этого, да- же человек прошел путь до сегодняшнего развития длиной в десятки тысяч, а может и сотни тысяч лет. Куда уж нам повторить хотя бы часть этого пути за пару дней? Но природа сама и подсказала нам путь, от простого к сложному. И если посмот- реть, то очень активно развивается аль- тернатива искуственному интелекту, ис- куственная жизнь AL. Что за жизнь, спро- сите вы? А вот такая вот жизнь! Подход AL выглядит так : 1.Вместо написания громозкой программы, напишем несколько маленьких программ, выполняющих одно действие, присвоим им код , например : 0-NOP нет команды 1-MOVE двигаться вперед 2-STEP LEFT шаг влево 3-STEP RIGHT шаг вправо 4-TURN LEFT поворот влево 5-TURN RIGHT поворот вправо и т.д. 2.Напишем подпрограмму, интерпритатор, которая должна двигаясь по памяти, встречая тот или иной код, передовать управление подпрограмме имеющей тот же код. Программа должна содержать ячейки, через которые будет происходить обмен между подпрограммами. По сути это язык программирования . 3.Все !!! Не правда ли просто? Но все гениальное просто! Что бы задать поведение монстров в PROJECT X мне потребовалось всего 15 таких команд и всего один регистр (один байт памяти !). Конечно поведение мон- стров там очень простое, но даже на этих 15 командах возможно моделирование пове- дения достаточно сложного . Вот эти команды : 00 RANGE - находиться ли игрок в зоне видимости. Выдает: 0-да / 1-нет (в игре применялось для проверки монстр в преде- лах экрана или нет) 01 MOVE - двинуться вперед на шаг 02 TURN LEFT - повернуть налево на определенный угол 03 TURN RIGHT - повернуть направо 04 SEARCH - проверить есть ли впереди преграда. Выдает : 0-да / 1-нет 05 SEARCH LEFT - то же слева 06 SEARCH RIGHT - то же справа 07 FIRE - стрелять (в игре не использо- валось) 08 HALT - указывает интерпритатору, что он должен закончить свою работу на этот раз и передать управление основной прог- рамме 09 VERIFY L - проверить находиться ли игрок слева или справа от монстра . Вы- дает : 0-да / 1-нет 10 VERIFY F - то же, но спереди или сзади 11 TYPE - проверяет, если игрок и монстр на одной линии по ходу движения, где находиться игрок. Выдает : 0-спереди / 1-сзади 12 JUMPIF 0 adress - проверяет содержи- мое регистра. Если он 0, то перейти на адрес adress 13 JUMPIF 1 adress - то же, но для 1 14 JUMP adress - безусловный переход Все !!! Для примера программа в этих кодах : тот самый adress ┌────────────────── │ 01 SEARCH 02 JUMPIF 1 4 03 TURN LEFT 04 VERIFY L 05 JUMPIF 0 9 06 VERIFY F 07 JUMPIF 0 15 08 JUMP 19 09 TYPE 10 JUMPIF 0 13 11 TURN RIGHT 12 JUMP 19 13 TURN LEFT 14 JUMP 1 15 TYPE 16 JUMPIF 0 19 17 TURN LEFT 18 TURN LEFT 19 MOVE 20 HALT 21 JUMP 1 Это только тестовая программа и на практике она не применима из-за того, что выход из нее совершиться один раз по HALT в строке 20. Для нормальной работы перед каждым JUMP или JUMPIF нужно пос- тавить HALT . Вобщем, подумайте какие команды вам понадобятся и дополните список. Можно даже написать самообучающихся монстров для этого надо лишь добавить возможность записи новых команд самой программой монстра. "Професор Понаебис , вам слово ..." Идей пришедшие на ум в процессе написания игры Решив сделать в игре начальную анимацию я столкнулся с тем, что на SPECCY нет нормальных аниматоров. Например , на тех же PC или AMIGA их вагон, не говоря уже о 3D редакторах. Конечно можно взять и сделать анимацию на PC и перетащить на SPECCY, но ... ... размеры !!! Хорошо если хватит диска. А если нет? Надо как- то сократить, но как? Один способ осно- ван на так распространенном сейчас в demo методе CHUNKY. Этим методом берут и анализируют изображение небольшими бло- ками обычно 2x2 и 4x4, а затем ищут по- хожие в специально сгенерированом тек- стовом наборе и получают своеобразный текст, специальными символами. Этот текст затем печатают на экран используя просто процедуру печати. Конечно для ви- део это очень хорошо, но красиво? Посмотрите на демки 1998-2000. Для эф- фектов это не плохо, но все больше как- то черно-бело. В игре же можно сделать и не так. И просматривая литературу я наткнулся на очень интересную мысль, а ведь видео это набор картинок, но каждая картинка не существенно отличается от предидущей и значить, если попробовать отбросить одинаковые части, то образует- ся куча пустого места в картинке, а зна- чить полученое изображение хорошо будет сжиматься. Взяв команду XOR (EOR на про- цессорах Motorola) и произведя следующие действия 1.a-указатель на информацию первой картинки b-указатель на информацию второй картинки 2.(b)=(a) XOR (b) - скобки указывают на обращение к памяти по адрессу в скобках 3.a=a+1 4.b=b+1 5.если информация не закончилась, то на пункт 2 6.все Мы можем получить картинку содержащую множество пропусков и применив компрес- сор ориентированый на сжатие картинок получим изображение размером лишь в де- сятую часть от полного объема. Коэффи- циент компрессии на плотных изображениях может достигать 1:20. Конечно первую картинку нужно содержать в базовом виде, а производить обработку двух соседних кадров. Вывод же осужествляется так : 1.Распакуем первую картинку в экран 2.распакуем следующую картинку в буффер 3.a-указатель на экран b-указатель на буффер 4.(a)=(a) XOR (b) - скобки указывают на обращение к памяти по адрессу в скобках 5.a=a+1 6.b=b+1 7.если информация не закончилась, то на пункт 4 8.если еще есть кадры, то на пункт 2 9.все Действительно все !!! В игре PROJECT X SE таким образом удалось довести размер кадра до 368-700 байт (!). Я пользовался для компрессии слегка модифицированым мной компрессором ASC . "С востока вставало медленно солнце ... " Со списком основных проблем и набросок мы разобрались, если кто хочет что-либо добавить или спросить, пишите - адреса ниже . Статья писалась почти 9 (!!!) ме- сяцев по причине нехватки времени, так как на AMIGе пишется игра Incubation Period. Приношу извинения за задержку. Если у кого есть вопросы свяжитесь с на- ми по следующим адресам. Тольятти 04.12.1999 - 01.09.2000 Адреса: Internet Web: http://www.laserdreams.nm.ru/ http://www.infopac.ru/~cache/ E-mail: laserdreams@nm.ru cache@nm.ru cache@infopac.ru chmod777@inbox.ru FIDO 2:5075/34.16 Gorbunov Roman Phone (8469) 351-130 (Konstantin) (8469) 705-131 (Roman) Mail Russia , Samara region c. Togliatti street Frunze 15-414 index 445027 to Dronov Konstantin
Другие статьи номера:
Похожие статьи:
В этот день... 21 ноября