Ako naprogramovať hru

Hry sa dajú naprogramovať rôzne. Samozrejme nič vám nebráni využiť grafické možnosti DirectX, samozrejme treba to vedieť a v neposlednom rade treba na dobrej úrovni ovládať aj C++, čo je odporúčaný jazyk pre vývoj hier. Pre niektoré hry však použitie DirectX môže pripomínať kanón na vrabce a zle urobená hra, v ktorej sa absencia nápadu supluje grafickými efektami môže výrazne zvýšiť spotrebu energie zo zariadenia. BTW vysvetlí mi niekto, prečo tak statická hra ako MS Solitaire poriadne zohreje môj Surface s procesorom i5. Preto som rozmýšľal ako čo najjednoduchšie a zrealizovať jednoduchú a triviálnu, ale zaujímavú hru Sokoban aby čo najmenej zaťažovala procesor. V hre nie je potrebná detailná animácia, stačí ak sa bude hráč a ním presúvané bedničky posúvať o celé políčka hracieho plánu.

Popisovaný princíp bol použitý v hrách Soko http://apps.microsoft.com/windows/app/soko/6334b9c1-e297-4d84-bec2-5f058ff9f5bb a Soko Advanced http://apps.microsoft.com/windows/app/soko-advanced/8da3c7ed-58d6-41ef-a0f8-e3a90bb1947d. V obidvoch hrách je úplne rovnaký engine, hry sa líšia scénami.
Ak nepočítame tlačidlá na hornom paneli, ukazovateľ skóre a pole pre zadávanie kódov úrovní, XAML kód na zobrazenie hracieho plánu sú tri riadky. Jadrom je prvok Grid, do ktorého polí sú dynamicky umiestňované obrázky

<Viewbox Grid.Row=”2″ Stretch=”Uniform”>
<Grid x:Name=”grid_Game” Loaded=”grid_Game_Loaded” />
</Viewbox>

Procedúra na inicializáciu hracieho plánu

void InitialiseLevel()
{
  for (int i = 0; i < Hra.Level.RowCount; i++) grid_Game.RowDefinitions.Add(new RowDefinition());
for (int i = 0; i < Hra.Level.ColumnCount; i++) grid_Game.ColumnDefinitions.Add(new ColumnDefinition());
for (int row = 0; row < Hra.Level.RowCount; row++)
{
for (int column = 0; column < Hra.Level.ColumnCount; column++)
{
Pole pole = Hra.Level[row, column];
pole.PropertyChanged += pole_PropertyChanged;
Image img = new Image();
img.DataContext = pole;
img.Tapped += Pole_Click;
img.Margin = new Thickness(2);
AktualizujPole(img, pole);
Grid.SetColumn(img, column);
      Grid.SetRow(img, row);
grid_Game.Children.Add(img);
}
}
}

Konkrétny stav bunky sa načíta v riadku

Pole pole = Hra.Level[row, column];

V procedúre AktualizujPole sa zobrazí obrázok podľa objektovej reprezentácie hracieho plánu

private static void AktualizujPole(Image img, Pole pole)
{
if (pole.Content != null)
{
switch (pole.Content.Typ)
{
case “Figurka”: if (pole.Name == “Ciel”) img.Source = new BitmapImage(new Uri(“ms-appx:///assets/HracCiel.png”));
else img.Source = new BitmapImage(new Uri(“ms-appx:///assets/hracPodlaha.png”));
break;
case “Bedna”: if (pole.Name == “Ciel”) img.Source = new BitmapImage(new Uri(“ms-appx:///assets/greencrate.png”));
else img.Source = new BitmapImage(new Uri(“ms-appx:///assets/crate.png”));
break;
default: img.Source = new BitmapImage(new Uri(“ms-appx:///assets/void.png”)); break;
}
}
else
{
switch (pole.Typ)
{
case  “Stena”: img.Source = new BitmapImage(new Uri(“ms-appx:///assets/stena.png”)); break;
case  “Podlaha”: img.Source = new BitmapImage(new Uri(“ms-appx:///assets/wood.png”)); break;
case “Mimo”: img.Source = new BitmapImage(new Uri(“ms-appx:///assets/space.png”)); break;
case “Ciel”: img.Source = new BitmapImage(new Uri(“ms-appx:///assets/green.png”)); break;
default: img.Source = new BitmapImage(new Uri(“ms-appx:///assets/void.png”)); break;
}
}
}

Reklamy

Pridaj komentár

Zadajte svoje údaje, alebo kliknite na ikonu pre prihlásenie:

WordPress.com Logo

Na komentovanie používate váš WordPress.com účet. Odhlásiť sa / Zmeniť )

Twitter picture

Na komentovanie používate váš Twitter účet. Odhlásiť sa / Zmeniť )

Facebook photo

Na komentovanie používate váš Facebook účet. Odhlásiť sa / Zmeniť )

Google+ photo

Na komentovanie používate váš Google+ účet. Odhlásiť sa / Zmeniť )

Connecting to %s


%d bloggers like this: