Разработка игры "Frag the monster"
Дипломная работа - Компьютеры, программирование
Другие дипломы по предмету Компьютеры, программирование
метод ООА и ООП, что дает программе возможность дальнейшего развития в более сложные программы на базе существующих классов. Подход ООП дал возможность быстро и легко разработать приложение, что говорит о необходимости изучения ООА всех специалистов, каким либо образом связанных с программированием.
ПЕРЕЧЕНЬ ССЫЛОК
1.Бадд Т. Объектно-ориентированное программирование в действии. Питер. 1997.
2.Бондарев В.Н. Основы программирования. - Харьков: "Фолио"; Ростов-на-Дону: "Феникс", 1998. - 368 с.
.Буч Г. Объектно-ориентированное проектирование с примерами применения: Пер с англ.-М.: Конкорд,1992.-519 с.
.Доронина Ю.В. Конспект курса лекций по диiиплине "Объектно-ориентированное программирование".
.Паппас К., Мюррей У. Программирование на С и С++. - Киев: Ирина, BHV, 2000. - 318 с.
.Рейсдорф К., Хендерсон К. Borland C. Освой самостоятельно - М.: "БИНОМ" , 1998 - 704с.
ПРИЛОЖЕНИЕ А
Текст программы 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", §or[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()
{Status = FALSE;_RGBImageRec *TextureImage[6];(TextureImage, 0, sizeof(void *)*6);((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")))
{= 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]].gmfCe