Практика
В процессе создания игры были разработаны четыре класса: Player, Game, BallPath, hgeGUIMenuItem и Forminput. У каждого из классов своё особое назначение. Их задачу можно легко определить из их названия. А теперь подробнее о каждом из них.
Класс Player
Этот класс отвечает за действия игрока, в игре игроком является лягушка, которой и управляет человек. Класс устроен довольно простою
Три public поля:
int level (назначает уровень игрока);
int life (сколько у игрока осталось жизней ) ;
float fx,fy (координаты лягушки на экране, зависит от уровня игрока).
Так же в классе имеется ряд полезных функций:
bool ChekBall(Ball ListBall[20],int i) -- вызывается, когда мы достаем шарик из цепочки, для проверки нет ли на этом месте три шарика одинакового цвета;
void DrawFrogBall(Ball ListBall[20],int i) -- вычисляет координаты всех шариков, после изъятия одного из цепочки;
void DrawBallAfter(Ball ListBall[20],int i,int frog) -- вычисляет координаты всех шариков, после вставки в цепочку шарика;
int GetBall(HGE *hge,Ball ListBall[20]) -- вычисляет по какому шарику кликнул игрок и вызывает функцию DrawFrogBall;
int Player::GetBall(HGE *hge,Ball ListBall[20])
{
if(hge->Input_GetKeyState(HGEK_LBUTTON)==true)
{
float mx,my;
//bool check;
hge->Input_GetMousePos(&mx,&my);
for(int i=0;i<20;i++)
{
if((ListBall[i].x<=mx&&mx<=ListBall[i].x+30)&&(ListBall[i].y<=my&&my<=ListBall[i].y+30))
{
if(ListBall[i].explosition==false)
DrawFrogBall(ListBall,i);
if(ChekBall(ListBall,i)==true)
return 2;
return 1;
}
else
continue;
}
return 0;
}
return 0;
}
bool PushBall(HGE *hge,Ball ListBall[20],int frog) – вычисляет после какого шарика игрок хочет вставить свой шарик и вызывает функци. DrawBallAfter;
bool Player::PushBall(HGE *hge,Ball ListBall[20],int frog)
{
if(hge->Input_GetKeyState(HGEK_LBUTTON)==true)
{
float mx,my;
hge->Input_GetMousePos(&mx,&my);
for(int i=0;i<20;i++)
{
if((ListBall[i].x<=mx&&mx<=ListBall[i].x+30)&&(ListBall[i].y<=my&&my<=ListBall[i].y+30))
{
DrawBallAfter(ListBall,i,frog);
BlowUp(i,ListBall,frog);
float t=hge->Timer_GetDelta();
while(t<30000)
t=t+hge->Timer_GetDelta();
return true;
}
else
continue;
}
return false;
}
return false;
}
bool BlowUp(int i,Ball ListBall[20],int frog) -- взрывает шарики одного цвета вызывается функцией PushBall.
Класс BallPath
Класс отвечает за цепочку шариков, за ее движение. Именно здесь просчитывается шаг, с которым двигается цепочка.
Имеется четыре основных поля:
float ballX, ballY (начальные координаты шариков в цепочки, зависят от уровня игрока);
Player pl (отвечает за данного игрока);
HGEG g (структура в которой хранятся спрайты, звуки и т.д);
Ball ListBall[20] (сама цепочка шариков);
Здесь же можно рассказать про структуру Ball.Она отвечает за каждый шарик в отдельности, за его свойства.
Поля структуры:
int col (цвет);
Bonus bonus (бонус);
float x;
float y;
float prevx;
float prevy;
bool frogs(является ли данный шарик лягушкиным);
bool hidden (появился ли этот шарик уже на экране);
bool explosition (взорван ли этот шарик);
Но вернемся к нашему к классу. В нем имеется несколько очень важных функций:
void CheckColor(HGE *hge) -- проверяет нет ли у нас шариков таких цветов, что в цепочке уже не наберется три или более одинаковых шарика;
void BallPath::CheckColor(HGE *hge)
{
int color=0;
int col=0;
int i=0;
for(color;color<6;color++)
{
while(i!=20&&(ListBall[i].col!=color||ListBall[i].explosition==true))
{
i++;
}
if(i==20)
{
i=0;
continue;
}
for(i;i<20;i++)
{
if(ListBall[i].col==color)
col++;
}
if(col>=3)
{
col=0;
i=0;
continue;
}
else if(col==0)
{
col=0;
i=0;
continue;
}
else
{
for(i=0;i<20;i++)
{
if(ListBall[i].explosition==true)
{
ListBall[i].explosition=false;
ListBall[i].col=color;
col++;
BallLoad(hge,i,color);
if(col>=3)
{
col=0;
break;
}
}
}
i=0;
}
}
}
int CheckExpl(HGE *hge) –проверяет цепочку на уничтожение всех шаров;
void BallLoad(HGE *hge,int i,int a) -- вызывается, когда нужны добавочные шарики;
void TextureBallLoadRandom(HGE *hge) -- устанавливает рандомно цвет шариков и загружает их текстуры.Вызывается при инициализации уровня;
void BallPath::TextureBallLoadRandom(HGE *hge)
{
for(int i=0;i<20;i++)
{
int a = rand() % 6;
ListBall[i].col=a;
if(a==0)
g.texBalls[i]=hge->Texture_Load("image\\baAccuracyBlue.png");
else if(a==1)
g.texBalls[i]=hge->Texture_Load("image\\baAccuracyGreen.png");
else if(a==2)
g.texBalls[i]=hge->Texture_Load("image\\baAccuracyPurple.png");
else if(a==3)
g.texBalls[i]=hge->Texture_Load("image\\baAccuracyRed.png");
else if(a==4)
g.texBalls[i]=hge->Texture_Load("image\\baAccuracyWhite.png");
else if(a==5)
g.texBalls[i]=hge->Texture_Load("image\\baAccuracyYellow.png");
}
}
Следующие три функции непостредственно вычисляют новые координаты шариков в цепочке в зависимости от уровня:
int CalculatePositionLev1(float h);
int CalculatePositionLev2(float h);
int CalculatePositionLev3(float h);
