Разработка игры 'Frag the monster'

  • Вид работы:
    Дипломная (ВКР)
  • Предмет:
    Информационное обеспечение, программирование
  • Язык:
    Русский
    ,
    Формат файла:
    MS Word
    2,37 Mb
  • Опубликовано:
    2011-12-27
Вы можете узнать стоимость помощи в написании студенческой работы.
Помощь в написании работы, которую точно примут!

Разработка игры 'Frag the monster'

Министерство образования и науки, молодежи и спорта Украины

Севастопольский национальный технический университет



Кафедра

Информационных систем



ПОЯСНИТЕЛЬНАЯ ЗАПИСКА

к курсовому проекту

на тему: Разработка игры «Frag the monster»

по курсу «Объектно-ориентированное программирование»

UA.02070973-01 81 01


Проверила

асс. Сметанина Т.И.

Разработали

Ст. группы И-33д

Вовченко В.С., Бахтишаева Т.Э., Мельников О.Ю.



Севастополь, 2011

АННОТАЦИЯ

игра программирование

В документе описывается программа, написанная в соответствии с постановкой задачи на курсовое проектирование по теме "Frag the monster" по дисциплине "Объектно-ориентированное программирование". Программа осуществляет вывод на экран случайным образом врагов, основного игрока и дополнительных объектов, а именно оружия. Входными данными является нажатие клавиш управления и движений мыши основным игроком. Программа написана с использованием основных свойств объектно-ориентированного подхода.

Назначение программы - развлечение играющих, совершенствование их координации и логического мышления. Программа может применяться в качестве игры на разных типах персональных компьютеров.

Требованием к аппаратному и программному обеспечению является наличие любого IBM-совместимого компьютера с наличием накопителя на гибких и (или) жестких магнитных дисках, видеоадаптера класса VGA и наличием достаточного количества оперативной памяти (достаточно 10Мб). На компьютере должна быть установлена операционная система Windows 2000 либо выше.

СОДЕРЖАНИЕ

ВВЕДЕНИЕ

1 ПОСТАНОВКА ЗАДАЧИ

ОПИСАНИЕ МЕТОДА РАЗРАБОТКИ

.1 Анализ проекта

.1.1 Описание объектов

.1.2 Построение иерархии классов

.1.3 Построение модели процесса

.1.4 Построение диаграмм переходов состояний

.1.5 Жизненный цикл игры

.1.6 Жизненный цикл игрока

.1.7 Структурная схема алгоритма программы

.2 Объектно-ориентированное проектирование

ПРОГРАМНАЯ РЕАЛИЗАЦИЯ

.1 Обоснование выбора языка программирования

.2 Описание основных классов

.2.1 Описание абстрактного класса Объект

.2.2 Описание класса Игрок

.2.3 Описание класса Враг

.2.4 Описание класса Оружие

ОПИСАНИЕ ИНТЕРФЕЙСА ПРОГРАММЫ

.1 Условия выполнения программы

.2 Интерфейс программы

.3 Критерий качества программы

ЗАКЛЮЧЕНИЕ

ПЕРЕЧЕНЬ ССЫЛОК

ПРИЛОЖЕНИЕ А

ВВЕДЕНИЕ

Документ содержит описание программы, написанной в Севастопольском национальном техническом университете на факультете Автоматики и вычислительной техники на кафедре Информационных систем в соответствии с постановкой задачи на курсовое проектирование по теме

«Frag the monster» по дисциплине "Объектно-ориентированное программирование". Программа осуществляет вывод на экран случайным образом врагов, основного игрока и дополнительных объектов, а именно оружия. Входными данными является нажатие клавиш управления и движений мыши основным игроком. Программа написана с использованием основных свойств объектно-ориентированного подхода.

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

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

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

1 ПОСТАНОВКА ЗАДАЧИ

Целью курсового проекта является разработка игры «Frag the monster». Создаются класс «объект» и два его наследника:

«оружие»;

«игрок» и его наследник: класс «враг».

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

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

2 ОПИСАНИЕ МЕТОДА РАЗРАБОТКИ

.1 Анализ проекта

Используя результаты проведения ООА, а также возможностей среды программирования Microsoft Visual Studio 2008, были разработаны классы, необходимые для функционирования игры.

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

·   Абстрактный класс (объект)

·        Класс игрок

·        Класс враг

·        Класс оружие

Теперь, представив требования к системе, приступим к ее моделированию. Применение в данной курсовой работе объектно-ориентированного подхода позволит наиболее эффективно использовать средства языка C++ для разработки системы.

.1.1 Описание объектов

Объектами в данной информационной модели, изображенной на рисунке 2.1, являются:  

-        объект класса Игрок;

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

Отношение между врагами и игроком - «много к одному», так как врагов много, а игрок один.











Рисунок 2.1 - Информационная модель

.1.2 Построение иерархии классов

Используя результаты проведения ООА, а также возможностей среды программирования Microsoft Visual Studio 2008 были разработаны классы, необходимые для функционирования системы.








Рисунок 2.2 - Иерархия классов

2.1.3 Построение модели процесса










