ЭЛЕКТРОННАЯ БИБЛИОТЕКА КОАПП
Сборники Художественной, Технической, Справочной, Английской, Нормативной, Исторической, и др. литературы.



 

Часть 11


10.  Графические команды режима 19
-----------------------------------------------------------------

     Беря во внимание  размер  и  сложность  расширенного  набора
команд Паскаля,  следует  найти  для  них  некоторое практическое
применение.

     Поставляемые с  данной  книгой  на  диске   демонстрационные
программы иллюстрируют работу графических команд, даже если вы не
интересуетесь самими  листингами   программ.   Описываемые   ниже
листинги окажутся   полезными   для  тех  пользователей,  которым
интересно, как в действительности происходит работа этих программ.

10.1  Путешествие по галактике
-----------------------------------------------------------------

     Одна из  программ,  широко  использующих  новый модуль Turbo
Pascal VGA19.TPU, называется TERRAX.PAS.

     Объект этой игры не имеет  ничего  общего  со  стрельбой  по
врагам; там нет ни оружия,  ни сражений.  Назначение ее состоит в
том, чтобы создавать красивые рисунки  для VGA и использовать  их
для создания новых солнц,  планет и ландшафтов.  В процессе самой
игры вы должны найти пригодную для обитания планету.

10.1.1  Описание программы
-----------------------------------------------------------------

     Мы не  будем  слишком  подробно описывать,  что происходит в
самой программе.  Комментарии   в   листинге   программы   вполне
достаточны. Мы  опишем  назначение  каждой  части программы,  так
чтобы вы могли понять взаимодействие частей программы,

     Многие части  программы   вложены   друг   в   друга   и   в
действительности не  образуют  отдельно оформленных подпрограмм и
процедур. Где это представлялось возможным,  части программы были
выделены в отдельные процедуры для упрощения главной программы.

     Главная программа  начинается  с  вывода на экран некоторого
пояснительного текста. Дается объяснение функций управления игрой
с клавиатуры.  Кроме  того,  приводятся  общие  сведения об игре.
После этого введения начинается сама программа.

10.1.2  Правила игры
-----------------------------------------------------------------

a) Автоматический поиск пригодных для обитания планет
-----------------------------------------------------

     В начале  работы  программы   в   правой   половине   экрана
появляется изображение  солнечной  системы.  Спутники  планет для
простоты не изображаются.

     Эта солнечная система дает  нам  знакомый  пример  солнца  с
девятью планетами.  Две  планеты  с  одинаковым размером (Земля и
Венера) показаны голубым цветом.  В качестве базы  для  сравнения
масс других  планет  и  звезд  масса земли берется равной 120.  В
соответствии с  этим  базовым  значением  массы  всех   остальных
объектов солнечной системы приводятся в таблице.

     Тем временем  программа проектирует новую солнечную систему.
Главная звезда  каждой  новой  солнечной  системы  появляется  на
экране в виде цветной точки. Этот процесс продолжается до тех пор,
пока на экране не будет 500 звезд.

     Как только  все   звезды   будут   нарисованы,   путешествие
"космического корабля" начинается.  Экран будет выглядеть как вид
из окна корабля.  Среднюю часть  экрана  можно  увеличить,  чтобы
получить более подробное изображение.

     При этом  подпрограмма поиска будет искать солнечную систему
с пригодной для обитания системой.  Если такая  система  найдена,
корабли автоматически  ложится на курс к этой системе.  На экране
появляется рисунок этой системы с таблицей масс всех  входящих  в
нее объектов.

     В этой  части игры остался всего один шаг.  После того,  как
пригодная планета будет найдена,  нажмите клавишу,  приказав  тем
самым кораблю совершить посадку на нее.

     На основе  данных  о  массе  солнца  и планеты,  температуры
солнца и планеты,  атмосферного  давления,  периода  обращения  и
возраста планеты будет создано изображение поверхности планеты.

b) Создание солнечной системы: клавиша 
------------------------------------------

     Если вы нажмете клавишу    во  время  путешествия  вашего
