Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
курсач2.docx
Скачиваний:
1
Добавлен:
01.03.2025
Размер:
6 Мб
Скачать
☆

Заключение

В результате выполнения курсового проекта была разработана казуальная игра Zuma.

В игре имеется три не очень сложных уровня.

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

В процессе создания проекта был изучен принцип работы с графикой в c++.

В ходе разработки приложения использовалась среда Microsoft Visual Studio 2010, а для работы приложения – библиотека HGE.DLL.

Список использованных источников

  1. Материалы ресурса Wikipedia – Свободная Энциклопедия. (http://wikipedia.org)

  2. Интернет-ресурс gamesmaker.ru

  3. MSDN (http://msdn.microsoft.com)

  4. С++(Базовый курс) Герберт Шилдт

Приложения 1. Исходный код

Функции кадра меню и его прорисовки

bool FrameFunc()

{

float dt=hge->Timer_GetDelta();

static float t=0.0f;

float tx,ty;

int id;

static int lastid=0;

if(hge->Input_GetKeyState(HGEK_ESCAPE)) { lastid=5; gui->Leave(); }

id=gui->Update(dt);

if(id == -1)

{

switch(lastid)

{

case 1:

{

hge->Gfx_Clear(0);

hge->System_SetState(HGE_FRAMEFUNC, FrameFunc1);

game.b.pl.level=3;

game.InitSimulation(hge);

hge->System_SetState(HGE_RENDERFUNC, RenderFunc1);

hge->System_SetState(HGE_TITLE, "LEVEL");

hge->System_SetState(HGE_USESOUND, true);

hge->System_SetState(HGE_WINDOWED, true);

hge->System_SetState(HGE_SCREENWIDTH,SCREEN_WIDTH);

hge->System_SetState(HGE_SCREENHEIGHT, SCREEN_HEIGHT);

hge->System_SetState(HGE_SCREENBPP, 32);

gui1=new hgeGUI();

gui1->SetNavMode(HGEGUI_UPDOWN | HGEGUI_CYCLED);

gui1->SetCursor(spr);

gui1->SetFocus(1);

gui1->Enter();

if(hge->System_Initiate())

{

fnt=new hgeFont("font2.fnt");

hge->System_Shutdown();

hge->Release();

break;

}

break;

}

case 2:

case 3:

{

snd=hge->Effect_Load("music\\instructions.mp3");

hge->Effect_Play(snd);

hge->Gfx_Clear(0);

hge->System_SetState(HGE_FRAMEFUNC, FrameFuncI);

background1=hge->Texture_Load("image\\dialogbox.jpg");

instructions=new hgeSprite(background1, 0, 0, SCREEN_WIDTH, SCREEN_HEIGHT);

hge->System_SetState(HGE_RENDERFUNC, RenderFuncI);

hge->System_SetState(HGE_TITLE, "INSTRUCTIONS");

hge->System_SetState(HGE_USESOUND, true);

hge->System_SetState(HGE_WINDOWED, true);

hge->System_SetState(HGE_SCREENWIDTH, SCREEN_WIDTH);

hge->System_SetState(HGE_SCREENHEIGHT, SCREEN_HEIGHT);

hge->System_SetState(HGE_SCREENBPP, 32);

if(!FrameFuncI)

{

hge->System_Shutdown();

hge->Release();

break;

}

break;

}

case 4:

gui->SetFocus(1);

gui->Enter();

break;

case 5: return true;

}

}

else if(id) { lastid=id; gui->Leave(); }

t+=dt;

tx=50*cosf(t/60);

ty=50*sinf(t/60);

quad.v[0].tx=tx; quad.v[0].ty=ty;

quad.v[1].tx=tx+800/64; quad.v[1].ty=ty;

quad.v[2].tx=tx+800/64; quad.v[2].ty=ty+600/64;

quad.v[3].tx=tx; quad.v[3].ty=ty+600/64;

return false;

}

bool RenderFunc()

{

hge->Gfx_BeginScene();

hge->Gfx_RenderQuad(&quad);

gui->Render();

fnt->SetColor(0xFFFFFFFF);

fnt->printf(5, 5, HGETEXT_LEFT, "dt:%.3f\nFPS:%d", hge->Timer_GetDelta(), hge->Timer_GetFPS());

hge->Gfx_EndScene();

return false;

}

void Game::SaveToFile(char *name)

{

char *plname;

while(*name!=' ')

{

name++;

}

name++;

plname=name;

char *namef;

if(b.pl.level==1)

{

namef="level1.txt";

}

else if(b.pl.level==2)

{

namef="level2.txt";

}

else if(b.pl.level==3)

{

namef="level3.txt";

}

char timel[10];

sprintf(timel,"%f",b.timelevel);

FILE *f=fopen(namef,"r+");

if (!f)

{

printf("File was not opened!!!");

}

fseek(f,0,SEEK_END);

fputc('\n',f);

fputc('\n',f);

//внесение в Базу данных

fputs("Имя:",f);

fputc('\n',f);//fputs не переходит на другую строку

fputs(plname,f);

fputc('\n',f);//fputs не переходит на другую строку

fputs("Время:",f);

fputc('\n',f);//fputs не переходит на другую строку

fputs(timel,f);

fclose(f);

}

void Game::WinersFromFile()

{

char str[30];// строка для взятия из файла

char tname[30];

float ttime=0;

int len=30;

FILE *f1=fopen("level1.txt","r");

if (!f1)

{

printf("File was not opened!!!");

}

FILE *f2=fopen("level2.txt","r");

if (!f2)

{

printf("File was not opened!!!");

}

FILE *f3=fopen("level3.txt","r");

if (!f3)

{

printf("File was not opened!!!");

}

// int max=0;

for(int i=0;i<3;i++)

maxtime[i]=100;

fgets(str,len,f1);//первая строчка: " База Данных: "

while(!feof(f1))//пока мы не найдем нужный счет

{

fgets(str,len,f1);//пустая строчка

fgets(str,len,f1);//Имя:

fgets(str,len,f1);//Alex

strcpy(tname,str);//копируем в темповое имя имя польхователя

fgets(str,len,f1);//вВремя:

fgets(str,len,f1);//1234

ttime=atof(str);//получаем time

if(ttime<=maxtime[0])

{

maxtime[0]=ttime;

strcpy(maxname1,tname);

}

}

fclose(f1);

fgets(str,len,f2);//первая строчка: " База Данных: "

while(!feof(f2))//пока мы не найдем нужный счет

{

fgets(str,len,f2);//пустая строчка

fgets(str,len,f2);//Имя:

fgets(str,len,f2);//Alex

strcpy(tname,str);//копируем в темповое имя имя польхователя

fgets(str,len,f2);//вВремя:

fgets(str,len,f2);//1234

ttime=atof(str);//получаем time

if(ttime<=maxtime[1])

{

maxtime[1]=ttime;

strcpy(maxname2,tname);

}

}

fclose(f2);

fgets(str,len,f3);//первая строчка: " База Данных: "

while(!feof(f3))//пока мы не найдем нужный счет

{

fgets(str,len,f3);//пустая строчка

fgets(str,len,f3);//Имя:

fgets(str,len,f3);//Alex

strcpy(tname,str);//копируем в темповое имя имя польхователя

fgets(str,len,f3);//вВремя:

fgets(str,len,f3);//1234

ttime=atof(str);//получаем time

if(ttime<=maxtime[2])

{

maxtime[2]=ttime;

strcpy(maxname3,tname);

}

}

fclose(f3);

}

bool Game::InitSimulation(HGE *hge)

{

player.life=1;

//загрузка текстур

b.g.sndrol=hge->Effect_Load("music\\rolling.wav");

b.g.sndpop=hge->Effect_Load("music\\pop.wav");

b.g.snddes=hge->Effect_Load("music\\ballsdestroyed.wav");

if (b.pl.level==1)

{

b.pl.fx=490;

b.pl.fy=280;

b.g.background=hge->Texture_Load("levels\\inversespiral.png");

if(!b.g.background) return false;

b.g.texFrog=hge->Texture_Load("image\\SMALLFROG1.png");

if(!b.g.texFrog) return false;

b.TextureBallLoadRandom(hge);

b.g.snd1=hge->Effect_Load("music\\level1.mp3");

// создание спрайтов

hge->Effect_PlayEx(b.g.snd1,10,0,-1,true);

b.g.level=new hgeSprite(b.g.background, 0, 0, SCREEN_WIDTH, SCREEN_HEIGHT);

b.g.frog=new hgeSprite(b.g.texFrog,0, 0, 90, 100);

for(int i=0;i<20;i++)

{

b.g.ball[i]=new hgeSprite(b.g.texBalls[i],0,0,33,32);

}

b.pl.life=3;

b.colWhite.SetHWColor(0xFFFFFFFF);

time=b.GetTime();

b.speed=6.4f;

b.ballX=40;

b.ballY=440;

b.ListBall[0].x=b.ballX;

b.ListBall[0].y=b.ballY;

b.ListBall[0].frogs=false;

b.ListBall[0].hidden=false;

b.ListBall[0].explosition=false;

for(int i=1;i<20;i++)

{

b.ListBall[0].frogs=false;

b.ListBall[i].hidden=true;

b.ListBall[i].explosition=false;

b.ListBall[i].x=40;

b.ListBall[i].y=440;

}

}

else if(b.pl.level==2)

{

b.pl.fx=360;

b.pl.fy=300;

b.g.background=hge->Texture_Load("levels\\squaresville.png");

if(!b.g.background) return false;

b.g.texFrog=hge->Texture_Load("image\\SMALLFROG1.png");

if(!b.g.texFrog) return false;

b.TextureBallLoadRandom(hge);

b.g.snd1=hge->Effect_Load("music\\level2.mp3");

// создание спрайтов

hge->Effect_PlayEx(b.g.snd1,5,0,-1,true);

b.g.level=new hgeSprite(b.g.background, 0, 0, SCREEN_WIDTH, SCREEN_HEIGHT);

b.g.frog=new hgeSprite(b.g.texFrog,0, 0, 90, 100);

for(int i=0;i<20;i++)

{

b.g.ball[i]=new hgeSprite(b.g.texBalls[i],0,0,33,32);

}

b.pl.life=3;

hge->Effect_Play(b.g.snd1);

b.g.level=new hgeSprite(b.g.background, 0, 0, SCREEN_WIDTH, SCREEN_HEIGHT);

b.g.frog=new hgeSprite(b.g.texFrog,0, 0, 90, 100);

for(int i=0;i<20;i++)

{

b.g.ball[i]=new hgeSprite(b.g.texBalls[i],0,0,33,32);

}

b.pl.life=3;

b.colWhite.SetHWColor(0xFFFFFFFF);

time=b.GetTime();

b.speed=6.4f;

b.ballX=770;

b.ballY=60;

b.ListBall[0].x=b.ballX;

b.ListBall[0].y=b.ballY;

b.ListBall[0].frogs=false;

b.ListBall[0].hidden=false;

b.ListBall[0].explosition=false;

for(int i=1;i<20;i++)

{

b.ListBall[0].frogs=false;

b.ListBall[i].hidden=true;

b.ListBall[i].explosition=false;

b.ListBall[i].x=770;

b.ListBall[i].y=60;

}

}

else if(b.pl.level==3)

{

b.pl.fx=290;

b.pl.fy=310;

b.g.background=hge->Texture_Load("levels\\tunnellevel.png");

if(!b.g.background) return false;

b.g.texFrog=hge->Texture_Load("image\\SMALLFROG1.png");

if(!b.g.texFrog) return false;

b.TextureBallLoadRandom(hge);

b.g.snd1=hge->Effect_Load("music\\level3.mp3");

// создание спрайтов

hge->Effect_PlayEx(b.g.snd1,5,0,-1,true);

b.g.level=new hgeSprite(b.g.background, 0, 0, SCREEN_WIDTH, SCREEN_HEIGHT);

b.g.frog=new hgeSprite(b.g.texFrog,0, 0, 90, 100);

for(int i=0;i<20;i++)

{

b.g.ball[i]=new hgeSprite(b.g.texBalls[i],0,0,33,32);

}

b.pl.life=3;

hge->Effect_Play(b.g.snd1);

b.g.level=new hgeSprite(b.g.background, 0, 0, SCREEN_WIDTH, SCREEN_HEIGHT);

b.g.frog=new hgeSprite(b.g.texFrog,0, 0, 90, 100);

for(int i=0;i<20;i++)

{

b.g.ball[i]=new hgeSprite(b.g.texBalls[i],0,0,33,32);

}

b.pl.life=3;

b.colWhite.SetHWColor(0xFFFFFFFF);

time=b.GetTime();

b.speed=6.4f;

b.ballX=750;

b.ballY=5;

b.ListBall[0].x=b.ballX;

b.ListBall[0].y=b.ballY;

b.ListBall[0].frogs=false;

b.ListBall[0].hidden=false;

b.ListBall[0].explosition=false;

for(int i=1;i<20;i++)

{

b.ListBall[0].frogs=false;

b.ListBall[i].hidden=true;

b.ListBall[i].explosition=false;

b.ListBall[i].x=750;

b.ListBall[i].y=5;

/

}

}

return true;

}

Для примера высчитывания координат шариков

int BallPath::CalculatePositionLev3(float h)

{

int i=0;

for(i;i<20;i++)

{

if(ListBall[i].hidden==false&&ListBall[i].frogs!=true)

{

if (ListBall[i].x==750&&ListBall[i].y<560)

{

ListBall[i].prevx=ListBall[i].x;

ListBall[i].prevy=ListBall[i].y-30;

ListBall[i].y+=h;

if(ListBall[i].y-ListBall[i+1].y>30)

ListBall[i+1].hidden=false;

continue;

}

}

if(ListBall[i].y>560&&ListBall[i].x>100)

{

ListBall[i].prevx=ListBall[i].x+30;

ListBall[i].prevy=ListBall[i].y;

ListBall[i].x-=h;

continue;

}

if(ListBall[i].y>500&&ListBall[i].x>55)

{

ListBall[i].prevx=ListBall[i].x;

ListBall[i].prevy=ListBall[i].y;

ListBall[i].x-=h;

ListBall[i].y-=h;

continue;

}

if(ListBall[i].x<55&&ListBall[i].y>95)

{

ListBall[i].prevx=ListBall[i].x;

ListBall[i].prevy=ListBall[i].y+30;

ListBall[i].y-=h;

continue;

}

if(ListBall[i].y>55&&ListBall[i].x<115)

{

ListBall[i].prevx=ListBall[i].x;

ListBall[i].prevy=ListBall[i].y;

ListBall[i].x+=h;

ListBall[i].y-=h;

continue;

}

if(ListBall[i].y<55&&ListBall[i].x<550)

{

ListBall[i].prevx=ListBall[i].x-30;

ListBall[i].prevy=ListBall[i].y;

ListBall[i].x+=h;

continue;

}

if(ListBall[i].x<590&&ListBall[i].y<95)

{

ListBall[i].prevx=ListBall[i].x;

ListBall[i].prevy=ListBall[i].y;

ListBall[i].x+=h;

ListBall[i].y+=h;

continue;

}

if(ListBall[i].x>590&&ListBall[i].x<591&&ListBall[i].y<430)

{

ListBall[i].prevx=ListBall[i].x;

ListBall[i].prevy=ListBall[i].y-30;

ListBall[i].y+=h;

continue;

}

if(ListBall[i].x>520&&ListBall[i].x<591&&ListBall[i].y>420&&ListBall[i].y<470)

{

ListBall[i].prevx=ListBall[i].x;

ListBall[i].prevy=ListBall[i].y;

ListBall[i].x-=h;

ListBall[i].y+=h;

continue;

}

if(ListBall[i].x<555&&ListBall[i].x>535&&ListBall[i].y>470)

{

ListBall[i].prevx=ListBall[i].x+30;

ListBall[i].prevy=ListBall[i].y;

ListBall[i].x-=h;

continue;

}

if(ListBall[i].x<535&&ListBall[i].x>490&&ListBall[i].y>430)

{

ListBall[i].prevx=ListBall[i].x;

ListBall[i].prevy=ListBall[i].y;

ListBall[i].x-=h;

ListBall[i].y-=h;

continue;

}

if(ListBall[i].x<490&&ListBall[i].y>370)

{

ListBall[i].prevx=ListBall[i].x;

ListBall[i].prevy=ListBall[i].y+30;

ListBall[i].y-=h;

continue;

}

if(ListBall[19].x<490&&ListBall[19].x>487&&ListBall[19].y<370)

{

if(pl.life>1)

{

pl.life--;

ballX=750;

ballY=5;

ListBall[0].x=ballX;

ListBall[0].y=ballY;

ListBall[0].hidden=false;

ListBall[0].explosition=false;

for(int i=1;i<20;i++)

{

ListBall[i].hidden=true;

ListBall[i].explosition=false;

ListBall[i].x=750;

ListBall[i].y=5;

}

}

else

return 0;

}

}

return 1;

}

void Player::DrawFrogBall(Ball ListBall[20],int i)

{

float x,y;

x=ListBall[i].x;

y=ListBall[i].y;

ListBall[i].frogs=true;

ListBall[i].x=fx+30;

ListBall[i].y=fy+65;

int k=0;

int rev;

for(int j=19;j>i;j--)

{

if(ListBall[j-1].explosition==true)

{

rev=j;

k=j-1;

while(ListBall[k].explosition==true)

{

k--;

}

ListBall[j].x=ListBall[k].x;

ListBall[j].y=ListBall[k].y;

j=k+1;

}

else if(ListBall[j].explosition!=true)

{

ListBall[j].x=ListBall[j-1].x;

ListBall[j].y=ListBall[j-1].y;

}

}

if(ListBall[i+1].explosition!=true)

{

ListBall[i+1].x=x;

ListBall[i+1].y=y;

}

else if(k==i)

{

ListBall[rev].x=x;

ListBall[rev].y=y;

}

}

void Player::DrawBallAfter(Ball ListBall[20],int i,int frog)

{

float x,y;

ListBall[frog].x=ListBall[i].x;

ListBall[frog].y=ListBall[i].y;

for(i;i<19;i++)

{

if(i+1==frog)

{

ListBall[i].x=ListBall[i+2].x;

ListBall[i].y=ListBall[i+2].y;

continue;

}

if(i==frog)

continue;

ListBall[i].x=ListBall[i+1].x;

ListBall[i].y=ListBall[i+1].y;

}

if(i!=frog)

{

ListBall[i].x=ListBall[i].prevx;

ListBall[i].y=ListBall[i].prevy;

}

ListBall[frog].frogs=false;

}

37