Рисунок. 2.3 - Жизненный цикл программы.

.1.4 Построение диаграмм переходов состояния

Следующим этапом проектирования, будет построение диаграмм переходов состояний (ДПС) для объектов системы, которые выражают описание жизненного цикла каждого объекта.









Рисунок 2.4 - ДПС для всех объектов системы

Действия системы начинается с запуска программы. Затем управляем действиями игрока для возможности игры.

На рисунке 2.4 изображена диаграмма переходов состояний (ДПС) для объектов системы, которые выражают описание жизненного цикла каждого объекта.

.1.5 Жизненный цикл игры


Рисунок 2.5 - Жизненный цикл игры

А1 - Начало

А2 - Поиск оружия

А3 - Поиск врага

А4 - Конец игры

.1.6 Жизненный цикл игрока









Рисунок 2.6 - Жизненный цикл игрока

А1 - Создание объекта

А2 - Сбор оружия

А3 - Уничтожение врагов

А4 - Смерть игрока

A5 - Выход

.1.7 Структурная схема алгоритма программы

Рисунок 2.7 - Структурная схема алгоритма программы

2.2 Объектно-ориентированное проектирование

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

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

На базе построенных классов была реализована программа, реализующую игру «Frag The Monster». Дальнейшее описание основных методов и классов приводится в разделе «Программная реализация».

3 ПРОГРАМНАЯ РЕАЛИЗАЦИЯ

.1 Обоснование выбора языка программирования

При выполнении курсового проекта была возможность выбора языка программирования из языков высокого уровня, таких как Python, Object Раsса1, С++, С и др. Для написания программы был выбран язык С++.

Язык С++ считается языком системного программирования, хотя он удобен и для написания прикладных программ. Среди преимуществ языка С++ следует отметить переносимость программ на компьютеры различной архитектуры и из одной операционной системы в другую, лаконичность записи алгоритмов, логическую стройность программ, а также возможность получить программный код, сравнимый по скорости выполнения с программами, написанными на языке ассемблера. Последнее связано с тем, что хотя С++ является языком высокого уровня, имеющим полный набор конструкций структурного программирования, он также обладает набором низкоуровневых средств, обеспечивающих доступ к аппаратным средствам компьютера. С 1989 года язык С++ регламентируется стандартом Американского института национальных стандартов ANSI С.

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

.2 Описание основных классов

.2.1 Описание абстрактного класса Объект

class Object {:x, z;// положение объекта:

Object();// конструктор объекта

virtual float getX();// получение положения по оси Х

virtual float getZ();// получение положения по оси Z

virtual void setX(float x); // установка положения по оси Х

virtual void setZ(float z); // установка положения по оси Z

};

.2.2 Описание класса ИгрокPlayer: public Object {:heading;// направление движения:();// конструктор

~Player();// деструктор

bool charged;// флаг активности оружия

int killed, lifes;// количество очков, жизней

void setH(float heading);// установка направления движения

float getH();// получение направления движения

};

3.2.3 Описание класса ВрагEnemy: public Player {:

float speed, x_n, z_n;// скорость движ-я, коорд-ты конечной точки

bool moveflag;// флаг признака движения

public:

CMD2Model *model;// модель игрока

Enemy();// конструктор

~Enemy();// деструктор

void setMove(float x, float z);// ф-я установки координат движения

void move();// ф-я инициализации движения

void spot();// ф-я размещения врага на поле боя

bool OnPlace();// ф-я проверки достижения координат движения

};

.2.4 Описание класса ОружиеWeapon: public Object {:();// конструктор

~Weapon();// деструктор

void spot();// ф-я размещения врага на поле боя

float rotate;// коэффициент вращения

};

4 ОПИСАНИЕ ИНТЕРФЕЙСА ПРОГРАММЫ

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

.1 Условия выполнения программы

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

Требованием к аппаратному и программному обеспечению является наличие любого IBM-совместимого компьютера с наличием накопителя на гибких или жестких магнитных дисках и наличием достаточного количества оперативной памяти.

4.2 Интерфейс программы

Рисунок 4.1 - Интерфейс программы

Для запуска программы необходимо запустить файл FragTheMonster.exe, после чего на экране появится главное окно программы, показанное на рисунке 4.1. Программа имеет простой и доступный интерфейс. Все данные необходимые для участия в игровом процессе указаны на экране. Управление игрой осуществляется при помощи клавиш, описанных в таблице 4.1.

Задача игрока - уничтожить 5 противников. Для их уничтожения необходимо подобрать оружие - желтый куб (рисунок 4.2).

Рисунок 4.2 - Игровой куб

После захвата оружия игроку нужно атаковать врага, пробежав сквозь него, тем самым заработав очко (фраг) (рисунок 4.3).

Рисунок 4.3 - Получение очка игроком

Однако если атаковать врага, не подобрав оружия, можно лишиться одной из трёх жизней (рисунок 4.4).

У игры возможны два окончания: игрок уничтожает пять врагов и выигрывает (рисунок 4.5), либо игрок теряет все три жизни и проигрывает (рисунок 4.6).

