Разработка игры "Frag the monster" - Программирование, компьютеры и кибернетика курсовая работа

Разработка игры "Frag the monster" - Программирование, компьютеры и кибернетика курсовая работа



































Разработка игровой программы "Frag the monster", которая осуществляет вывод на экран случайным образом врагов, основного игрока и дополнительных объектов (оружия). Обоснование выбора языка программирования - С++. Интерфейс и принцип работы программы.


посмотреть текст работы


скачать работу можно здесь


полная информация о работе


весь список подобных работ


Нужна помощь с учёбой? Наши эксперты готовы помочь!
Нажимая на кнопку, вы соглашаетесь с
политикой обработки персональных данных

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

Министерство образования и науки, молодежи и спорта Украины
Севастопольский национальный технический университет
на тему: Разработка игры « Frag the monster »
по курсу «Объектно-ориентированное программирование»
Вовченко В.С., Бахтишаева Т.Э., Мельников О.Ю.
В документе описывается программа, написанная в соответствии с постановкой задачи на курсовое проектирование по теме "Frag the monster" по дисциплине "Объектно-ориентированное программирование". Программа осуществляет вывод на экран случайным образом врагов, основного игрока и дополнительных объектов, а именно оружия. Входными данными является нажатие клавиш управления и движений мыши основным игроком. Программа написана с использованием основных свойств объектно-ориентированного подхода.
Назначение программы - развлечение играющих, совершенствование их координации и логического мышления. Программа может применяться в качестве игры на разных типах персональных компьютеров.
Требованием к аппаратному и программному обеспечению является наличие любого IBM-совместимого компьютера с наличием накопителя на гибких и (или) жестких магнитных дисках, видеоадаптера класса VGA и наличием достаточного количества оперативной памяти (достаточно 10Мб). На компьютере должна быть установлена операционная система Windows 2000 либо выше.
2.1.4 Построение диаграмм переходов состояний
2.1.7 Структурная схема алгоритма программы
2.2 Объектно-ориентированное проектирование
3.1 Обоснование выбора языка программирования
3.2.1 Описание абстрактного класса Объект
Документ содержит описание программы, написанной в Севастопольском национальном техническом университете на факультете Автоматики и вычислительной техники на кафедре Информационных систем в соответствии с постановкой задачи на курсовое проектирование по теме
«Frag the monster» по дисциплине "Объектно-ориентированное программирование". Программа осуществляет вывод на экран случайным образом врагов, основного игрока и дополнительных объектов, а именно оружия. Входными данными является нажатие клавиш управления и движений мыши основным игроком. Программа написана с использованием основных свойств объектно-ориентированного подхода.
Как известно, объектный подход - один из современных методов реализации программных систем. Наиболее показательна эффективность применения объектного подхода для больших программных систем, со сложным характером взаимодействия значительного количества элементов.
В курсовом проекте поставлена задача закрепления навыков применения объектно-ориентированного анализа к предметной области поставленной задачи, а так же реализовать объектную модель средствами объектно-ориентированного языка программирования С++.
Систематическое применение объектно-ориентированного подхода позволяет разрабатывать достаточно хорошо структурированные, надежные в эксплуатации, просто модифицируемые программные системы. Элементы объектно-ориентированного программирования получили свое развитие, и в настоящее время ООП принадлежит к числу ведущих технологий программирования.
Целью курсового проекта является разработка игры «Frag the monster». Создаются класс «объект» и два его наследника:
- «игрок» и его наследник: класс «враг».
Случайным образом на поле боя появляются враги. Задача игрока состоит в уничтожении врагов при помощи найденного им оружия. Управление игрой осуществляется при помощи клавиатуры и мыши.
Игрок имеет в своём запасе три жизни. Игра заканчивается когда игрок либо лишается всех трёх жизней, либо уничтожает пятерых врагов.
Используя результаты проведения ООА, а также возможностей среды программирования Microsoft Visual Studio 2008, были разработаны классы, необходимые для функционирования игры.
На первом этапе анализа необходимо сформулировать требования к курсовой работе. Программа должна иметь возможность посредством графического интерфейса отображать объекты смоделированной системы:
Теперь, представив требования к системе, приступим к ее моделированию. Применение в данной курсовой работе объектно-ориентированного подхода позволит наиболее эффективно использовать средства языка C++ для разработки системы.
Для этих объектов вызываются методы, которые позволяют управлять действиями игровых элементов.
Отношение между врагами и игроком - «много к одному», так как врагов много, а игрок один.
Рисунок 2.1 - Информационная модель
Используя результаты проведения ООА, а также возможностей среды программирования Microsoft Visual Studio 2008 были разработаны классы, необходимые для функционирования системы.
Рисунок. 2.3 - Жизненный цикл программы.
2.1.4 Построение диаграмм переходов состояния
Следующим этапом проектирования, будет построение диаграмм переходов состояний (ДПС) для объектов системы, которые выражают описание жизненного цикла каждого объекта.
Рисунок 2.4 - ДПС для всех объектов системы
Действия системы начинается с запуска программы. Затем управляем действиями игрока для возможности игры.
На рисунке 2.4 изображена диаграмма переходов состояний (ДПС) для объектов системы, которые выражают описание жизненного цикла каждого объекта.
Рисунок 2.6 - Жизненный цикл игрока
2.1.7 Структурная схема алгоритма программы
Рисунок 2.7 - Структурная схема алгоритма программы
2.2 Объектно-ориентированное проектирование
Процесс объектно-ориентированного проектирования является возвратным проектированием и состоит в идентификации классов и объектов, определения свойств этих классов и объектов с точки зрения взаимосвязей с другими классами и создания классов и объектов.
Идентификации классов и объектов, определение свойств этих классов и объектов с точки зрения взаимосвязей с другими классами и создание классов и объектов необходимо вести с учетом особенностей средств, предоставляемых выбранной средой программирования. Эти процессы необходимо производить также с учетом результатов проведения объектно-ориентированного анализа.
На базе построенных классов была реализована программа, реализующую игру «Frag The Monster». Дальнейшее описание основных методов и классов приводится в разделе «Программная реализация».
3.1 Обоснование выбора языка программирования
При выполнении курсового проекта была возможность выбора языка программирования из языков высокого уровня, таких как Python, Object Раsса1, С++, С и др. Для написания программы был выбран язык С++.
Язык С++ считается языком системного программирования, хотя он удобен и для написания прикладных программ. Среди преимуществ языка С++ следует отметить переносимость программ на компьютеры различной архитектуры и из одной операционной системы в другую, лаконичность записи алгоритмов, логическую стройность программ, а также возможность получить программный код, сравнимый по скорости выполнения с программами, написанными на языке ассемблера. Последнее связано с тем, что хотя С++ является языком высокого уровня, имеющим полный набор конструкций структурного программирования, он также обладает набором низкоуровневых средств, обеспечивающих доступ к аппаратным средствам компьютера. С 1989 года язык С++ регламентируется стандартом Американского института национальных стандартов ANSI С.
ООП дает программистам три важных преимущества. Первое состоит в упрощении программного кода и улучшении его структуризации. Программы стали проще для чтения и понимания. Код описания классов, как правило, отделен от кода основной части программы, благодаря чему над ними можно работать по отдельности, все это в свою очередь упрощает процесс отладки и сопровождения программы. Второе преимущество заключается в том, что модернизация программ становится несравнимо более простой задачей. Чаще всего она сводится к добавлению нового класса, который наследует все свойства одного из имеющихся классов и содержит требуемые дополнительные методы. Третье преимущество состоит в том, что одни и те же классы можно много раз использовать в разных программах. Удачно созданный класс можно сохранить отдельно в библиотечном файле, и его добавление в программу, как правило, не требует внесения серьезных изменений в текст.
3.2.1 Описание абстрактного класса Объект
virtual float getX();// получение положения по оси Х
virtual float getZ();// получение положения по оси Z
virtual void setX(float x); // установка положения по оси Х
virtual void setZ(float z); // установка положения по оси Z
float heading;// направление движения
bool charged;// флаг активности оружия
int killed, lifes;// количество очков, жизней
void setH(float heading);// установка направления движения
float getH();// получение направления движения
float speed, x_n, z_n;// скорость движ-я, коорд-ты конечной точки
bool moveflag;// флаг признака движения
void setMove(float x, float z);// ф-я установки координат движения
void move();// ф-я инициализации движения
void spot();// ф-я размещения врага на поле боя
bool OnPlace();// ф-я проверки достижения координат движения
void spot();// ф-я размещения врага на поле боя
float rotate;// коэффициент вращения
Написанная программа является игрой и не несет в себе научно-познавательного содержания.
Программа может работать под управлением операционной системы Windows 2000, а также других, более новых, версиях ОС этого семейства.
Требованием к аппаратному и программному обеспечению является наличие любого IBM-совместимого компьютера с наличием накопителя на гибких или жестких магнитных дисках и наличием достаточного количества оперативной памяти.
Для запуска программы необходимо запустить файл FragTheMonster.exe, после чего на экране появится главное окно программы, показанное на рисунке 4.1. Программа имеет простой и доступный интерфейс. Все данные необходимые для участия в игровом процессе указаны на экране. Управление игрой осуществляется при помощи клавиш, описанных в таблице 4.1.
Задача игрока - уничтожить 5 противников. Для их уничтожения необходимо подобрать оружие - желтый куб (рисунок 4.2).
После захвата оружия игроку нужно атаковать врага, пробежав сквозь него, тем самым заработав очко (фраг) (рисунок 4.3).
Рисунок 4.3 - Получение очка игроком
Однако если атаковать врага, не подобрав оружия, можно лишиться одной из трёх жизней (рисунок 4.4).
У игры возможны два окончания: игрок уничтожает пять врагов и выигрывает (рисунок 4.5), либо игрок теряет все три жизни и проигрывает (рисунок 4.6).
Рисунок 4.5 - Конец игры, игрок выиграл
Рисунок 4.6 - Конец игры, игрок проиграл
Смена полноэкранного/оконного режимов
1. Критерии качества с точки зрения выполнения критериев объектно-ориентированного подхода:
- разработанные объекты содержат инкапсулированные данные и функции, сгруппированные вместе, что позволяет защитить данные;
- в достаточной степени достигнута реализация абстрагирования, полиморфизма и наследования.
2. С точки зрения функциональности:
- программа соответствует назначению, то есть, предназначена для игры;
- завершенность, то есть данный продукт обладает всеми необходимыми чертами, требующимися для игры.
- программа в достаточной мере протестирована, произведены исправления обнаруженных ошибок.
4. С точки зрения пригодности к использованию:
- программа обладает интуитивно понятным и простым интерфейсом;
- программа сопровождена описанием, которое поможет пользователю понять принципы ее работы.
- данный программный продукт обладает высоким быстродействием и коротким временем отклика;
- программный продукт обладает достаточной эффективностью по устройствам, то есть экономичностью использования устройств машины для решения поставленной задачи.
6. С точки зрения сопровождаемости:
- программа пригодна к изменениям, то есть при появлении новых требований имеется возможность модифицирования программного кода;
- программа обладает стабильностью.
- программа обладает хорошей адаптируемостью и независимостью от устройств (способна работать на разнообразном аппаратном обеспечении);
- продукт не требует инсталляции, то есть осуществляется запуск .exe-файла.
Программа разработана в соответствии с постановкой задачи курсового проектирования по дисциплине «Объектно-ориентированное программирование». При написании были использованы методические указания по курсовому проектированию по дисциплине «Объектно-ориентированное программирование». Интерфейс программы прост и удобен в пользовании. Тестирование программы подтвердило, что программа корректно выполняет взаимодействие объектов различных классов в соответствии с вариантом.
Программа, реализующая данную объектную модель, написана в соответствии с основными принципами объектно-ориентированного программирования. В процессе написания программы были закреплены и усовершенствованы навыков работы в среде Microsoft Visual Studio 2008.
Для разработки проекта были применены метод ООА и ООП, что дает программе возможность дальнейшего развития в более сложные программы на базе существующих классов. Подход ООП дал возможность быстро и легко разработать приложение, что говорит о необходимости изучения ООА всех специалистов, каким либо образом связанных с программированием.
1. Бадд Т. Объектно-ориентированное программирование в действии. Питер. 1997.
2. Бондарев В.Н. Основы программирования. - Харьков: "Фолио"; Ростов-на-Дону: "Феникс", 1998. - 368 с.
3. Буч Г. Объектно-ориентированное проектирование с примерами применения: Пер с англ.-М.: Конкорд,1992.-519 с.
4. Доронина Ю.В. Конспект курса лекций по дисциплине "Объектно-ориентированное программирование".
5. Паппас К., Мюррей У. «Программирование на С и С++». - Киев: «Ирина», BHV, 2000. - 318 с.
6. Рейсдорф К., Хендерсон К. «Borland C. Освой самостоятельно» - М.: "БИНОМ" , 1998 - 704с.
IDirectInputDevice8*g_KDIDev;// клавиатура
HDChDC = NULL;// приватный контекст устройства GDI
HGLRC hRC = NULL;// постоянный контекст рендеринга
HWND hWnd = NULL; // дескриптор окна
HINSTANCEhInstance;// дескриптор приложения
BYTE buffer[256];// буфер для операций с клавиатурой
boolactive = TRUE; // флаг активности окна, в true по умолчанию
boolfullscreen = TRUE;// флаг режима окна, в полноэкранный по умолчанию
boolfsb;// флаг нажатия клавиши F12
constfloat piover180 = 0.0174532925f;
GLfloatz = 0.0f;// углубление в экран
GLuinttexture[6];// массив под текстуры
int adjust = 5;// корректировка скорости
LRESULTCALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
float frag_timer = 0, life_timer = 0, game_over = 0, win = 0, start = 0;
void TimerInit(void)// инициализация таймера
memset(&timer, 0, sizeof(timer));// очистка структуры
// проверим доступность высокоточного таймера
// если доступен, то частота таймера будет задана
if (!QueryPerformanceFrequency((LARGE_INTEGER *) &timer.frequency))
timer.performance_timer = FALSE;// установим флаг высокоточного таймера в ЛОЖЬ
timer.mm_timer_start= timeGetTime();// текущее время из timeGetTime()
timer.resolution= 1.0f/1000.0f;// точность равна 0.001f
timer.frequency= 1000;// частота равна 1000
timer.mm_timer_elapsed = timer.mm_timer_start; // прошедшее время равно текущему
// высокоточный таймер доступен, используем его вместо мультимедийного таймера
// взять текущее время и сохранить его в performance_timer_start
QueryPerformanceCounter((LARGE_INTEGER *) &timer.performance_timer_start);
timer.performance_timer = TRUE; // Установить флаг наличия таймера в TRUE
// вычислить точность таймера, используя частоту
timer.resolution= (float) (((double)1.0f)/((double)timer.frequency));
// присвоить прошедшему времени текущее время
timer.performance_timer_elapsed = timer.performance_timer_start;
float TimerGetTime()// взять время в миллисекундах
__int64 time;// time содержит 64 бита
if (timer.performance_timer)// есть высокоточный таймер?
QueryPerformanceCounter((LARGE_INTEGER *) &time);//захват текущего значения высокоточного таймера
// вернем текущее время минус начальное время, умноженное на точность и 1000 (для миллисекунд)
return ((float) (time - timer.performance_timer_start) * timer.resolution)*1000.0f;
return ((float) (timeGetTime() - timer.mm_timer_start) * timer.resolution)*1000.0f;
void readstr(FILE *f, char *string)
while ((string[0] == '/') || (string[0] == '\n'));
fnm[0] = "Data/World/sector1.txt";fnm[1] = "Data/World/sector2.txt";fnm[2] = "Data/World/sector3.txt";fnm[3] = "Data/World/sector4.txt";
sscanf(oneline, "NUM_TR %d\n", &numtriangles);
sector[i].triangle = new TRIANGLE[numtriangles];
sector[i].numtriangles = numtriangles;
for (int loop = 0; loop < numtriangles; loop++)
sscanf(oneline, "%i\n", §or[i].triangle[loop].texture);
for (int vert = 0; vert < 3; vert++)
sscanf(oneline, "%f %f %f %f %f %f %f", &x, &y, &z, &u, &v);
sector[i].triangle[loop].vertex[vert].x = x;
sector[i].triangle[loop].vertex[vert].y = y;
sector[i].triangle[loop].vertex[vert].z = z;
sector[i].triangle[loop].vertex[vert].u = u;
sector[i].triangle[loop].vertex[vert].v = v;
filein = fopen("Data/World/wzones.txt", "rt");
sscanf(oneline, "NUM_P %d\n", &numtriangles);
for (int loop = 0; loop < numtriangles; loop++)
static const int q_patt[2][2] = { {0,1}, {3,2} };
int pred_q = q_patt[pred_pt.y < 0][pred_pt.x < 0];
int q = q_patt[cur_pt.y < 0][cur_pt.x < 0];
if (pred_pt.x * cur_pt.y >= pred_pt.y * cur_pt.x)
if (!(pred_pt.x * cur_pt.y >= pred_pt.y * cur_pt.x))
AUX_RGBImageRec * LoadBMP(char *Filename)
memset(TextureImage, 0, sizeof(void *)*6);
if ((TextureImage[0] = LoadBMP("Data/floor1.bmp")) &&
(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")))
for (int loop1 = 0; loop1 < 6; loop1++)
glBindTexture(GL_TEXTURE_2D, texture[loop1]);
glTexImage2D(GL_TEXTURE_2D, 0, 3, TextureImage[loop1]->sizeX, TextureImage[loop1]->sizeY, 0, GL_RGB, GL_UNSIGNED_BYTE, TextureImage[loop1]->data);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
for (int loop1 = 0; loop1 < 6; loop1++)
enemy[0]->model->LoadModel("Data/Models/Ogr.md2");
enemy[0]->model->LoadSkin("Data/Models/Ogr.pcx");
GLvoid ReSizeGLScene(GLsizei width, GLsizei height)
gluPerspective(45.0f,(GLfloat)width/(GLfloat)height,0.1f,100.0f);
font = 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
wglUseFontOutlines(hDC,0,256, base, 0.0f, 0.2f, WGL_FONT_POLYGONS, gmf);
GLvoid glPrint(float x, float y, float z, const char *fmt, ...)
for (unsigned int loop=0;loop<(strlen(text));loop++)
length += gmf[(unsigned char)text[loop]].gmfCellIncX;
glCallLists(strlen(text), GL_UNSIGNED_BYTE, text);
glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST);
CTimer::GetInstance()->Initialize();
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
float timesec = CTimer::GetInstance()->GetTimeMSec() / 1000.0;
glTranslatef(xtrans, ytrans, ztrans);
numtriangles = sector[i].numtriangles;
for (int loop_m = 0; loop_m < numtriangles; loop_m++)
glBindTexture(GL_TEXTURE_2D, texture[sector[i].triangle[loop_m].texture]);
x_m = sector[i].triangle[loop_m].vertex[0].x;
y_m = sector[i].triangle[loop_m].vertex[0].y;
z_m = sector[i].triangle[loop_m].vertex[0].z;
u_m = sector[i].triangle[loop_m].vertex[0].u;
v_m = sector[i].triangle[loop_m].vertex[0].v;
glTexCoord2f(u_m,v_m); glVertex3f(x_m,y_m,z_m);
x_m = sector[i].triangle[loop_m].vertex[1].x;
y_m = sector[i].triangle[loop_m].vertex[1].y;
z_m = sector[i].triangle[loop_m].vertex[1].z;
u_m = sector[i].triangle[loop_m].vertex[1].u;
v_m = sector[i].triangle[loop_m].vertex[1].v;
glTexCoord2f(u_m,v_m); glVertex3f(x_m,y_m,z_m);
x_m = sector[i].triangle[loop_m].vertex[2].x;
y_m = sector[i].triangle[loop_m].vertex[2].y;
z_m = sector[i].triangle[loop_m].vertex[2].z;
u_m = sector[i].triangle[loop_m].vertex[2].u;
v_m = sector[i].triangle[loop_m].vertex[2].v;
glTexCoord2f(u_m,v_m); glVertex3f(x_m,y_m,z_m);
glTranslatef(weapon.getX(), -0.2f, weapon.getZ());
glRotatef(weapon.rotate, 1.0f,1.0f,1.0f);
glTranslatef(xtrans, ytrans, ztrans);
glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
for(int i = 0; i < enemy_count; i++) {
glTranslatef(enemy[i]->getX(), -0.25f, enemy[i]->getZ());
enemy[i]->model->DrawModel(timesec);
glTranslatef(xtrans, ytrans, ztrans);
if (enemy_count && rand()%1000 < 30) {
enemy[rand()%enemy_count]->setMove(player.getX(), player.getZ());
glPrint(-16.0f, 11.0f, -30.0f, "FPS: %2.2f", CTimer::GetInstance()->GetFps());
glPrint(-8.0f, -6.0f, -15.0f, "ATTACK!");
glPrint(-8.0f, -6.0f, -15.0f, "GET A CUBE!");
glPrint(6.7f, -7.0f, -20.0f, "LIFES: %d", player.lifes);
glPrint(6.7f, -8.0f, -20.0f, "FRAGS: %d", player.killed);
if ((frag_timer + 3) < (CTimer::GetInstance()->GetTimeMSec() / 1000.0))
glPrint(-1.0f, 1.0f, -10.0f, "FRAG!");
if ((life_timer + 3) < (CTimer::GetInstance()->GetTimeMSec() / 1000.0))
glPrint(-2.1f, -1.0f, -10.0f, "LOST LIFE!");
if ((game_over + 3) < (CTimer::GetInstance()->GetTimeMSec() / 1000.0))
glPrint(-2.9f, 0.0f, -6.0f, "GAME OVER");
if ((win + 3) < (CTimer::GetInstance()->GetTimeMSec() / 1000.0))
glPrint(-2.0f, -0.1f, -6.0f, "YOU WIN!");
if ((start + 5) < (CTimer::GetInstance()->GetTimeMSec() / 1000.0))
glPrint(-10.0f, 5.0f, -19.0f, "FIND THE CUBE, THEN FRAG THE MONSTER!");
glPrint(-4.0f, -4.0f, -23.0f, "FRAG 5 MONSTERS");
glPrint(-10.5f, -5.0f, -20.0f, "DON'T GET HIT BY THE MONSTER, OR YOU DIE!");
MessageBox(NULL,(LPCWSTR)L"Release Of DC And RC Failed.",(LPCWSTR)L"SHUTDOWN ERROR",MB_OK | MB_ICONINFORMATION);
MessageBox(NULL,(LPCWSTR)L"Release Rendering Context Failed.",(LPCWSTR)L"SHUTDOWN ERROR",MB_OK | MB_ICONINFORMATION);
MessageBox(NULL,(LPCWSTR)L"Release Device Context Failed.",(LPCWSTR)L"SHUTDOWN ERROR",MB_OK | MB_ICONINFORMATION);
MessageBox(NULL,(LPCWSTR)L"Could Not Release hWnd.",(LPCWSTR)L"SHUTDOWN ERROR",MB_OK | MB_ICONINFORMATION);
if (!UnregisterClass((LPCWSTR)L"OpenGL",hInstance))
MessageBox(NULL,(LPCWSTR)L"Could Not Unregister Class.",(LPCWSTR)L"SHUTDOWN ERROR",MB_OK | MB_ICONINFORMATION);
BOOL CreateGLWindow(char* title, int width, int height, int bits, bool fullscreenflag)
wc.style= CS_HREDRAW | CS_VREDRAW | CS_OWNDC;
wc.hIcon= LoadIcon(NULL, IDI_WINLOGO);
wc.hCursor= LoadCursor(NULL, IDC_ARROW);
wc.lpszClassName= (LPCWSTR)L"OpenGL";
MessageBox(NULL,(LPCWSTR)L"Failed To Register The Window Class.",(LPCWSTR)L"ERROR",MB_OK|MB_ICONEXCLAMATION);
memset(&dmScreenSettings,0,sizeof(dmScreenSettings));
dmScreenSettings.dmSize= sizeof(dmScreenSettings);
dmScreenSettings.dmPelsWidth= width;
dmScreenSettings.dmPelsHeight= height;
dmScreenSettings.dmBitsPerPel= bits;
dmScreenSettings.dmFields= DM_BITSPERPEL|DM_PELSWIDTH|DM_PELSHEIGHT;
if (ChangeDisplaySettings(&dmScreenSettings,CDS_FULLSCREEN) != DISP_CHANGE_SUCCESSFUL)
if (MessageBox(NULL,(LPCWSTR)L"Полноэкранный режим не поддерживается вашей видеокартой\nЗапустить в оконном режиме?",(LPCWSTR)L"Внимание",MB_YESNO|MB_ICONEXCLAMATION)==IDYES)
MessageBox(NULL,(LPCWSTR)L"Программа будет закрыта",(LPCWSTR)L"ERROR",MB_OK|MB_ICONSTOP);
dwExStyle = WS_EX_APPWINDOW | WS_EX_WINDOWEDGE;
AdjustWindowRectEx(&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)))
MessageBox(NULL,(LPCWSTR)L"Ошибка создания окна.",(LPCWSTR)L"ERROR",MB_OK|MB_ICONEXCLAMATION);
{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, 0,16,0,0,PFD_MAIN_PLANE,0,0, 0, 0
MessageBox(NULL,(LPCWSTR)L"Can't Create A GL Device Context.",(LPCWSTR)L"ERROR",MB_OK|MB_ICONEXCLAMATION);
if (!(PixelFormat=ChoosePixelFormat(hDC,&pfd)))
MessageBox(NULL,(LPCWSTR)L"Can't Find A Suitable PixelFormat.",(LPCWSTR)L"ERROR",MB_OK|MB_ICONEXCLAMATION);
if(!SetPixelFormat(hDC,PixelFormat,&pfd))
MessageBox(NULL,(LPCWSTR)L"Can't Set The PixelFormat.",(LPCWSTR)L"ERROR",MB_OK|MB_ICONEXCLAMATION);
MessageBox(NULL,(LPCWSTR)L"Can't Create A GL Rendering Context.",(LPCWSTR)L"ERROR",MB_OK|MB_ICONEXCLAMATION);
MessageBox(NULL,(LPCWSTR)L"Can't Activate The GL Rendering Context.",(LPCWSTR)L"ERROR",MB_OK|MB_ICONEXCLAMATION);
MessageBox(NULL,(LPCWSTR)L"Initialization Failed.",(LPCWSTR)L"ERROR",MB_OK|MB_ICONEXCLAMATION);
if ( DirectInput8Create( hInstance,
if ( g_DI->CreateDevice( GUID_SysKeyboard,
if ( g_KDIDev->SetDataFormat(&c_dfDIKeyboard) )
if ( g_KDIDev->SetCooperativeLevel(hWnd, DISCL_FOREGROUND | DISCL_EXCLUSIVE) )
LRESULT CALLBACK WndProc(HWNDhWnd,UINTuMsg,WPARAMwParam, LPARAM lParam)
ReSizeGLScene(LOWORD(lParam),HIWORD(lParam));
return DefWindowProc(hWnd,uMsg,wParam,lParam);
int WINAPI WinMain(HINSTANCEhInstance, HINSTANCEhPrevInstance, LPSTRlpCmdLine, intnCmdShow)
if (MessageBox(NULL,(LPCWSTR)L"Запустить в полноэкранном режиме?", (LPCWSTR)L"На весь экран?",MB_YESNO|MB_ICONQUESTION)==IDNO)
if (!CreateGLWindow("Frag The Monster", 1024, 768, 32, fullscreen))
if (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))
if (game_over == 666 || win == 666)
while(TimerGetTime() < start + float(adjust*2.0f))
player.setH(player.getH() + (float)(512 - mpos.x)/100 * 5);
lookupdown-= (float)(384 - mpos.y)/100 * 5;
HRESULT hr = g_KDIDev->GetDeviceState(sizeof(buffer), &buffer);
if (floor(player.getX()) == floor(weapon.getX()) && floor(player.getZ()) == floor(weapon.getZ())) {
for (int i = 0; i < enemy_count; i++) {
if (floor(player.getX()) == floor(enemy[i]->getX()) && floor(player.getZ()) == floor(enemy[i]->getZ())) {
win = CTimer::GetInstance()->GetTimeMSec() / 1000.0;
for (int k = 0; k < enemy_count; k++) {
enemy[k]->model->LoadModel("Data/Models/Ogr.md2");
enemy[k]->model->LoadSkin("Data/Models/Ogr.pcx");
frag_timer = CTimer::GetInstance()->GetTimeMSec() / 1000.0;
life_timer = CTimer::GetInstance()->GetTimeMSec() / 1000.0;
if (player.lifes == 0 && game_over != 666) {
game_over = CTimer::GetInstance()->GetTimeMSec() / 1000.0;
if ( buffer[DIK_UP] || buffer[DIK_W] & 0x80 )
xpos_tmp = player.getX() - (float)sin(player.getH()*piover180) * 0.05f;
zpos_tmp = player.getZ() - (float)cos(player.getH()*piover180) * 0.05f;
walkbias = (float)sin(walkbiasangle * piover180)/20.0f;
if ( buffer[DIK_DOWN] || buffer[DIK_S] & 0x80 )
xpos_tmp = player.getX() + (float)sin(player.getH()*piover180) * 0.05f;
zpos_tmp = player.getZ() + (float)cos(player.getH()*piover180) * 0.05f;
walkbias = (float)sin(walkbiasangle * piover180)/20.0f;
if ( buffer[DIK_LEFT] || buffer[DIK_A] & 0x80 )
xpos_tmp = player.getX() + (float)sin((player.getH() - 90)*piover180) * 0.05f;
zpos_tmp = player.getZ() + (float)cos((player.getH() - 90)*piover180) * 0.05f;
walkbias = (float)sin(walkbiasangle * piover180)/20.0f;
if ( buffer[DIK_RIGHT] || buffer[DIK_D] & 0x80 )
xpos_tmp = player.getX() + (float)sin((player.getH() + 90)*piover180) * 0.05f;
zpos_tmp = player.getZ() + (float)cos((player.getH() + 90)*piover180) * 0.05f;
walkbias = (float)sin(walkbiasangle * piover180)/20.0f;
if (!CreateGLWindow("Frag The Monster", 1024, 768, 32, fullscreen))
Разработка алгоритма и программы, которая позволяет создавать программное обеспечение для языка программирования Паскаль. Функциональная спецификация программы. Выбор и обоснование комплекса технических средств. Пользовательское меню и интерфейс. курсовая работа [1,3 M], добавлен 02.02.2014
Разработка программы, моделирующей игру "Кости". Использование в программе генератора псевдослучайных чисел. Схема иерархии модулей. Описание работы программы. Регистрация игрока, окно программы. Определение языка программирования, основные операторы. курсовая работа [3,2 M], добавлен 29.07.2010
Разработка программы, которая выполняет удаление элементов внешних таблиц, а также очистку файлов, вывод таблиц на экран. Описание программного продукта. Выбор языка программирования. Схема информационных потоков. Комплект поставки и инсталляция. курсовая работа [180,0 K], добавлен 09.03.2009
Разработка игры "Экзамен" с применением объектно-ориентированного программирования и языка Java (в среде Eclipse Helios). Структура программы и алгоритм решения задачи. Описание методов и переменных. Экспериментальное тестирование и оценка программы. курсовая работа [122,5 K], добавлен 19.05.2011
Обоснование необходимости разработки программы для игры "Тетрис". Математическая и графическая части алгоритма. Выбор языка и среды программирования. Отладка текста программы, разработка интерфейса пользователя. Тестирование, руководство пользователя. курсовая работа [1,5 M], добавлен 17.01.2011
Проектирование приложения "Тетрис", осуществляющего вывод различных фигур на экран случайным образом и их падение. Описание логической структуры программы, ее тестирование. Требования к аппаратной и программной средам. Функции для работы с приложением. курсовая работа [343,7 K], добавлен 20.01.2015
Математическое описание операций преобразования плоских фигур. Выбор и обоснование языка программирования и среды разработки. Задание базовой фигуры. Разработка алгоритма работы программы. Проверка корректности работы программы в различных режимах. курсовая работа [567,6 K], добавлен 13.10.2014
Работы в архивах красиво оформлены согласно требованиям ВУЗов и содержат рисунки, диаграммы, формулы и т.д. PPT, PPTX и PDF-файлы представлены только в архивах. Рекомендуем скачать работу .

© 2000 — 2021



Разработка игры "Frag the monster" курсовая работа. Программирование, компьютеры и кибернетика.
Реферат: Геоморфологічна будова Київської області
Контрольная работа: Источники информации о населении и демографических процессах. Скачать бесплатно и без регистрации
Реферат: Эпоха Токугава
Реферат по теме Служебная этика и служебный этикет на государственной службе
Курсовая работа: Ценовая политика фирмы на примере Витебского районного узла почтовой связи
Контрольная Работа По Физике 8 Класс Хижнякова
Реферат: WordsworthS
Реферат по теме Шлем ужаса в нашей жизни
Сочинение На Тему Памятный Случай 5 Класс
Эссе На Тему Теория Социального Действия Вебера
Курсовая работа по теме Система социального обслуживания населения в России. Состояние и перспектива развития
Эссе На Тему Реформы Мустафы Кемаля Ататюрка
Реферат: Порождение эгоизма: любовь. Скачать бесплатно и без регистрации
Реферат по теме Собор новомучеників полтавських
Реферат На Тему Социальное Значение Образования И Факторы Его Эффективности В Современном Обществе
Реферат: Европейский суслик
Отчет по практике по теме Организационно-экономическая структура лечебно-профилактического учреждения
Курсовая работа: Разработка рекламы на гостиничном предприятии «Морской прибой». Скачать бесплатно и без регистрации
Реферат: Социальная ответственность бизнеса
Контрольная работа по теме Расчет деревянных конструкций
Правила электробезопасности - Безопасность жизнедеятельности и охрана труда реферат
Составление проекта топографической съемки птицефабрики "Крымская" Сакского района АР Крым - Геология, гидрология и геодезия курсовая работа
Кенигсберг-13 и мистика Калининграда - История и исторические личности доклад


Report Page