LRP2
.pdfТаблица 1 ╔═════════════╦═════════════════════════════════════════════════╗
║ |
Параметры ║ |
|
|
Номер в журнале |
|
|
║ |
||
║ |
║ 0 |
1 |
2 |
3 |
4 |
5 |
6 |
7 8 |
9 ║ |
║═════════════╬═════╤════╤═════╤════╤════╤════╤════╤═══╤════╤═══╣
║ obj_XY |
║ |
4 |
│ |
3 |
│ |
4 |
│ |
3 |
│ |
5 |
│ |
4 |
│ 6 |
│ |
5 |
│ |
3 |
│ 6 |
║ |
║ obj_XYZ |
║ |
15 |
│ |
44 |
│ |
13 |
│ |
33 │ |
44 │ |
14 |
│ 44 |
│ |
15│ |
55 |
│ 33║ |
||||
║ Цвет фона |
║ |
4 |
│ |
0 |
│ |
1 |
│ |
2 |
│ |
3 |
│ |
4 |
│ 3 |
│ |
1 |
│ |
2 |
│ 0 |
║ |
║ Цвет объекта║ |
B |
│ |
E |
│ |
C |
│ |
D |
│ |
A |
│ |
B |
│ 8 |
│ |
4 |
│ |
5 |
│ 6 |
║ |
|
║ theta |
║ |
-.12│ |
.05│ -.05│ |
.06│ |
.08│ |
.1│-.08│ .1│-.01│.12║ |
|||||||||||||
║ Ось вращения║ |
X |
│ |
X |
│ Y |
│ |
Z |
│ |
X |
│ |
Y |
│ X |
│ Y │ Z |
│ X ║ |
||||||
╚═════════════╩═════╧════╧═════╧════╧════╧════╧════╧═══╧════╧═══╝
где : obj_XY-тип плоского выпуклого многоугольника 3-треугольник,4-квадрат и т.д.
obj_XYZ-тип трехмерного объекта,который в обоих случаях является прямоугольной призмой, а каждая цифра соответствует числу сторон основания.Если одна цифра равна 1,то трехмерный объект представляет собой пирамиду. Например,13-пирамида с треугольным основанием 44-четырехугольная призма (параллелепипед ) и т.д.
Центр вращения и размера объекта студент выбирает самостоятельно. Примечание: скопированное в файле изображение экрана,которое должно содержать все цвета ,сохраняется для задания разноцветного фона в работе номер 13.
7. Содержание отчета
7.1.Тема лабораторной работы. 7.2.Цель работы.
7.3.порядок выполнения. 7.4.Индивидуальное задание. 7.5.Текст программы. 7.6.Результат работы программы. 7.7.Выводы.
Лабораторная работа N 18
ПОСТРОЕНИЕ ДВИЖУЩИХСЯ ИЗОБРАЖЕНИЙ НА ЭКРАНЕ. ОСНОВЫ КОМПЬЮТЕРНЫХ ИГР
1. Цель работы
Получение практических навыков в построении движущихся объектов на фоне неподвижного рисунка.
81
2. Темы для предварительной проработки
2.1. Изображение пикселя в режиме записи 0 при выполнении операции ИСКЛЮЧАЮЩЕЕ ИЛИ с цветом фона.
3. Описание работы
Многие видеоигры, в которых игрок управляет объектами, атакующими другие объекты, управляемые программой или защищающимися от них, включают два класса активных объектов: среду (представляющую для нас маломеняющееся поле игры) и спрайты. СПРАЙТ - это небольшой подвижный объект, который движется по полю видеоигры по определенным правилам с заданной целью.
В рамках данной работы под спрайтом будем понимать фигуру, определенную некоторыми замкнутыми отрезками. Хотя, в общем случае спрайт может изображаться любым образом, например, в виде окружности. Спрайт определяется в виде двумерного массива целых чисел. Например, спрайт, состоящий из 4 отрезков может быть описан следующим массивом
int sprite [4][4];
Первая размерность массива определяет количество отрезков спрайта, а вторая - координаты конечных точек отрезков. Начальные
иконечные координаты отрезков задаются в следующей последовательности:
start_x,start_y,end_x,end_y
Отрезок, входящий в спрайт, с координатами конечных точек 0,0
и0,10 может быть описан следующим массивом:
sprite[0][0] = 0; /* start_x */ sprite[0][1] = 0; /* start_y */ sprite[0][2] = 0; /* end_x */ sprite[0][3] = 10; /* end_y */
При таком описании программа,изображающая спрайт, аналогична программе изображения объекта в работе 17.
Поле игры одно или несколько изображается отдельными программами, которые хранятся в файлах и загружаются по мере необходимости. ( смотри лабораторную работу 17 ).
Ключевым и наиболее впечатляющим моментом видеоигры является мультипликация. Мультипликация - основной отличительный признак видеоигр. Основной метод мультипликации прост: уничтожить изображение предмета и создать его вновь, но с некоторым небольшим смещением. ( имитация движения ).
82
Скорость этого процесса должна быть очень высокой. Это может быть обеспеченно путем непосредственного доступа к видеопамяти дисплея, возможность которого рассматривалась в работе 15 ).
Для повышения качества изображения, быстродействия операций уничтожения и повторного изображения объекта используется операция "Исключающего или" для двоичного кода каждой точки объекта на экране. Если ваш язык программирования не содержит операции "Исключающего или", то ее можно получить X1^X2="НЕ"X1 и "X2" или X1 и"НЕ"X2. Этот способ обеспечивает возможность быстрого перемещения спрайта по экрану, не меняя цвет и размеры неподвижного изображения (фона). и фактически не уничтожая в памяти терминала данные о его изображении.
Это возможно потому,что для операции "Исключающего или" (сумма по модулю 2) справедливо соотношение
(fon^color)^color=fon;
где:^-символ "Исключающего или",т.е. повторное изображение спрайта в тех же позициях тем же "собственным" цветом color восстанавливает исходный цвет неподвижного рисунка fon, и нет необходимости сохранять в ОЗУ или файле часть экрана где будет изображаться спрайт. Следует отметить, что при первом изображении спрайта по выражению
color1=fon^color
"видимый" цвет спрайта color1 отличается от его "собственного" цвета color, причем если точки фона поверх которых изображается спрайт имеют разные цвета, то при одном и том же "собственном" цвете "видимый" цвет в этих точках отличается друг от друга.Спрайт словно хамелеон меняет свой цвет при движении по разноцветному экрану, всегда оставаясь видимым независимо от собственного цвета и цвета фона. Истинный собственный цвет спрайта можно узнать,поместив его на черный фон.Любителям экспериментировать с регистрами палитры следует учесть,что операция "Исключающего или" выполняется не над цветом, а над кодами номеров регистров палитры и, например, изменение регистра палитры собственного цвета спрайта color в случае,если в рисунке фона не используется регистр палитры, не вызовет никакого эффекта.
Наиболее быстрый и эффективный способ выполнить данную работу, использовать функцию изображения точки put_pix() из работы 15, в которой в качестве параметра задать логическую операцию "Исключающего или" и вызвать ее из функции line_m()(работа 16)- изображение линии по алгоритму Брезенхейма.
Рассмотрим кратко,как работает программа управления спрайтом. Клавиши управления курсором определяют положение спрайта. При на-
83
жатии клавиши спрайт смещается на одну точку растра в указанном направлении.Клавиши-стрелки управляют горизонтальными и вертикальными перемещениями,остальные-диагональными.Если возможен выход спрайта за пределы границ экрана,то такое перемещение запрещается.
Обычно необходимо выбирать размер объекта, который вы "оживляете" (особенно небольшого) для того, чтобы его можно было перерисовывать с высокой скоростью. Это обеспечивает плавность движения при мультипликации. Если объект достаточно большой , то его движение будет дискретно. При разработке видеоигр необходимо так подбирать размеры спрайта, чтобы возможности компьютера и адаптера реализовывались оптимальным образом.
Передвижение спрайта по экрану составляет только половину возможностей его "оживления". В основном спрайт будет использоваться на экране для того,чтобы создавать иллюзию движения. Например, спрайт, который выглядит подобно человеку, может передвигать ногами, как будто он идет. Этот тип "оживления" является наиболее впечатляющим (и наиболее легким). Для обеспечения такой возможности разрабатывают два или более вариантов спрайта, отличие между которыми заключается в том, что некоторые из частей спрайта отличаются от первоначального его варианта. Программа последовательно меняет варианты спрайта в процессе его движения по экрану.
Если спрайт изображается в виде правильного многоугольника с числом сторон n,то второй спрайт отображает ту же функцию, повернутую под углом 3.1418/n.Если составить программу движения спрайта с поочередной сменой типа,то будет создаваться впечатление, что фигура вращается в процессе передвижения по экрану. Переменная tip используется для выбора типа текущего спрайта.
Подобно остальным программам, программы видеоигр включают как операторы, так и данные. Кроме счета игры и статуса различных, расходуемых в процессе игры ресурсов (например, количество запущенных фотонных торпед), большинство данных, используемых в видеоигр, представляют собой позиции экрана для различных объектов. Координаты позиций экрана для движущихся объектов должны хранится в установленных переменных. Информацию о фиксированных объектов игрового поля целесообразно читать непосредственно с видеопамяти терминала.
В большинстве видеоигр существуют спрайты, которые находятся под управлением пользователя. Обычно игроку не разрешается перемещать спрайт через некоторые объекты игрового поля или через другой спрайт. Есть два способа ограничения местонахождения спрайта. В первом способе в установленных переменных хранятся граничные точки области, где разрешено движение спрайта. При передвижении спрайта
84
по экрану осуществляется контроль на выход за пределы этих допустимых значений.(Так контролируется выход спрайта за пределы экрана).
Однако этот метод обладает довольно малой реактивностью и для игр с большим количеством объектов неэффективен. Более удобным способом является простая проверка области экрана на предмет нахождения в ней какого-либо объекта путем контроля соответствующей области видеопамяти. Это обеспечивается тем, что информация об игровом поле уже находится в видеопамяти и бессмысленно ее где-либо дублировать.
В процессе игры удобно оперировать объектами разного цвета. Например, красный цвет может отображать границы непересекаемых областей, зеленый цвет используется для вашего спрайта, а желтый - для спрайта противника. Хотя это можно сделать с использованием переменных, описывающих эти объекты, часто бывает удобнее заранее определять для объектов его цвет. Это не только упростит процесс программирования видеоигры, но и сделает ее более быстродействующей. Например, если в красный цвет окрашена мина, то считается, что вы на ней подорвались лишь в том случае, если одна из точек вашего спрайта окрашивается в красный цвет.
Например, вы можете сделать спрайт игрока зеленым, спрайт компьютера - желтым, а границы поля игры - красным. В соответствии с этим подходом,подпрограмма перемещения спрайта игрока перед перемещением на новую позицию контролирует для крайних точек спрайта наличие красного цвета и в случае его обнаружения запрещает передвижение в данном направлении.
/* Проверка выхода за границу и перемещение спрайта */
for ( i=0 ; i<N ; i++ )
{
if ( ( ( sprite[i][0] + dx )<0 || ( ( sprite[i][2] + dx ) ) 639 ) ) dx=0;
if ( ( ( sprite[i][1] + dy )<0 || ( ( sprite[i][3] + dy ) ) 349 ) ) dy=0;
/* Проверка столкновений с bre_col */
if ( ( ( int ) getpixel( sprite[i][0]+dx,sprite[i][1] )==bre_col) ||( ( int ) getpixel( sprite[i][2]+dx,sprite[i][3] )==bre_col ) ) dx=0;
if ( ( ( int ) getpixel(sprite[i][0]+dy,sprite[i][1] )==bre_col) ||( ( int ) getpixel(sprite[i][2]+dy,sprite[i][3] )==bre_col)
dy=0; |
|
а подпрограмма перемещения спрайта компьютера( |
догоняющий |
85 |
|
спрайт ) аналогично контролирует зеленый цвет и фиксирует момент "касания". В данном случае для определения цвета точки эффективно используется режим чтения 1,описанный в работе 15.В данном случае, так же, значительно упрощается процесс ограничения области движения спрайтов красной линией.
Все видеоигры имеют одну главную общую деталь - программу, управляющую игрой. Алгоритм таких программ довольно сходен для различных видеоигр. Главная программа генерирует движение объектов по экрану, контролирует нажатие клавиш пользователем и реагирует на них, проверяет допустимость заданных перемещений, подсчитывает набранные очки и отображает счет, последовательно вызывает функции отображения объектов на экране.
Главная программа работает циклически. Проверяется, была ли нажата какая-либо клавиша. Если клавиша была нажата, то определяется ее код и производится заданное перемещение спрайта игрока.
После очередного перемещение спрайта игрока, компьютер генерирует движение собственного спрайта, если это необходимо. Для генерации движения спрайта используются различные функции в зависимости от того в режиме догоняющего или догоняемого находится спрайт. При реализации очередного перемещения собственного спрайта, компьютер так же проверяет его корректность.
4.Порядок выполнения работы.
Разработать программу,которая использует полученные в работе
15 функции put_pix() и get_col(),а также функцию line_m() из рабо-
ты 16 и сохраненное в файле изображение фона,содержащее все 16 цветов из работы 17,и выполняет следующие!действия.
4.1.Переводит систему в графический режим.
4.2.Загружает из файла в видеобуфер изображение фона.
4.3.Изображает спрайт get_sprite() на экране с использованием операции "Исключающего или".(Описания спрайта выбираются из таблицы индивидуальных заданий).
4.4.Управляет движением спрайта moxesprite() с учетом реакции игрока( кода нажатой клавиши ), контроля выхода за границы экрана и запрещенных областей заданных цветом bre_color.Программа movesprite() работает в цикле (выход из цикла по клавише ESC) и внутри цикла выполняет следующие действия:
86
4.4.1.Ожидает нажатия клавиши и чтения кода нажатой клавиши. 4.4.2.Стирает старое изображение спрайта путем повторного вы-
зова get_sprite() и использованием операции "Исключающего или". 4.4.3.В зависимости от нажатой клавиши задает смещение при
движении спрайта dx и dy из диапазона (+1,0,-1 );
4.4.4.Повторяет факт выхода за границу экрана или наличие запрещенной области и обнулении в случае необходимости соответствующей переменной dx и dy.
4.4.5.Вычисление новых координат в описаниях спрайтов sprite и sprite1 (повернутых на угол ) путем приращения столбцов описания start_x и end_x (0 и 2 столбец ) на dx и приращение start_Y и end_ y (1 и 3 столбец ) на dy.
4.4.6.Смена типа спрайта путем инверсии переменной tip. 4.4.7.Запись спрайта в новую позицию путем вызова функции get_
sprite() с использованием операции "Исключающее или различные функции в зависимости от того в режиме догоняющего или догоняемого находится
спрайт. При реализации очередного перемещения собственного спрайта, компьютер так же проверяет его корректность.
4.5.Возвращает систему в техтовый режим.
5. Особенности программирования.
Особенности программирования на языке Турбо-Паскаль и языке Турбо-Си не отличаются от аналогичных в работах 15-17.
6. Индивидуальные задания.
По первой цифре номера по журналу выбрать тип спрайта: 0- правильный многоугольник, 1- симметричная многолучевая звезда.
В таблице 1 по второй цифре номера по журналу выбрать параметры спрайта и игрового поля согласно таблице. Размеры спрайта выбираются 20 * 20 пикселей, и затем корректируются в зависимости от сложности изображения и разрешающей способности экрана.
Таблица 1 ╔═════════════╦════════════════════════════════════════╗
║ |
Параметры ║ |
Номер в журнале |
║ |
║ |
║ 0 1 2 3 4 5 6 7 8 |
9 ║ |
|
║═════════════╬═══╤═══╤═══╤═══╤═══╤═══╤═══╤═══╤════╤═══╣
║ |
n |
║ 3 │ 4 │ 5 │ 5 │ 4 │ 4 │ 3 │ 3 │ 4 |
│ 5 ║ |
║ |
bre_color |
║ 1 │ 2 │ 3 │ 4 │ 5 │ 6 │ 7 │ 8 │ 9 |
│ A ║ |
╚═════════════╩═══╧═══╧═══╧═══╧═══╧═══╧═══╧═══╧════╧═══╝
где : n - число сторон многоугольника или число лучей звезды.
87
7.Содержание отчета
7.1.Тема лабораторной работы. 7.2.Цель работы. 7.3.Индивидуальное задание. 7.4.Текст программы. 7.5.Результаты работы программы.
Литература
1.Фролов А.В., Фролов Г.В. Аппаратное обеспечение IBM PC:
В 2 ч. Ч. 1.-М.:"ДИАЛОГ-МИФИ", 1992.-208 с.- (Библиотека системного программиста; Т.2).
2.Джордейн Р. Справочник программиста персональных компьютеров типа IBM PC, XT и AT: Пер. с англ./Предисл. Н. В. Гайского.- М.:Финансы и статистика, 1992.-544 с.: ил.
3.Нортон П. Персональный компьютер фирмы IBM и операционная система MS-DOS: Пер. с англ.-М.: Радио и связь, 1992.-416 с.: ил.
4.Нортон П. Программно-аппаратная организация IBM PC: Пер. с англ.-М.: Радио и связь, 1991.-328 с.: ил.
5. Морс С.П., Алберт |
Д.Д. Архитектура микропроцессора 80286: Пер. |
с англ.-М.: Радио |
и связь, 1992. |
