Mai în glumă , mai în serios … [Cangurul #1]

Zilele astea mi-am amintit de „Cangurul” ce-l învățasem prin a 8-a , ori mai devreme . M-am gândit să fac un re-make , chiar dacă nu la fel de „sofisticat” . De fapt nici nu re-make , dar mai degrabă o parodie.
(Pentru cine nu știe despre ce merge vorba , poftim : )

canguru2

Foc la ghete .
Prescriptum : Se vor face update-uri … probabil 🙂
Programul va lucra după alt concept : Vom avea 4 butoane care vor indica direcția de mișcare , în calitate de „Cangur” va fi un sprite găsit pe net . Pe forma va fi plasat în componenta Image , de dimensiunea 32×32 . Programul va dispune de 2 regimuri : Desenare și Radieră .
sprite
Componentele aranjate pe formă arată în felul următor :
form

Vom declara câteva variabile globale :

int Step=20;// Un „pas” va fi echivalent cu 20 de pixeli.
int InitialLeft=8; // Va indica extremitatea stângă până la care se va putea deplasa cangurul.
int InitialTop=8; // Va indica extremitatea de suspână la care se va putea deplasa cangurul.
int StepsMade=0;// Va păstra numărul pașilor făcuți de cangur.
int MaxLeft=320;// Va indica extremitatea dreaptă până la care se va putea deplasa cangurul.
int MaxTop=470;//Va indica extremitatea de jos până la care se va putea deplasa cangurul.

Extremitățile se vor utiliza la limitarea domeniului de deplasare a cangurului .
Pentru asta , vom crea o funcție care va controla comportamentul cangurului atunci când el va ajunge(și va trece) la una din extremități.
Dacă va ajunge la o extremitate , cangurul va apărea la extremitatea opusă.
void Margins()
{
if(Form1->Image1->Left>=MaxLeft)
{Form1->Image1->Left=InitialLeft;}
//Daca ajunge la extremitatea dreapta , va fi mutat în partea stanga.
if(Form1->Image1->Top>=MaxTop)
{Form1->Image1->Top=InitialTop;}
//Daca ajunge la extremitatea de jos , va aparea sus.
if(Form1->Image1->Left<InitialLeft)
{Form1->Image1->Left=MaxLeft;}
//Daca ajunge la extremitatea stanga , va aparea in dreapta.
if(Form1->Image1->Top<InitialTop)
{Form1->Image1->Top=MaxTop;}
//Daca ajunge la extremitatea de sus , va aparea jos.
}
Această funcție va fi apelată de fiecare dată când se va cere efectuarea unui pas .
Acum vom elabora metoda ce va face update la label-urile ce conțin informații despre numărul de pași , poziția curentă a cangurului.

void UpdateScore()
{
Form1->Label3->Caption=AnsiString(StepsMade);//Numarul de pasi
Form1->Label4->Caption=AnsiString(StepsMade*Step);//Distanta parcursa in pixeli
Form1->Label7->Caption=AnsiString(Form1->Image1->Left);//Pozitia pe x
Form1->Label8->Caption=AnsiString(Form1->Image1->Top);//Pozitia pe y
}

În continuare vom elabora metoda de mișcare .
Vom declara o funcție ce primește ca parametru Direcția de mișcare.

void MakeStep(int Direction)
{
Margins();
//Inainte de a efectua pasul , se verifica daca nu va fi iesire in afara extremitatilor.
switch(Direction)

{
case 0 : Form1->Image1->Top=Form1->Image1->Top-Step; break;
//Efectueaza un pas in sus . Imaginea isi va schimba pozitia pe axa Top cu -20 pixeli (Step=20)
case 1 : Form1->Image1->Left=Form1->Image1->Left+Step; break;
//Efectueaza un pas in dreapta
case 2 : Form1->Image1->Top=Form1->Image1->Top+Step; break;
//Efectueaza un pas in jos
case 3 : Form1->Image1->Left=Form1->Image1->Left-Step;
//Efectueaza un pas in stanga.
}
StepsMade++;
//Se incrementeaza numarul pasilor.
UpdateScore();
/*Se face update la label-urile ce contin informatii despre numarul de pasi , numarul de pixeli , pozitia cangurului.
*/
}

În continuare vom elabora metoda de desenare .
Ea la fel va primi ca parametru direcția . Acest parametru se va folosi și la apelul metodei MakeStep , în interiorul funcției .
void DrawStep(int Par)
{

int LPos1,TPos1,LPos2,TPos2;
LPos1=Form1->Image1->Left;
TPos1=Form1->Image1->Top;
Form1->Canvas->Pen->Width=3;
MakeStep(Par);
Form1->Canvas->MoveTo(Form1->Image1->Left,Form1->Image1->Top);
Form1->Canvas->LineTo(LPos1,TPos1);
}

Explicație : 
LPos , TPos vor memora locația curentă a imaginii .
Se va efectua un pas în direcția corespunzătoare parametrului . Imaginea își va schimba poziția.
Cursorul canvas-ului se va mișca în poziția nouă a imaginii .
Se va trasa o linie din p8oziția nouă a imaginii (poziția cursorului canvasului) spre poziția veche a imaginii .

În continuare pur și simplu vom apela metodele MakeStep , ori DrawStep (în dependență de opțiunea selectată în RadioGroup), pentru fiecare buton .

void __fastcall TForm1::Button4Click(TObject *Sender)
{
if(RadioGroup1->ItemIndex!=0)
MakeStep(1);
else
DrawStep(1);
}
//—————————————————————————

void __fastcall TForm1::Button2Click(TObject *Sender)
{
if(RadioGroup1->ItemIndex!=0)
MakeStep(2);
else
DrawStep(2);
}
//—————————————————————————

void __fastcall TForm1::Button1Click(TObject *Sender)
{
if(RadioGroup1->ItemIndex!=0)
MakeStep(0);
else
DrawStep(0);
}
//—————————————————————————

void __fastcall TForm1::Button3Click(TObject *Sender)
{
if(RadioGroup1->ItemIndex!=0)
MakeStep(3);
else
DrawStep(3);
}
//—————————————————————————

Direcțiile se notează după acele ceasornicului :
0 — Sus
1 — Dreapta
2 — Jos
3 — Stanga

În continuare implementăm opțiunea de a schimba culoarea cu care se desenează :
void __fastcall TForm1::ComboBox1Change(TObject *Sender)
{
switch(ComboBox1->ItemIndex)
{
case 0 : Form1->Canvas->Pen->Color=clBlack; break;
case 1 : Form1->Canvas->Pen->Color=clRed; break;
case 2 : Form1->Canvas->Pen->Color=clGreen; break;
case 3 : Form1->Canvas->Pen->Color=clBlue; break;
case 4 : Form1->Canvas->Pen->Color=clYellow; break;
}
}

Rezultatul final :

 

Оставьте комментарий