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




Темы: Игры, Программное обеспечение, Пресса, Аппаратное обеспечение, Сеть, Демосцена, Люди, Программирование

Похожие статьи:
От автора - о правильном произношении названия газеты.
Оттяг - психологический тест: Нарисуй дом.
Планета шелезяка - доработка Пентагон 128к до 512к.

В этот день...   26 сентября