Рисунок 4.4 - Потеря жизни игроком

Рисунок 4.5 - Конец игры, игрок выиграл

Рисунок 4.6 - Конец игры, игрок проиграл

Таблица 4.1 - Назначение клавиш

Название клавиши

Выполняемая функция

Стрелка вправо

Движение игрока вправо

Стрелка влево

Движение игрока влево

Стрелка вверх

Движение игрока вперед

Управление мышью

Изменение угла обзора

ESC

Выход из игры

F12

Смена полноэкранного/оконного режимов


.3 Критерий качества программы

1.       Критерии качества с точки зрения выполнения критериев объектно-ориентированного подхода:

- разработанные объекты содержат инкапсулированные данные и функции, сгруппированные вместе, что позволяет защитить данные;

в достаточной степени достигнута реализация абстрагирования, полиморфизма и наследования.

2.       С точки зрения функциональности:

- программа соответствует назначению, то есть, предназначена для игры;

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

3.       С точки зрения надежности:

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

4.       С точки зрения пригодности к использованию:

- программа обладает интуитивно понятным и простым интерфейсом;

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

5.       С точки зрения эффективности:

- данный программный продукт обладает высоким быстродействием и коротким временем отклика;

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

6.       С точки зрения сопровождаемости:

- программа пригодна к изменениям, то есть при появлении новых требований имеется возможность модифицирования программного кода;

программа обладает стабильностью.

7.       С точки зрения переносимости:

- программа обладает хорошей адаптируемостью и независимостью от устройств (способна работать на разнообразном аппаратном обеспечении);

продукт не требует инсталляции, то есть осуществляется запуск .exe-файла.

ЗАКЛЮЧЕНИЕ

Программа разработана в соответствии с постановкой задачи курсового проектирования по дисциплине «Объектно-ориентированное программирование». При написании были использованы методические указания по курсовому проектированию по дисциплине «Объектно-ориентированное программирование». Интерфейс программы прост и удобен в пользовании. Тестирование программы подтвердило, что программа корректно выполняет взаимодействие объектов различных классов в соответствии с вариантом.

Программа, реализующая данную объектную модель, написана в соответствии с основными принципами объектно-ориентированного программирования. В процессе написания программы были закреплены и усовершенствованы навыков работы в среде Microsoft Visual Studio 2008.

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

ПЕРЕЧЕНЬ ССЫЛОК

1.    Бадд Т. Объектно-ориентированное программирование в действии. Питер. 1997.

2.       Бондарев В.Н. Основы программирования. - Харьков: "Фолио"; Ростов-на-Дону: "Феникс", 1998. - 368 с.

.        Буч Г. Объектно-ориентированное проектирование с примерами применения: Пер с англ.-М.: Конкорд,1992.-519 с.

.        Доронина Ю.В. Конспект курса лекций по дисциплине "Объектно-ориентированное программирование".

.        Паппас К., Мюррей У. «Программирование на С и С++». - Киев: «Ирина», BHV, 2000. - 318 с.


ПРИЛОЖЕНИЕ А

Текст программы FragTheMonster.cpp

#include "stdafx.h"

#include "OOP_KURS.h"

#include "timer.h"*g_DI;// Direct Input*g_KDIDev;// клавиатура= NULL;// приватный контекст устройства GDI hRC = NULL;// постоянный контекст рендеринга

HWND hWnd = NULL; // дескриптор окна

HINSTANCEhInstance;// дескриптор приложения

BYTE buffer[256];// буфер для операций с клавиатурой

boolactive = TRUE; // флаг активности окна, в true по умолчанию

boolfullscreen = TRUE;// флаг режима окна, в полноэкранный по умолчанию

boolfsb;// флаг нажатия клавиши F12

constfloat piover180 = 0.0174532925f;

GLfloatyrot;= 0;= 0;= 0.0f;= 0.0f;// углубление в экранbase;gmf[256];[6];// массив под текстуры[4];*wzs;numwz; mpos;// позиция мыши

int adjust = 5;// корректировка скорости

// прототип функции WndProc

LRESULTCALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);

Player player;*enemy[5];enemy_count = 1;weapon;frag_timer = 0, life_timer = 0, game_over = 0, win = 0, start = 0; TimerInit(void)// инициализация таймера

{

memset(&timer, 0, sizeof(timer));// очистка структуры

// проверим доступность высокоточного таймера

// если доступен, то частота таймера будет задана

if (!QueryPerformanceFrequency((LARGE_INTEGER *) &timer.frequency))

{// нет высокоточного таймера

timer.performance_timer = FALSE;// установим флаг высокоточного таймера в ЛОЖЬ

timer.mm_timer_start= timeGetTime();// текущее время из timeGetTime().resolution= 1.0f/1000.0f;// точность равна 0.001f.frequency= 1000;// частота равна 1000.mm_timer_elapsed = timer.mm_timer_start; // прошедшее время равно текущему

} else {

// высокоточный таймер доступен, используем его вместо мультимедийного таймера

// взять текущее время и сохранить его в performance_timer_start

QueryPerformanceCounter((LARGE_INTEGER *) &timer.performance_timer_start);.performance_timer = TRUE; // Установить флаг наличия таймера в TRUE

// вычислить точность таймера, используя частоту.resolution= (float) (((double)1.0f)/((double)timer.frequency));

// присвоить прошедшему времени текущее время.performance_timer_elapsed = timer.performance_timer_start;

}

}TimerGetTime()// взять время в миллисекундах

