Tux Hunt (cz. 2) - Tworzenie gier

in polish •  7 years ago 

No cóż, musimy wrócić do tworzenia jedynej prawdziwej gry dla mężczyzn czyli Tux Hunt - Polowanie na Pingwiny :) Stworzyliśmy obiekt prostego pingwina, który ulega zestrzeleniu, zrobiliśmy ograniczoną ilość pocisków ... Czas to teraz szlifować!

System wyświetlenia pocisków w komorze

W komorze mamy (domyślnie w grze) 3 pociski. Ale gracz musi o tym wiedzieć ;) Zrobimy więc system rysowania ilości pozostałych pocisków. Zrobiłem bardzo ładną (XD) grafikę:
obraz.png

W obiekcie controller w draw wrzucamy taki blok kodu:

if(global.ammo>=1)
{
draw_sprite(spr_ammo, 0, 10, 20);
}
if(global.ammo>=2)
{
draw_sprite(spr_ammo, 0, 30, 20);
}
if(global.ammo=3)
{
draw_sprite(spr_ammo, 0, 50, 20);
}

Oznacza on: Jeśli mamy pocisków więcej lub równe 1 to narysuj grafikę w pozycji 10 na 20.

Dlaczego tak? Gdyż jeśli damy jeśli pocisk jest równy 1 to gdy będzie 2 nie zostanie wyświetlony.

Tak teraz wygląda to w grze.
obraz.png

Ale czy ten kod jest dobry? A co by było gdyby było 20 pocisków? Będziemy robić wielki tasiemiec "ifów"?

Pętla for

Przez tyle artykułów nigdy nie omawialiśmy pętli w zasadzie, a to bardzo fajna rzecz. Powiedzmy, że mamy coś do zrobienia automatycznie. Na przykład wyświetlić 100 liczb. Jakbyśmy chcieli zrobić to ręcznie to byśmy pewnie zrobili, ale nie byłoby to przyjemne. A milion?

Od tego są pętle, czyli fragment kodu, który powtarza swoje zadanie aż nie wykona się (lub nie zostanie przerwany). Przecież w tym przykładzie pętla doskonale się sprawdziłaby, by zastąpić konkretne zadanie.

Jak wygląda budowa takiej pętli?

for(i=<liczba; i<warunek>; <kolejny element pętli>)
{
// kod
}

O ja cię kręcę, to jakaś rzeźnia? Niezbyt. Zacznijmy od pierwszego argumentu
i=liczba oznacza w zasadzie stworzenie zmiennej (dla przykładu i) z jakąś wartością. Jako, że liczba pocisków jest u nas dodatnia, to i=1, ale najczęściej się liczy od i=0.

Potem warunek kiedy pętla działa. Pętla wykonuje się gdy np. i jest mniejsze lub równe ilości amunicji. Jako, że mamy maksymalnie 3 pociski to mamy skończony zbiór pracy. Przykładowy warunek będzie wyglądał:

i<=global.ammo

Ostatnim argumentem jest co się stanie jeśli pętla się wykona. Zazwyczaj wtedy następuje zwiększenie wartości. Dla przykładu jeśli chcemy wyświetlić wszystkie liczby od 0 do 100, to program musi wyświetlić liczbę i podbić "i" o 1.

Możemy zapisać kod jako i=i+1 lub skrótowo: i++

Dla przykładu nasz kod zredukowany do formy pętli wygląda:

for(i=1; i<=global.ammo; i++)
{
draw_sprite(spr_ammo, 0, 10+((i-1)*20), 20);
}

Czyli ładniej, ale zarazem trudniej. Zakładam, że mniej więcej wiadomo jak działa pętla, ale co się zmieniło z rysowaniem grafiki?

Wcześniej podawaliśmy w których konkretnie punktach ma się rysować grafika. Skoro teraz robi to automat, to automat musi to robić. Ale skąd ma wiedzieć to?

Musimy zapisać odpowiednio nasze żądanie by wiedział precyzyjnie to, ale rozbijmy to na podproblemy.

  • Początkowa wartość X wynosi 10
  • Każdy kolejny pocisk rysuje się w odległości 20 pikseli od poprzedniego.
  • Zdarzenie draw wykonuje się za każdym razem, więc pętla będzie zawsze wykonywana
  • Pętla wykonuje się z i o wartości: 1, 2, 3 (i tak ciągle).
  • Mamy do dyspozycji "i".

Więc spróbujmy na początek podłożyć wszystko pod zmienne i wykonać (w starej wersji kodu)

draw_sprite(spr_ammo, 0, 10, 20);

To jest wartość dla pierwszego elementu. Aby mieć drugi pocisk musimy dodać 20.

draw_sprite(spr_ammo, 0, 10 + (i*20), 20);

I wszystko byłoby fajnie, ale i w tym momencie wynosi 2, więc wszystko jest przesunięte o 20 pikseli w prawo. Musimy to skompensować. Możemy zamiast 10 wpisać -10 (10 - 20 daje -10), albo od i odjąć 1. Jeśli od i odejmiemy 1 otrzymamy

draw_sprite(spr_ammo, 0, 10+((i-1)*20), 20);

Mam nadzieję, że to jasne :P

Na koniec

Oczywiście nie ma co się spieszyć z tworzeniem gry. Musicie umieć wykorzystywać każdą z tych funkcji, które daje język. To podstawa pracy (rozumieć podstawy).

Z tej lekcji nauczyliście się (prawdopodobnie):

  • Rysować grafikę na ekranie
  • Co to są pętle
  • Jak działa pętla for
Authors get paid when people like you upvote their post.
If you enjoyed what you read here, create your account today and start earning FREE STEEM!
Sort Order:  

Fajna sprawa :D