корабля, то  вы  сможете  наблюдать  на экране создание солнечной
системы. Вы увидите исходную массу спирально выходящих газов,  из
которых  впоследствии сформируются планетные массы системы.  Этот
процесс обычно происходит "за экраном".

     Гигантские планеты могут поглотить несколько планетных  масс
и продолжать  расти  до  тех пор,  пока не начнется горение.  Так
формируются новые звезды. Самая большая звезда станет центральной
звездой новорожденной солнечной системы.

     В реальной  галактике  системы  с  более  чем  одной звездой
достаточно распространены.  Однако  такие  системы  имеют  меньше
шансов иметь землеподобную планету вследствие таких факторов,  как
необычные гравитационные поля  и  сильная  радиация.  Как  станет
видно из  исходного кода программы,  уникальную солнечную систему
определяет несколько факторов.

     Чтобы программа    оставалась     достаточно     малой     и
быстродействующей, нам     пришлось     отойти     от     научной
действительности в двух важных точках.

     Во-первых, позиция каждой планеты в  системе  фиксируется  в
соответствии с относительными расстояниями, существующими в нашей
собственной солнечной системе. Во вторых, масса самого маленького
объекта системы устанавливается равной 1=1/120 части массы земли.

     Чтобы соблюсти  полную  точность,  нам бы пришлось допустить
тысячи возможных позиций планет и массы до 1/120000000  от  массы
земли. Такая  степень  точности  сделала бы программу недопустимо
медленной, так  что  мы   лучше   сосредоточимся   на   прекрасных
оптических эффектах,  которые  позволяет  создавать VGA,  а не на
строгом следовании законам физики.

c) Вывод солнечной системы на экран клавишей 
   (посадка выполняется клавишей )
------------------------------------------------

     1.) При  нажатии  во  время  полета  клавиши    планетная
система будет  выведена  на экран при помощи той же подпрограммы,
что выводит систему  при  автоматическом  поиске.  Для  сравнения
справа дается изображение нашей собственной солнечной системы.

     Однако, на   этот  раз  на  экран  будет  выведена  система,
созданная в момент нажатия клавиши .

     2.) Решение о посадки и выбор желаемой  планеты  выполняются
клавишей  и вводом номера желаемой планеты.

     Затем вы   должны   решить,  пригодна  ли  эта  планета  для
человека. Для  принятия  этого  решения  вам  дается  изображение
ландшафта планеты и данные об атмосферном давлении, температуре и
продолжительности дня.

     Принимая решение, вы должны учесть следующее:

     Нормальное атмосферное давление на Земле  составляет  1  бар
(или 1000 миллибар).  При атмосферном давлении 100 или 10000 люди
будут чувствовать себя не слишком комфортабельно.

     Средняя температура на Земле составляет 13.5 -  14  градусов
по Цельсию (около 57 по Фаренгейту). Не следует выбирать планету,
где вы зажаритесь или замерзнете.

     Возраст земли  около  4.6  миллиарда  лет.  Это  около   50%
возраста солнечной системы. Жизнь солнечной системы заканчивается
с "выгоранием" солнца. Слишком молодые системы, с возрастом менее
2.5 миллиардов лет, имеют проблемы со слишком большим количеством
метеоров, комет  и  потоков  протопланетарных  масс.  Непрерывная
бомбардировка делает невозможной заселение планеты.

     Важным фактором  является  и  длина  дня.  Слишком короткий,
шесть и менее часов,  день говорит  о  слишком  быстром  вращении
планеты, что  создает  проблемы  с гравитацией.  Слишком длинный,
длящийся несколько земных дней,  день связан с большими перепадами
дневной и   ночной   температур,   что  влечет  за  собой  бурные
атмосферные явления, что также не годится для человека.

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

     После посадки  на  планету  вы можете опять взлететь,  нажав
любую клавишу.  Оказавшись в космосе,  вы  можете  опуститься  на
любую другую планету системы, нажав .

     Нажатием   вы можете покинуть данную систему и продолжить