{

__int64 time;// time содержит 64 бита(timer.performance_timer)// есть высокоточный таймер?

{((LARGE_INTEGER *) &time);//захват текущего значения высокоточного таймера

// вернем текущее время минус начальное время, умноженное на точность и 1000 (для миллисекунд)

return ((float) (time - timer.performance_timer_start) * timer.resolution)*1000.0f;

}

{((float) (timeGetTime() - timer.mm_timer_start) * timer.resolution)*1000.0f;

}

}readstr(FILE *f, char *string)

{(string, 255, f);((string[0] == '/') || (string[0] == '\n'));;

}SetupWorld()

{x, y, z, u, v;numtriangles;*filein;oneline[255];*fnm[4];[0] = "Data/World/sector1.txt";fnm[1] = "Data/World/sector2.txt";fnm[2] = "Data/World/sector3.txt";fnm[3] = "Data/World/sector4.txt";(int i = 0; i < 4; i++)

{= fopen(fnm[i], "rt");(filein, oneline);(oneline, "NUM_TR %d\n", &numtriangles);[i].triangle = new TRIANGLE[numtriangles];[i].numtriangles = numtriangles;(int loop = 0; loop < numtriangles; loop++)

{(filein, oneline);(oneline, "%i\n", &sector[i].triangle[loop].texture);(int vert = 0; vert < 3; vert++)

{(filein, oneline);(oneline, "%f %f %f %f %f %f %f", &x, &y, &z, &u, &v);[i].triangle[loop].vertex[vert].x = x;[i].triangle[loop].vertex[vert].y = y;[i].triangle[loop].vertex[vert].z = z;[i].triangle[loop].vertex[vert].u = u;[i].triangle[loop].vertex[vert].v = v;

}

}(filein);

}= fopen("Data/World/wzones.txt", "rt");(filein, oneline);(oneline, "NUM_P %d\n", &numtriangles);= new WZONE[numtriangles];= numtriangles;(int loop = 0; loop < numtriangles; loop++)

{(filein, oneline);(oneline, "%f %f", &x, &y);[loop].x = x;[loop].y = y;

}(filein);;

}point_in(float x, float y)

{const int q_patt[2][2] = { {0,1}, {3,2} };pred_pt, cur_pt;_pt.x = wzs[numwz-1].x;_pt.y = wzs[numwz-1].y;_pt.x -= x;_pt.y -= y;pred_q = q_patt[pred_pt.y < 0][pred_pt.x < 0];w = 0;(int i = 0; i < numwz; i++)

{_pt.x = wzs[i].x;_pt.y = wzs[i].y;_pt.x -= x;_pt.y -= y;q = q_patt[cur_pt.y < 0][cur_pt.x < 0];(q - pred_q)

{-3:

++w;;3:

-w;;-2:(pred_pt.x * cur_pt.y >= pred_pt.y * cur_pt.x)

++w;;2:(!(pred_pt.x * cur_pt.y >= pred_pt.y * cur_pt.x))

-w;;

}_pt = cur_pt;_q = q;

}w != 0;

}_RGBImageRec * LoadBMP(char *Filename)

{*File=NULL;(!Filename)

{NULL;

}= fopen(Filename, "r");(File)

{(File);auxDIBImageLoadA(Filename);

}NULL;

}LoadGLTextures()

(TextureImage[1] = LoadBMP("Data/light1.bmp")) &&

(TextureImage[2] = LoadBMP("Data/rustyblue.bmp")) &&

(TextureImage[3] = LoadBMP("Data/weirdbrick.bmp")) &&

(TextureImage[4] = LoadBMP("Data/crate.bmp"))&&

(TextureImage[5] = LoadBMP("Data/weapon.bmp")))

{= TRUE;(6, &texture[0]);(int loop1 = 0; loop1 < 6; loop1++)

{(GL_TEXTURE_2D, texture[loop1]);D(GL_TEXTURE_2D, 0, 3, TextureImage[loop1]->sizeX, TextureImage[loop1]->sizeY, 0, GL_RGB, GL_UNSIGNED_BYTE, TextureImage[loop1]->data);(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);

}(int loop1 = 0; loop1 < 6; loop1++)

{(TextureImage[loop1])

{(TextureImage[loop1]->data)

{(TextureImage[loop1]->data);

}(TextureImage[loop1]);

}

}

}[0] = new Enemy();[0]->model = new CMD2Model();[0]->model->LoadModel("Data/Models/Ogr.md2");[0]->model->LoadSkin("Data/Models/Ogr.pcx");[0]->model->SetAnim(STAND);[0]->model->ScaleModel(0.03);[0]->spot();.spot();Status;

}ReSizeGLScene(GLsizei width, GLsizei height)

