Заключение
В результате выполнения курсового проекта была разработана казуальная игра Zuma.
В игре имеется три не очень сложных уровня.
Была разработана отличная графика в сопровождения с музыкой.
В процессе создания проекта был изучен принцип работы с графикой в c++.
В ходе разработки приложения использовалась среда Microsoft Visual Studio 2010, а для работы приложения – библиотека HGE.DLL.
Список использованных источников
Материалы ресурса Wikipedia – Свободная Энциклопедия. (http://wikipedia.org)
Интернет-ресурс gamesmaker.ru
MSDN (http://msdn.microsoft.com)
С++(Базовый курс) Герберт Шилдт
Приложения 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;
}
