Hra ESCAPA

Založení nového projektu

Spustíme Visual Studio
File - New - Project...

Visual C++ - Windows Forms Application - vybereme adresář - pojmenujeme HraEscapa

okenni

Vytvoříme uživatelské rozhraní hry

Formuláři nastavíme vlastnost Text na Escapa, Size 500; 300

Na Panelu nástrojů (ToolBox) vybereme ovládací prvky (Controls), postupně přetáhneme na formulář a nastavíme jim vlastnosti (Properties).

 ovládací prvek  vlastnost  hodnota
Panel Name
BackColor
Dock

pnlHraciPlocha
White
Top
      

 Button Name
BackColor
Size
Text
btnHrac
LightBlue
40;40
Vámi zvolený text
 Button Name
Text
Anchor
btnStart
START
Bottom, Left
 Timer Enabled
Interval
false
100
Spustíme aplikaci a vyzkoušíme, že se změnou velikosti okna se hrací plocha bude měnit a vzdálenost od dolního okraje formuláře zůstane stejná (díky nastavení vlastnosti Anchor).

Hráči pnlHrac přidáme reakci na pohyb myši MouseMove

  • Pokud je stisknuto pravé tlačítko myši posuneme tlačítkem btnHrac tak, aby střed tlačítka byl v místě kurzoru myši.
  • Po změně umístění tlačítka testujeme, zda jsme nenarazili do některé ze 4 stěn hrací plochy.
  • Pokud ano, vypíšeme hlášku a
  • posuneme tlačítkem zpět doprostřed hrací plochy.

private: System::Void btnHrac_MouseMove(System::Object^ sender, System::Windows::Forms::MouseEventArgs^ e)
{ //pohyb pouze při stisknutém levém tlačítku
  if (e->Button == System::Windows::Forms::MouseButtons::Left)
 {
    btnHrac->Left += e->X - btnHrac->Width/2;
    btnHrac->Top += e->Y - btnHrac->Height/2;
    if (btnHrac->Left < 0||
         btnHrac->Right > pnlHraciPlocha->Width ||
         btnHrac->Top < 0 ||
         btnHrac->Bottom > pnlHraciPlocha->Bottom)
        {
            MessageBox::Show( "Prohrál jsi... ha ha ha ha" );
            btnHrac->Left = pnlHraciPlocha->Width /2 - btnHrac->Width/2;
            btnHrac->Top = pnlHraciPlocha->Height /2 - btnHrac->Height/2;
        }
   }
}
obrazek

Vytvoříme nepřátele 

  • Do konstruktoru přidáme kód pro vytvoření 4 nepřátel
for (int i = 0; i < 4; i++)
{
  Button ^tlacitko = gcnew Button();
  tlacitko=(gcnew System::Windows::Forms::Button());
  tlacitko->Size = System::Drawing::Size(50,50);
  tlacitko->Left = 50 + (i / 2) * pnlHraciPlocha->Width /2;
  tlacitko->Top = 50 + (i % 2) *
pnlHraciPlocha->Height / 2;
  tlacitko->BackColor=System::Drawing::Color::Blue;
  pnlHraciPlocha->Controls->Add(tlacitko);
}

Nepřátele rozpohybujeme

  • Do třídy přidáme deklaraci směrů pohybu
int *smerX; // pole na haldě
int *smerY;
  • Pole inicializujeme v konstruktoru (jak se budou nepřátele pohybovat) 
smerX = new int[4];
smerY = new int[4];
smerX[0] = 5; smerX[1] = -5;smerX[2]= 5; smerX[3]= -5;
smerY[0] = 5; smerY[1] =  5; smerY[2]=-5; smerY[3]= -5;
  • Přidáme kód události Tick časovače timer1 - rozpohybujeme hráče 
Button^ tl; for (int i = 0; i < 4; i++)
{
  tl = (System::Windows::Forms::Button^)
  pnlHraciPlocha->Controls[i+1];
  tl->Left += (int)smerX[i];
  if (tl->Left > pnlHraciPlocha->Width -tl->Width || tl->Left < 0)
     smerX[i] = -(int)smerX[i];
  tl->Top += (int)smerY[i];
  if (tl->Top > pnlHraciPlocha->Bottom - tl->Height ||tl->Top < 0)
     smerY[i] = -(int)smerY[i];
}
  • Přidáme reakci na klik tlačítka btnStart  (rozběhnutí - zastavení)
timer1->Enabled = !timer1->Enabled;
  • Přidáme kontrolu kolizí do události Timer
int delka, vyska;
if (tl->Left < btnHrac->Left)
     delka = btnHrac->Left + btnHrac->Width - tl->Left;
else delka = tl->Left + tl->Width - btnHrac->Left;
if (tl->Top < btnHrac->Top)
     vyska = btnHrac->Top + btnHrac->Height - tl->Top;
else vyska = tl->Top + tl->Height - btnHrac->Top;
if (delka < btnHrac->Width  + tl->Width &&
    vyska < btnHrac->Height + tl->Height)
   {
       timer1->Enabled =false;
  }

Vytvoříme metodu Prohra

Metodu budeme volat v případě kolize hráče s nepřítelem nebo naražení hráčem na hranu hrací plochy

private: void Prohra()
{
    timer1->Enabled =false;
    MessageBox::Show("Prohrál jsi... ha ha ha ha");
    btnHrac->Left = pnlHraciPlocha->Width /2 - btnHrac->Width/2;
    btnHrac->Top = pnlHraciPlocha->Height /2 - btnHrac->Height/2;
    btnStart->Focus();
}