{(height == 0)

{= 1;

}(0, 0, width, height);(GL_PROJECTION);();(45.0f,(GLfloat)width/(GLfloat)height,0.1f,100.0f);(GL_MODELVIEW);();

}BuildFont(GLvoid)

{font;= glGenLists(256);= CreateFont( -12,0,0,0,FW_BOLD,FALSE,FALSE,FALSE,ANSI_CHARSET,OUT_TT_PRECIS,CLIP_DEFAULT_PRECIS,ANTIALIASED_QUALITY,FF_DONTCARE|DEFAULT_PITCH,(LPCWSTR)L"Arial(hDC, font(hDC,0,256, base, 0.0f, 0.2f, WGL_FONT_POLYGONS, gmf);

}glPrint(float x, float y, float z, const char *fmt, ...)

{length = 0;text[256];_list ap;(fmt == NULL);
va_start(ap, fmt);(text, fmt, ap);_end(ap);(unsigned int loop=0;loop<(strlen(text));loop++)+= gmf[(unsigned char)text[loop]].gmfCellIncX;(x, y, z);(GL_TEXTURE_2D, 0);(GL_LIST_BIT);(base);(strlen(text), GL_UNSIGNED_BYTE, text);();

}InitGL(GLvoid)

{(!LoadGLTextures())

{FALSE;

}(GL_TEXTURE_2D);(GL_SRC_ALPHA, GL_ONE);(0.0f, 0.0f, 0.0f, 0.0f);(1.0f);(GL_LEQUAL);(GL_DEPTH_TEST);(GL_SMOOTH);(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST);();();::GetInstance()->Initialize();.setX(0);.setZ(-27);.setH(-180);= 1;TRUE;

}DrawGLScene(GLvoid)

{(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);();::GetInstance()->Update();timesec = CTimer::GetInstance()->GetTimeMSec() / 1000.0;x_m, y_m, z_m, u_m, v_m;xtrans = -player.getX();ztrans = -player.getZ();;ytrans = -walkbias-0.25f;sceneroty = 360.0f - yrot;numtriangles;(lookupdown, 1.0f, 0, 0);(sceneroty, 0, 1.0f, 0);(xtrans, ytrans, ztrans);(int i = 0; i < 4; i++)

{= sector[i].numtriangles;(int loop_m = 0; loop_m < numtriangles; loop_m++)

{(GL_TEXTURE_2D, texture[sector[i].triangle[loop_m].texture]);(GL_TRIANGLES);f(0.0f, 0.0f, 1.0f);_m = sector[i].triangle[loop_m].vertex[0].x;_m = sector[i].triangle[loop_m].vertex[0].y;_m = sector[i].triangle[loop_m].vertex[0].z;_m = sector[i].triangle[loop_m].vertex[0].u;_m = sector[i].triangle[loop_m].vertex[0].v;f(u_m,v_m); glVertex3f(x_m,y_m,z_m);_m = sector[i].triangle[loop_m].vertex[1].x;_m = sector[i].triangle[loop_m].vertex[1].y;_m = sector[i].triangle[loop_m].vertex[1].z;_m = sector[i].triangle[loop_m].vertex[1].u;_m = sector[i].triangle[loop_m].vertex[1].v;f(u_m,v_m); glVertex3f(x_m,y_m,z_m);_m = sector[i].triangle[loop_m].vertex[2].x;_m = sector[i].triangle[loop_m].vertex[2].y;_m = sector[i].triangle[loop_m].vertex[2].z;_m = sector[i].triangle[loop_m].vertex[2].u;_m = sector[i].triangle[loop_m].vertex[2].v;f(u_m,v_m); glVertex3f(x_m,y_m,z_m);();

}

}(weapon.active) {(weapon.getX(), -0.2f, weapon.getZ());(weapon.rotate, 1.0f,1.0f,1.0f);(GL_TEXTURE_2D, 6);(GL_QUADS);f( 0.2f, 0.2f,-0.2f);f(-0.2f, 0.2f,-0.2f);f(-0.2f, 0.2f, 0.2f);f( 0.2f, 0.2f, 0.2f);f( 0.2f,-0.2f, 0.2f);f(-0.2f,-0.2f, 0.2f);f(-0.2f,-0.2f,-0.2f);

glVertex3f( 0.2f,-0.2f,-0.2f);f( 0.2f, 0.2f, 0.2f);f(-0.2f, 0.2f, 0.2f);f(-0.2f,-0.2f, 0.2f);f( 0.2f,-0.2f, 0.2f);f( 0.2f,-0.2f,-0.2f);f(-0.2f,-0.2f,-0.2f);f(-0.2f, 0.2f,-0.2f);f( 0.2f, 0.2f,-0.2f);f(-0.2f, 0.2f, 0.2f);f(-0.2f, 0.2f,-0.2f);f(-0.2f,-0.2f,-0.2f);f(-0.2f,-0.2f, 0.2f);f( 0.2f, 0.2f,-0.2f); f( 0.2f, 0.2f, 0.2f);f( 0.2f,-0.2f, 0.2f);f( 0.2f,-0.2f,-0.2f);();.rotate += 0.8f;

}();(lookupdown, 1.0f, 0, 0);(sceneroty, 0, 1.0f, 0);(xtrans, ytrans, ztrans);(GL_FRONT_AND_BACK, GL_FILL);(int i = 0; i < enemy_count; i++) {(enemy[i]->getX(), -0.25f, enemy[i]->getZ());[i]->move();[i]->model->DrawModel(timesec);(i == enemy_count-1);();(lookupdown, 1.0f, 0, 0);(sceneroty, 0, 1.0f, 0);(xtrans, ytrans, ztrans);

}(enemy_count && rand()%1000 < 30) {[rand()%enemy_count]->setMove(player.getX(), player.getZ());

}();(GL_DEPTH_BUFFER_BIT);(-16.0f, 11.0f, -30.0f, "FPS: %2.2f", CTimer::GetInstance()->GetFps());();(player.charged) {(-8.0f, -6.0f, -15.0f, "ATTACK!");

} else {(-8.0f, -6.0f, -15.0f, "GET A CUBE!");

}();(6.7f, -7.0f, -20.0f, "LIFES: %d", player.lifes);();(6.7f, -8.0f, -20.0f, "FRAGS: %d", player.killed);(frag_timer > 0) {((frag_timer + 3) < (CTimer::GetInstance()->GetTimeMSec() / 1000.0))_timer = 0;{();(-1.0f, 1.0f, -10.0f, "FRAG!");

}

}(life_timer > 0) {((life_timer + 3) < (CTimer::GetInstance()->GetTimeMSec() / 1000.0))_timer = 0;{();(-2.1f, -1.0f, -10.0f, "LOST LIFE!");

}

}(game_over > 0) {((game_over + 3) < (CTimer::GetInstance()->GetTimeMSec() / 1000.0))_over = 666;{();(-2.9f, 0.0f, -6.0f, "GAME OVER");

}

}(win > 0) {((win + 3) < (CTimer::GetInstance()->GetTimeMSec() / 1000.0))= 666;{();(-2.0f, -0.1f, -6.0f, "YOU WIN!");

}

}(start > 0) {((start + 5) < (CTimer::GetInstance()->GetTimeMSec() / 1000.0))= 0;{();(-10.0f, 5.0f, -19.0f, "FIND THE CUBE, THEN FRAG THE MONSTER!");();(-4.0f, -4.0f, -23.0f, "FRAG 5 MONSTERS");();();(-10.5f, -5.0f, -20.0f, "DON'T GET HIT BY THE MONSTER, OR YOU DIE!");

}

}true;

}KillGLWindow(GLvoid)

{(fullscreen)

{(NULL,0);(TRUE);

}(hRC)

{(!wglMakeCurrent(NULL,NULL))

{(NULL,(LPCWSTR)L"Release Of DC And RC Failed.",(LPCWSTR)L"SHUTDOWN ERROR",MB_OK | MB_ICONINFORMATION);

}(!wglDeleteContext(hRC))

{(NULL,(LPCWSTR)L"Release Rendering Context Failed.",(LPCWSTR)L"SHUTDOWN ERROR",MB_OK | MB_ICONINFORMATION);

}= NULL;

}(hDC && !ReleaseDC(hWnd,hDC))

{(NULL,(LPCWSTR)L"Release Device Context Failed.",(LPCWSTR)L"SHUTDOWN ERROR",MB_OK | MB_ICONINFORMATION);= NULL;

}(hWnd && !DestroyWindow(hWnd))

{(NULL,(LPCWSTR)L"Could Not Release hWnd.",(LPCWSTR)L"SHUTDOWN ERROR",MB_OK | MB_ICONINFORMATION);= NULL;

}(!UnregisterClass((LPCWSTR)L"OpenGL",hInstance))

{(NULL,(LPCWSTR)L"Could Not Unregister Class.",(LPCWSTR)L"SHUTDOWN ERROR",MB_OK | MB_ICONINFORMATION);= NULL;

}

}CreateGLWindow(char* title, int width, int height, int bits, bool fullscreenflag)

{;;;;;.left= (long)0;.right= (long)width;.top= (long)0;.bottom= (long)height;= fullscreenflag;= GetModuleHandle(NULL);.style= CS_HREDRAW | CS_VREDRAW | CS_OWNDC;.lpfnWndProc= (WNDPROC) WndProc;.cbClsExtra= 0;.cbWndExtra= 0;.hInstance= hInstance;.hIcon= LoadIcon(NULL, IDI_WINLOGO);.hCursor= LoadCursor(NULL, IDC_ARROW);.hbrBackground= NULL;.lpszMenuName= NULL;.lpszClassName= (LPCWSTR)L"OpenGL";(!RegisterClass(&wc))

{(NULL,(LPCWSTR)L"Failed To Register The Window Class.",(LPCWSTR)L"ERROR",MB_OK|MB_ICONEXCLAMATION);FALSE;

}(fullscreen)

{dmScreenSettings;(&dmScreenSettings,0,sizeof(dmScreenSettings));.dmSize= sizeof(dmScreenSettings);.dmPelsWidth= width;.dmPelsHeight= height;.dmBitsPerPel= bits;.dmFields= DM_BITSPERPEL|DM_PELSWIDTH|DM_PELSHEIGHT;(ChangeDisplaySettings(&dmScreenSettings,CDS_FULLSCREEN) != DISP_CHANGE_SUCCESSFUL)

{= FALSE;

}

{(NULL,(LPCWSTR)L"Программа будет закрыта",(LPCWSTR)L"ERROR",MB_OK|MB_ICONSTOP);FALSE;

}

}

}(FALSE);(fullscreen)

{= WS_EX_APPWINDOW;= WS_POPUP;

} else {= WS_EX_APPWINDOW | WS_EX_WINDOWEDGE;= WS_OVERLAPPEDWINDOW;

}(&WindowRect, dwStyle, FALSE, dwExStyle);if (!(hWnd=CreateWindowEx(dwExStyle,(LPCWSTR)L"OpenGL",

(LPCWSTR)L"Frag The Monster", dwStyle |WS_CLIPSIBLINGS | WS_CLIPCHILDREN, 0, 0,WindowRect.right-WindowRect.left, WindowRect.bottom-WindowRect.top,NULL,NULL,hInstance,NULL)))

{();(NULL,(LPCWSTR)L"Ошибка создания окна.",(LPCWSTR)L"ERROR",MB_OK|MB_ICONEXCLAMATION);FALSE;

}pfd=

{sizeof(PIXELFORMATDESCRIPTOR),1,PFD_DRAW_TO_WINDOW | PFD_SUPPORT_OPENGL | PFD_DOUBLEBUFFER, PFD_TYPE_RGBA, bits,

, 0, 0, 0, 0, 0, 0,0,0,0, 0, 0, 0,16,0,0,PFD_MAIN_PLANE,0,0, 0, 0

};(!(hDC = GetDC(hWnd)))

{();(NULL,(LPCWSTR)L"Can't Create A GL Device Context.",(LPCWSTR)L"ERROR",MB_OK|MB_ICONEXCLAMATION);FALSE;

}(!(PixelFormat=ChoosePixelFormat(hDC,&pfd)))

{();(NULL,(LPCWSTR)L"Can't Find A Suitable PixelFormat.",(LPCWSTR)L"ERROR",MB_OK|MB_ICONEXCLAMATION);FALSE;

}(!SetPixelFormat(hDC,PixelFormat,&pfd))

{();(NULL,(LPCWSTR)L"Can't Set The PixelFormat.",(LPCWSTR)L"ERROR",MB_OK|MB_ICONEXCLAMATION);FALSE;

}(!(hRC=wglCreateContext(hDC)))

{();(NULL,(LPCWSTR)L"Can't Create A GL Rendering Context.",(LPCWSTR)L"ERROR",MB_OK|MB_ICONEXCLAMATION);FALSE;

}(!wglMakeCurrent(hDC,hRC))

{();(NULL,(LPCWSTR)L"Can't Activate The GL Rendering Context.",(LPCWSTR)L"ERROR",MB_OK|MB_ICONEXCLAMATION);FALSE;

}(hWnd,SW_SHOW);(hWnd);(hWnd);(width, height);(!InitGL())

{();(NULL,(LPCWSTR)L"Initialization Failed.",(LPCWSTR)L"ERROR",MB_OK|MB_ICONEXCLAMATION);FALSE;

}TRUE;

}DI_Init()

