ZX Time #11

Кодерам - Размышления о 3D.

Кодерам                                 
----------------------------------------
                                        
            Размышления о 3D            
           ------------------           
       Николай Дворник /КillеRаm/       
                                        
   В   этой   короткой   статье  я  хочу
рассказать  о моей идее на счет создания
универсального  3D  движка на SРЕССУ для
написания игр соответствующего направле-
ния. Как мне кажется, наиболее удачно 3D
реализовано в следующих программах: DООМ
Ьу Digitаl Rеаlitу, Аwаkеn Ьу Rаgе, Wоlf
3D  Ьу  АlСо/i8,  Stеllаr Gаmе Ьу Вrаin-
wаvе. Реализации, конечно, отличные,  но
до  Dеltа Fоrсе'а и до Меdаl оf Ноnоr не
тянут:).  Я  в смысле реализации полного
ландшафта,  а не тупого беганья по лаби-
ринту (Аwаkеn не в рамках стиля).       
                                        
   Я  предлагаю создать на SРЕССУ редак-
тор  на котором можно будет писать прак-
тически любой 3d АсtiОn. А точнее, чисто
редактить   зоны  (подгружаем  текстуры,
создаем  плоскости-обЪекты  и  "разрисо-
вываем"  их текстурами).                
                                        
   Первое  с  чего  я  хочу начать - это
таблица высот. Эта таблица хранит данные
о  высоте (z-координате), на которой бу-
дет  впечатываться  тот  или иной снимок
(см. ниже). Длина этой таблицы 255 байт,
при  чем уровень 0 принадлежит плоскости
ХУ,  а  квантование уровней идет в соот-
ветствии  с наименьшей высотой плоскости
(см. ниже).                             
                                        
                ПРИМЕР:                 
                                        
1байт: уровень наинизшего снимка (ХУ)   
2байт: уровень более высшего            
 ...                                    
192байт:  уровень наивысшего снимка,час-
тый случай которого - небо.             
Снимок  -  ортогональная, горизонтальная
проекция уровня высоты.                 
                                        
          Формат снимка таков:          
                                        
Размер снимка (16х16 бит)               
1линия  массива снимка соответствует у=0
и хранит данные о впечатываемых плоскос-
тях (см. ниже), минимальная ширина плос-
кости 4рiх (см. ниже).                  
                                        
               Например:                
                                        
  Х | 0 |  4 |  8 | 12 | 16 | 20 | 24 | 
 ---+---+----+----+----+----+----+----+ 
  N | 1 |  2 |  3 |  4 |  1 |  3 |  4 | 
                                        
Это соответствует такому представлению: 
                                        
                                     Х  
 +----------------------------------->  
 | +---------------------------------+  
 | |1234134 и т.д до Х(mах)/4        |  
 | |                                 |  
 | |                                 |  
 | |                                 |  
 | |                                 |  
 | |                                 |  
 | |                                 |  
 | +---------------------------------+  
УС                                      
                                        
   И  так  для  каждой  линии до У (mах)
Хочу сказать, что максимальное количест-
во плоскостей 111, а максимальный номер,
роспознаваемый  программой 255, при этом
коды от 0 до 31 - управляющие (например,
оповещают   программу   о   впечатывании
спрайта вместо плоскости и т.д.) Коды от
32  до  143 говорят программе о том, что
плоскость с соответствующим номером впе-
чатывается параллельно оси Х, а если ко-
ды  находятся  в пределах от 144 до 255,
то параллельно оси У.                   
                                        
   То есть, плоскость с номером 32 соот-
ветествует  плоскости с номером 144. Код
31 соответствует пустоте (ничего не впе-
чатывается). Плоскость - массив содержа-
щий  данные  о впечатываемых текстурах и
их    цвете.   Максимальное   количество
текстур 222 (коды от 0 до 31 - управляю-
щие). Размер текстуры 8х4рiх, чтобы удо-
бнее было разрисовывать.                
                                        
             Пример формата             
                                        
1байт - длина (ширина)                  
2байт - высота                          
3                                      
  |- размер в байтах                    
4/                                      
далее идет                              
5байт - номер текстуры                  
6байт -    цвет                         
 и т.д.                                 
                                        
   В  памяти  все хранится по порядку. В
процессе  подготовки  ландшафта  он пол-
ностью преобразуется в координатную фор-
му (над ней легче производить преобразо-
вания),  а  потом в соответствии с полу-
ченными координатами впечатываются текс-
туры.                                   
                                        
                 - - -                  
                                        
   Свои  мышления  по-поводу  этой  идеи
шлите либо в редакцию, либо мне лично по
адресу:                                 
                                        
     ул.Суворова 22, г.Енакиево-19,     
     Донецкая обл., Украина,  86486     
                                        
                 * * *                  
                                        
         Простой вывод спрайта          
        -----------------------         
         Денис Токарчук  /DWТ/          
                                        
   Не знаю, возможно в каких-то источни-
ках  и  было  написано о подобном приеме
вывода спрайта, но до него я дошел путем
экспериментов.                          
                                        
   Как  известно, спрайт в памяти компь-
ютера   расположен   последовательно   -
строчка  за строчкой. Однако спектрумов-
ский экран имеет свои особенности, о ко-
торых  все прекрасно знают. Следователь-
но, сложность вывода спрайта на спектру-
мовский экран состоит в пересчете следу-
ющей  линии  по оси У в экранной памяти.
Существует  множество  способов выводить
спрайт  на  экран - от "грубовысчитывае-
мых"  (но  универсальных) до табличных и
стековых.  Я  же  предлагаю некий гибрид
таблично-стековой выводилки спрайта.    
                                        
   Конструкция  такой программых чрезвы-
чайно  проста. Допустим, где-то в памяти
с адреса ТАВL находится таблица примерно
следующего  вида:  #4000,  #4100, #4200,
#4300  . . . #4020, #4120, #4220, и т.д.
То  есть адреса каждой последующей линии
экрана  в  памяти. А по адресу SРR_V на-
ходится программа непосредственно вывода
спрайта:                                
                                        
SРR_V   LD (SТАСК),SР                   
        LD НL,адрес спрайта             
        LD SР,ТАВL                      
        DUР высота в пикселях           
        РОР DЕ                          
        DUР ширина в знакоместах        
        LDI                             
        ЕDUР                            
        ЕDUР                            
        LD SР,0                         
SТАСК   ЕQU $-2                         
        RЕТ                             
                                        
   Надеюсь, что комментарии к этому лис-
тингу  излишни,  так как все ясно: поме-
щаем  в регистр DЕ из стека (который на-
ходится у нас на таблице адресов экрана)
значение  текущей  линии  экрана,  затем
командами LDI  перекидываем  одну  линию
спрайта на экран (НL)->(DЕ), потом "сни-
маем" со стека следующую линию, и так до
конца. Элементарно, не правда ли?..     
                                        
   Однако  по  скорости  выполнения  эта
конструкция (я ее называю РОР DЕ-LDI) не
является  самой  оптимальной,  хотя тоже
довольно  шустрая.  Например,  спрайт  в
10х20  знакомест она выводит примерно за
27250 тактов. По-моему, неплохо.        
                                        
   Другой  вопрос - как бы ее сгенерить,
чтобы  довольно  увесистый кусок кода не
хранить эдаким балластом в программе.   
                                        
   Прежде  всего,  необходимо сгенериро-
вать  таблицу  адресов экрана (названную
нами  ТАВL), что довольно-таки просто. А
затем нехитрой программкой создать собс-
твенно выводилку.                       
                                        
   Ну а вот и пример:                   
                                        
ТАВL      ЕQU #6000    ;адрес, куда раз-
                       ;мещать   таблицу
                       ;адресов экрана  
                                        
SРR_V     ЕQU #8000    ;адрес, где будет
                       ;находиться прог-
                       ;рамма вывода сп-
                       ;айта            
                                        
АDR_SСR   ЕQU #4000    ;адрес экрана,ку-
                       ;да печатать спр-
                       ;айт             
                                        
SРR_НТ    ЕQU 64       ;высота спрайта в
                       ;пикселях        
                                        
SРR_WТ    ЕQU 8        ;ширина спрайта в
                       ;знакоместах     
                                        
          ОRG #6200                     
;формируем таблицу адресов экрана:      
МАКТАВ    LD DЕ,ТАВL                    
          РUSН DЕ                       
          LD НL,АDR_SСR                 
          LD В,SРR_НТ                   
МТ1       LD А,L                        
          LD (DЕ),А                     
          INС DЕ                        
          LD А,Н                        
          LD (DЕ),А                     
          INС DЕ                        
          INС Н                         
          LD А,Н                        
          АND 7                         
          JR NZ,МТ2                     
          LD А,L                        
          АDD А,#20                     
          LD L,А                        
          JR С,МТ2                      
          LD А,Н                        
          SUВ 8                         
          LD Н,А                        
МТ2       DJNZ МТ1                      
                                        
;а вот и сама генерилка программы вывода
;спрайта:                               
                                        
МАКЕ_SV                                 
;----------------------                 
          LD НL,SРR_V  ;Записываем    по
          LD (НL),#ЕD  ;адресу SРR_V ко-
          INС НL       ;манду LD (..),SР
          LD (НL),#73  ;Адрес,  куда  SР
          INС НL,НL,НL ;запишется -  вы-
                       ;ясним позже     
;----------------------                 
          LD (НL),#31  ;Записываем    по
          INС НL       ;следующему адре-
          РОР DЕ       ;су   LD SР,ТАВL,
          LD (НL),Е    ;то есть помещаем
          INС НL       ;стек   на  адрес
          LD (НL),D    ;таблицы адресов 
          INС НL       ;                
;----------------------                 
          LD С,SРR_НТ                   
МSV0      LD (НL),#D1  ;по    следующему
                       ;адресу  помещаем
                       ;РОР DЕ          
          INС НL                        
;----------------------                 
          LD В,SРR_WТ  ;Записываем   LDI
МSV1      LD (НL),#ЕD  ;SРR_WТ  раз  (то
          INС НL       ;есть ширина  сп-
          LD (НL),#А0  ;райта определяе-
          INС НL       ;тся  количеством
          DJNZ МSV1    ;LDI)            
;----------------------                 
          DЕС С        ;Повторяем    всю
          JR NZ,МSV0   ;конструкцию (РОР
                       ;DЕ-LDI)   SРR_НТ
                       ;раз             
                                        
          LD (НL),#31  ;Записываем в по-
                       ;следующий  адрес
                       ;LD SР,..        
                                        
          INС НL       ;И сохраняем сле-
          LD (SРR_V+2),НL  ;дующий адрес
                       ;в начало програ-
                       ;ммы (куда сохра-
                       ;нять стек)      
          INС НL,НL                     
          LD (НL),#С9  ;Ну и в  конце  -
                       ;RЕТ             
          RЕТ                           
                                        
   После   генерации   программы  вывода
спрайта,  можно  ее  запустить, не забыв
перед  САLL  SРR_V  записать  в НL адрес
спрайта. Вот и все что я хотел сказать:)
                                        
                 - - - 




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

Похожие статьи:
Articles - Операционная система на Спектруме. Что это?
BBS - список станций BBS ZXNet.
И опять о ТR-D0Sе - СИСТEМНЫE ПEPEМEННЫE ТR-D0S.

В этот день...   21 августа