полет.

d) Краткое повторение правил игры
---------------------------------

     Путешествие и  автоматический  поиск  планет  начинается при
запуске программы.

     Наблюдать развитие системы можно, нажав клавишу .

     Клавиша   используется  для  вывода  на  экран  выбранной
солнечной системы.

     Клавиша   выводит изображение нашей собственной солнечной
системы.

     Опуститься на планету вы можете,  нажав  и  выбрав  номер
планеты/звезды.

     Взлет с планеты/звезды выполняется нажатием пробела.

     Вы можете  покинуть  данную  систему  и возвратиться в режим
автоматического поиска планет повторным нажатием .


10.1.3  Листинг TERRAX.PAS на Паскале
-----------------------------------------------------------------

     Эта программа  имеет  несколько  не  рассматриваемых   здесь
подпрограмм. Технические   астрономические   подробности  слишком
далеки от фактического объекта обсуждения данной книги  -  графики
VGA. Полный листинг всех программ см. на ваших дискетах.


10.2  Программа TERRAX для графической платы Hercules
-----------------------------------------------------------------

     Игра TerraX  и  ее исходный код на Паскале предназначены для
работы в режиме 19 VGA/MCGA.  Однако,  это  не  значит,  что  для
пользователей графической платы Hercules игра недоступна.

     Мы можем  адаптировать  TerraX для монохромного графического
режима Hercules,  использовав для этого расширенный набор  команд
Паскаля для графики Hercules.

     Модифицированная игра  очень  похожа  на  TerraX.  Однако ее
листинг имеет  некоторые   существенные   различия,   в   которых
принимаются во  внимание  различные  другие  экранных  координат,
действующие в монохромном графическом режиме Hercules.

     На диске,  поставляемом с  книгой,  вы  найдете  листинг  на
Паскале, который  называется  H-TERRAX.PAS.  При  компиляции этой
программы должны   быть   доступны   файлы   HERCULES.TPU    (или
HERCULES.PAS) и HERC.BGI. Листинг см. на программных дискетах.

     Версия данной  программой  для Hercules может также работать
на многих  платах  расширения   VGA   при   подстановке   команды
MODEHERCULES вместо команды MODEPSEUDOHERCULES из HERCULES.TPU.

     Помните, что    в    момент   компиляции   программы   файлы
HERCULES.TPU и  HERC.BGI  должны  находиться   либо   в   текущей
директории, либо должны быть указаны в маршруте доступа DOS.

     Для читателей, не имеющих компилятора Паскаля, эти программы
поставляются также в компилированной форме.

     TERRAX.EXE       (для режима 19 VGA/MCGA)
     H-TERRAX.EXE     (для монохромного режима Hercules)

10.3  Демонстрация графики в видео-режиме 19
-----------------------------------------------------------------

     В данном  разделе  мы   представим   некоторые   графические
демонстрации, развлечения  и игры.  Как и TERRAX,  это не обычные
игры, где игра идет с оппонентом.  Эти игры  предназначены  более
для приятного времяпрепровождения и работают с одним игроком.

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

     В таких программах получаешь больше удовольствия  от  самого
программирования, чем  от  использования.  Может быть,  благодаря
этим демонстрационным программам вы поймете, как интересно писать
графические программы.

10.3.1  Заполнение ландшафта деревьями (TREE.PAS)
-----------------------------------------------------------------

     Программа TREE.EXE это скомпилированная Паскаль-программа на
диске, поставляемом   с   данной   книгой.   Она   написана   для
видео-режима 19 (VGA/MCGA).

     Цель игры - создать лес в чистом  поле.  На  горизонте  поля
стоит небольшой дом, из трубы которого идет дым.

     Первое дерево  помещается  программой  автоматически.  Затем
пользователь "сажает"  дополнительные  деревья,  нажимая  пробел.
Первое нажатие  пробела  рисует  ствол и ветки. Повторное нажатие
пробела приводит к тому,  что на голых  ветках  дерева  вырастают
листья.

     Интервал времени между нажатиями пробела определяет, сколько