{( DirectInput8Create( hInstance,_VERSION,_IDirectInput8,

(void**)&g_DI,) )

{(false);

}( g_DI->CreateDevice( GUID_SysKeyboard,

&g_KDIDev,) )

{(false);

}( g_KDIDev->SetDataFormat(&c_dfDIKeyboard) )

{(false);

}( g_KDIDev->SetCooperativeLevel(hWnd, DISCL_FOREGROUND | DISCL_EXCLUSIVE) )

{(false);

}(g_KDIDev)_KDIDev->Acquire();(false);(true);

}DX_End()

{(g_DI)

{(g_KDIDev)

{_KDIDev->Unacquire();_KDIDev->Release();_KDIDev = NULL;

}_DI->Release();_DI = NULL;

}

}CALLBACK WndProc(HWNDhWnd,UINTuMsg,WPARAMwParam, LPARAM lParam)

{(uMsg)

{WM_ACTIVATE:

{(!HIWORD(wParam))

{= TRUE;

}

{= FALSE;

}0;

}WM_SYSCOMMAND:

{(wParam)

{SC_SCREENSAVE:SC_MONITORPOWER:0;

};

}WM_CLOSE:

{(0);0;

}WM_SIZE:

{(LOWORD(lParam),HIWORD(lParam));0;

}

}DefWindowProc(hWnd,uMsg,wParam,lParam);

}WINAPI WinMain(HINSTANCEhInstance, HINSTANCEhPrevInstance, LPSTRlpCmdLine, intnCmdShow)