ветвей и листьев успеет "вырасти" на дереве. Если вы ждете долго,
то будет создано дерево со множеством ветвей и листьев. При малом
интервале между нажатиями дерево будет  иметь  мало  веток  и/или
листьев. Чем больше терпения, тем красивее лес.

     Программа заканчивается нажатием клавиши .

     Листинг программы поставляется на программных дискетах.


10.3.2  Лунный пейзаж (CRATER.PAS)
-----------------------------------------------------------------

     Программа CRATER.EXE    также    находится    на   дискетах,
поставляемых с  книгой.  Это  компилированная  Паскаль-программа,
предназначенная для использования в видео-режиме 19 (VGA/MCGA).

     Целью является  создание лунного пейзажа на плоской равнине.
Кратеры формируются при столкновениях с метеоритами. Единственное
действие пользователя  состоит  в  том,  чтобы  остановить работу
программы нажатием клавиши . Созданный "лунный пейзаж" можно
сохранить в файл при помощи команды SAVE.
     
     Как и   в   случае  программы  TREE,  терпение  пользователя
награждается более насыщенным рисунком, так как создание картинки
требует некоторого  времени.  Даже если ваше терпение ограничено,
дождитесь попадания  нескольких  крупных   метеоров.   Наибольшее
впечатление производит  попадание  затем  мелких  метеоров  в уже
существующие крупные кратеры, а не на исходную равнину.
     
     В программе    кратеры     создаются     последовательностью
специальных процедур.  Эти процедуры должны согласовывать форму и
цвет кратеров  с   уже   существующим   пейзажем.   Для   эффекта
трехмерности на рисунок помещаются тени в перспективе.
     
     Центральные пики  и  кольца  гигантских  кратеров  создаются
методом рекурсий.  Это означает,  что процедура  CRATER  вызывает
для создания таких кратеров сама себя (рекурсивно).
     
     В этой   программе   компьютер  это  единственный  "реальный
участник". От  вас  требуется   только   сидеть  и   наслаждаться
процессом создания картинок.
     
     На программных  дискетах также находится исходный текст этой
программы.
     
     Рис.10:  Лунный пейзаж
     
10.3.3  Битва 256 цветов ("Острова в океане")
-----------------------------------------------------------------
     
     Как вам известно,  видео-режим 19 может использовать палитру
из 256 различных цветов одновременно. Что вы скажете о программе,
которая выбирает   палитру  из  262144  возможных  цветов  VGA  и
заставляет их на экране сражаться между собой.
     
     Программа заполняет половину  палитры  голубыми  и  зелеными
(холодными) тонами,  а  вторую - желтыми,  коричневыми и красными
(теплыми).
     
     Цель программы  состоит  в  том,  что  теплые   цвета   (или
"острова") сражаются с холодными цветами (или "океаном").
     
     В основе  программы  лежит анализ окружающих пикселей.  Если
пиксель окружен пикселями другой цветовой группы,  он "попадает в
плен" и заменяется пикселем другой группы.
     
     При запуске  программы  (COLRSTR3.PAS) появляются коричневые
острова. Острова медленно блуждают по  экрану,  подобно  песчаным
дюнам. Голубые и зеленые цвета это океан,  который смывает желтые
берега островов.
     
     Компилированная программа    COLRSTR3.EXE    находится    на
программных дискетах,  поставляемых  с книгой.  Исходный текст ее
находится там же.  Кроме того,  поставляется и вторая версия этой
программы, COLRLUM2.EXE.
     
10.3.4  Размножение цветных пикселей ("Рост кораллов под водой")
-----------------------------------------------------------------
     
     Следующая программа   тесно   связана   с   программой    из
предыдущего раздела.  Однако ее графический эффект совсем другой.
В данном случае мы будем наблюдать рост окрашенных  в  коричневый
цвет "кораллов"  на  фоне  цвета  воды.  Отдельные  пиксели будут
являться "семенами",  которые могут вырасти  в  большие  кораллы,
если окружены нужными цветами.
     
     Цвета воды  образуют  постоянное  течение,  с которым должны
бороться растущие кораллы.  Может случиться так,  что разрастание
коричневого цвета  полностью  будет  блокировано голубыми цветами
воды, и рост коралла прекратится.
     
     
Procedure GellGro2Pas;
 uses
  dos,crt,vga19;
 
 var x,y,z,f1,f2,f3,f4,Color : Integer;
 
 Procedure BattleColors;
 begin
   Blend(0 ,24, 3, 23,  38 ,52,40,20);
   Blend(38 ,52,40,20,  84 ,45,60,20);
   Blend(84 ,45,60,20, 126 ,50,60,57);
   Blend(127 ,47,60,63, 191 ,25,42,60);
   Blend(191 ,25,42,60, 255 ,10,10,30);
 end;
 
 Procedure Battlefield;
 begin
   for y :=0 to 199 do begin
   for x :=0 to 319 do begin
    Plot(x,y,Random(126));
   end;
   end;
   for y :=197 to 199 do begin
   for x := 159 to 161 do begin
    Plot*x,y,200);
   end;
  end;
end;
   
begin
  directvideo:=false;
  Mode(19);
  Randomize:
  gotoxy(0,0);
  FrameColor(20);
  BattleColors;
  delay(1000);
  Battlefield;
  textbackground(8);textcolor(16); gotoxy(1,10);
  writeln(' Gell Growth Under Water by jan Ruggeberg');
  repeat
   y := Random(199)+1;
   x := Random(318)+1;
  Peek(x,y-1,f1); Peek(x-1,y,f2);
  Peek(x+1,y,f3); Peek(x,y+1,f4);
  Color:=(f1+f2+f3+f4) div 4;
  if Color <= 127 then
     Plot(x+1,y+1,Color) ;
  if ((Color >= 128) and (Color <140)) or ((f1<128) and (f4>128))
then begin
  z:=random(3)-1;
   Plot(x+z,y,128+random(Color div 2));
    Plot(x+z*2,y,128+random(Color div 2)); end;
  if Color >=130 then begin
   z:=random(3)-1;
    Plot(x,y,125-random(80)) ;
    Plot(x+z,y,125-random(80));
    Plot(x,y+1,125-random(80)) ;
     Plot(x+z,y+1,125-random(80)) end;
  
  until keypressed;
end.

    
10.4  Демонстрация графики для Hercules
-----------------------------------------------------------------
    
    Следующие три программы  представляют  собой  развлекательные
демонстрации расширенного  набора  команд Паскаля для графической
платы Hercules,   который   рассматривался   в   данной    книге.
Пользователи платы   VGA   также   могут   воспользоваться  этими
программами, если    установят    доступ    к    соответствующему
монохромному видео-режиму IBM 7. В этом случае в программах нужно
заменить команду MODEHERCULES на MODEPSEUDOHERCULES.
    
    Для выполнения  этих  программ  нужны:  модуль  Turbo  Pascal
HERCULES.TPU, стандартный    модуль   GRAPH.TPU   и   Графический
Интерфейс Borland   (B.G.I.)   -   HERC.BGI.   .BGI-файл   должен
находиться в   текущей   директории,   либо  к  нему  должен быть
установлен маршрут поиска DOS.
    
10.4.1  Демонстрация моделирования VGA на Hercules
-----------------------------------------------------------------
    
    Программа HERCDEM.PAS    рисует    разнообразные   фигуры   в
монохромном графическом режиме  Hercules.  В  число  изображаемых
объектов входят  окружности,  прямоугольники,  закрашенные  шары,
закрашенные столбцы и очень маленький текстовый шрифт.
    
    Исходный код программы находится на программных дискетах.
    
10.4.2  Создание лунного пейзажа в режиме Hercules
-----------------------------------------------------------------
    
    В данной    программе    ранее   описанная   демонстрационная