{;= false;(MessageBox(NULL,(LPCWSTR)L"Запустить в полноэкранном режиме?", (LPCWSTR)L"На весь экран?",MB_YESNO|MB_ICONQUESTION)==IDNO)

{= false;

}(!CreateGLWindow("Frag The Monster", 1024, 768, 32, fullscreen))

{0;

}(!DI_Init())

{0;

{(PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))

{(msg.message == WM_QUIT)

{= true;

}

{(&msg);(&msg);

}

}

{start = TimerGetTime();((active && !DrawGLScene()))

{= true;

}

{(game_over == 666 || win == 666)= true;(TimerGetTime() < start + float(adjust*2.0f))(hDC);(&mpos);(512, 384);.setH(player.getH() + (float)(512 - mpos.x)/100 * 5);= player.getH();= (float)(384 - mpos.y)/100 * 5;hr = g_KDIDev->GetDeviceState(sizeof(buffer), &buffer);xpos_tmp, zpos_tmp;( buffer[DIK_ESCAPE] & 0x80 )

{= true;

}(floor(player.getX()) == floor(weapon.getX()) && floor(player.getZ()) == floor(weapon.getZ())) {.active = false;.charged = true;

}(int i = 0; i < enemy_count; i++) {(floor(player.getX()) == floor(enemy[i]->getX()) && floor(player.getZ()) == floor(enemy[i]->getZ())) {(player.charged) {.killed++;(player.killed == 5) {= CTimer::GetInstance()->GetTimeMSec() / 1000.0;;

}.active = true;.spot();.charged = false;_count += 1 + rand()%2;(enemy_count > 5)_count = 5;(int k = 0; k < enemy_count; k++) {[k] = new Enemy();[k]->model = new CMD2Model();[k]->model->LoadModel("Data/Models/Ogr.md2");[k]->model->LoadSkin("Data/Models/Ogr.pcx");[k]->model->SetAnim(STAND);[k]->model->ScaleModel(0.03);[k]->spot();

}_timer = CTimer::GetInstance()->GetTimeMSec() / 1000.0;

} else {.lifes -= 1;_timer = CTimer::GetInstance()->GetTimeMSec() / 1000.0;[i]->spot();(player.lifes == 0 && game_over != 666) {_over = CTimer::GetInstance()->GetTimeMSec() / 1000.0;

}

};

}

}(game_over == 0) {( buffer[DIK_UP] || buffer[DIK_W] & 0x80 )

{_tmp = player.getX() - (float)sin(player.getH()*piover180) * 0.05f;_tmp = player.getZ() - (float)cos(player.getH()*piover180) * 0.05f;(point_in(xpos_tmp, zpos_tmp))

{.setX(xpos_tmp);.setZ(zpos_tmp);

}(walkbiasangle >= 359.0f)= 0.0f;+= 10;= (float)sin(walkbiasangle * piover180)/20.0f;

}( buffer[DIK_DOWN] || buffer[DIK_S] & 0x80 )

{_tmp = player.getX() + (float)sin(player.getH()*piover180) * 0.05f;_tmp = player.getZ() + (float)cos(player.getH()*piover180) * 0.05f;(point_in(xpos_tmp, zpos_tmp))

{.setX(xpos_tmp);.setZ(zpos_tmp);

}(walkbiasangle <= 1.0f)= 359.0f;= 10;= (float)sin(walkbiasangle * piover180)/20.0f;

}( buffer[DIK_LEFT] || buffer[DIK_A] & 0x80 )

{_tmp = player.getX() + (float)sin((player.getH() - 90)*piover180) * 0.05f;_tmp = player.getZ() + (float)cos((player.getH() - 90)*piover180) * 0.05f;(point_in(xpos_tmp, zpos_tmp))

{.setX(xpos_tmp);.setZ(zpos_tmp);

}(walkbiasangle <= 1.0f)= 359.0f;= 10;= (float)sin(walkbiasangle * piover180)/20.0f;

}( buffer[DIK_RIGHT] || buffer[DIK_D] & 0x80 )

{_tmp = player.getX() + (float)sin((player.getH() + 90)*piover180) * 0.05f;_tmp = player.getZ() + (float)cos((player.getH() + 90)*piover180) * 0.05f;(point_in(xpos_tmp, zpos_tmp))

{.setX(xpos_tmp);.setZ(zpos_tmp);

}(walkbiasangle <= 1.0f)= 359.0f;= 10;= (float)sin(walkbiasangle * piover180)/20.0f;

}

}( buffer[DIK_ADD] & 0x80 )

{+= 1;

}( buffer[DIK_SUBTRACT] & 0x80 )

{-= 1;(adjust < 1)= 1;

}( buffer[DIK_F12] & 0x80 )

{(!fsb)

{= true;();= !fullscreen;(!CreateGLWindow("Frag The Monster", 1024, 768, 32, fullscreen))

{0;

}(!DI_Init())

{0;

}

}

}

{= false;

}

}

}

}_End();();.~Player();(msg.wParam);

}


Не нашли материал для своей работы?
Поможем написать уникальную работу
Без плагиата!