программа, рисующая лунный пейзаж с кратерами,  адаптируется  для
работы в монохромном графическом режиме Hercules. Несмотря на то,
что практически программа почти полностью переписана, графические
эффекты очень близки к получаемым на VGA.
    
    Как и   раньше,   кратеры   создаются  непрерывным  метеорным
потоком. Исходный код см. на программных дискетах.
    
10.4.3  Команды DOS для VGA-графики в режиме Hercules
-----------------------------------------------------------------
    
    Возвращаясь к главе,  посвященной расширениям DOS, рассмотрим
команду SHOW,  описанную для  режима  VGA/MCGA  19.  Эта  команда
используется для  вывода  на  экран файла с рисунком в режиме 19.
Была и команда SAVE для сохранения таких файлов. Цвета при выводе
зависели от  текущей  палитры.  Теперь  рассмотрим  команду  DOS,
выполняющую аналогичную SHOW функцию  в  монохромном  графическом
режиме Hercules.
    
    Команда SHOW-H  работает  только  с  64000-байтовыми  файлами
рисунков с разрешением 320*200 пикселей. Файл должен быть  создан
в режиме 19 с использованием  настраиваемой  командой JANSPALETTE
палитры. Рисунки на базе других палитр должны  быть  адаптированы
под JANSPALETTE.
    
    Именно поэтому  мы поместили на программную дискету программу
(CONVERT.PAS/CONVERT.EXE) для преобразования  рисунков  из  одной
палитры в   другую.   Эта   программа   преобразовывает  рисунки,
созданные с SARAPALETTE, для отображения с JANSPALETTE.
    
    Листинг программы  SHOW-H.PAS  см.   также   на   программной
дискете. Компилированная   версия   этой   программы   называется
SHOW-H.EXE. Компилированный исполняемый файл можно  запускать  из
командной строки, как новую команду DOS.
    
    Имя и  маршрут  поиска  желаемого  файла  рисунка  вводятся в
качестве параметров командной строки.
    
    
program ShowHPas;          { 256 цветов из 256000 }
 use dos,crt,Hercules;
  
 type
  VGAPoint =record
       { определяется тип файла, и сам файл разделяется }
   OnePoint :byte;
  end; { между переменными определенной длины }
  
 var
  Ftype       : File of VGAPoint ;
                { тип VGAPoint файла:Ftype }
  Entry       : VGAPoint;
                { тип VGAPoint переменной:Entry }
  LoadName    : String;
  PokeX, PokeY,x,y: integer; ch:char;
  Color       : Integer;
  
  
  Procedure Load(LoadName:String);
   Begin
   Assign(Ftype,LoadName);
                { Присвоение имени файловой переменной }
   Reset(Ftype);{ Открыть файл на запись }
   begin
    for y:= 0 to 199 do begin
     for x:= 0 to 319 do begin
     read(Ftype, Entry);
                { Запись строки в файл }
     Color:=Entry.OnePoint;
     while Color>15 do begin
     Color:=Color-16;
    end;
    Color:=Color*16;Color:=255-Color;
    if (Color>32) then begin
     Color:=(255-Color)div 3+Color;
    end;
    Plot(x*23 div 10  , y*17 div 10  ,Color);
    Plot((x*23 div 10)+1,(y*17 div 10) ,Color);
    Plot((x*23 div 10)+2,(y*17 div 10) ,Color);
    Plot(x*23 div 10  ,(y*17 div 10)+1,Color);
    Plot((x*23 div 10)+1,(y*17 div 10)+1,Color);
    Plot((x*23 div 10)+2,(y*17 div 10)+1,Color);
    end;
   end;
   close(Ftype);   { Закрыть файл }
  end;
end;

begin              { Начало главной программы }
 ModeHercules;
 if ParamCount=0 then exit;
 LoadName:=ParamStr(1);      { Подпрограмма загрузки рисунка }
 Load(LoadName);
 ZeroKey;ch:=readkey;
end.
                                                              
    
    


Яндекс цитирования