15.09. Prepreke i sudari
U prethodnom bloku napravili smo igrača koji može da se kreće pomoću tastature.
Naša igra sada izgleda otprilike ovako:
┌─────────────────────────────┐
│ │
│ ■ │
│ IGRAČ │
│ │
│ ███████ │
│ │
│ │
└─────────────────────────────┘
Ali postoji problem: аko igrač dođe do zida, može jednostavno da prođe kroz njega.
■ → █████
■ → █████
↓
igrač prolazi
kroz zid
To u većini igara nije ono što želimo. Zato ćemo danas naučiti šta je sudar.
1. Šta je sudar?
Sudar nastaje kada dva objekta dođu u kontakt.
U igri to mogu biti:
-
igrač i zid;
-
igrač i predmet;
-
igrač i neprijatelj;
-
metak i neprijatelj;
-
neprijatelj i zid.
Na primer:
IGRAČ ZID
■ → █████
Kada igrač dođe do zida, nastaje sudar.
U GameMaker-u za takvu situaciju koristimo Collision Event.
2. Collision Event
Do sada smo koristili događaje povezane sa tastaturom:
Keyboard Left
Keyboard Right
Keyboard Up
Keyboard Down
Sada uvodimo novi tip događaja:
Collision
Collision Event možemo posmatrati kao pitanje:
„Šta treba da se dogodi kada ovaj objekat dođe u kontakt sa drugim objektom?“
Na primer:
obj_player
+
obj_wall
↓
Collision
↓
reakcija
3. Zašto nam je Collision potreban?
Bez Collision Event-a imamo:
IGRAČ → ZID
i igrač može da prođe kroz zid.
Sa pravilno definisanim ponašanjem imamo:
IGRAČ → ZID
↓
prepreka
Dakle, sudar omogućava da objekti međusobno reaguju.
4. Primer — igrač i zid
Imamo:
obj_player
i:
obj_wall
Za obj_player možemo napraviti: Collision with obj_wall
To znači:
„Kada igrač dođe u kontakt sa zidom, izvrši određene akcije.“
Šta će se tačno dogoditi zavisi od pravila igre.
Za naš prvi primer želimo:
Igrač ne može da prođe kroz zid.
5. Prepreka nije samo slika
Važno je razumeti razliku između:
spr_wall
i:
obj_wall
spr_wall predstavlja izgled zida.
obj_wall predstavlja objekat zida.
Kada želimo da definišemo pravilo:
„Igrač ne sme da prođe kroz zid.“
radimo sa objektima:
obj_player
↕
obj_wall
a ne samo sa slikama.
6. Collision i akcija
Kao i kod tastature, imamo:
DOGAĐAJ
↓
AKCIJA
↓
REAKCIJA
Kod sudara:
Collision with obj_wall
↓
akcija
↓
igrač reaguje na zid
Događaj sam po sebi nije cela igra.
On samo kaže:
„Ovo se dogodilo.“
Akcija određuje:
„Šta sada treba uraditi?“
7. Igrač i zid
Naš objekat:
obj_player
može imati više događaja:
Keyboard Left
Keyboard Right
Keyboard Up
Keyboard Down
Collision with obj_wall
Dakle, jedan objekat može imati različite reakcije na različite događaje.
obj_player
│
┌──────────────┼──────────────┐
↓ ↓ ↓
Keyboard Keyboard Collision
Left Right obj_wall
↓ ↓ ↓
pomeri se pomeri se reaguj
8. Šta želimo da postignemo?
Naša scena treba da se ponaša ovako:
┌─────────────────────────────┐
│ │
│ ■ → │
│ │
│ ███████ │
│ │
│ │
└─────────────────────────────┘
Kada igrač dođe do zida:
■ → ███████
ne sme da nastavi kroz zid.
9. Testiranje sudara
Kada napravimo Collision Event, igru treba testirati.
Nije dovoljno samo pogledati da li je događaj napravljen.
Treba:
-
pokrenuti igru;
-
pomeriti igrača;
-
pronaći zid;
-
pokušati da prođemo kroz zid;
-
proveriti rezultat.
Testiranje je važan deo izrade igre.
10. Više zidova
U Room-u možemo imati više primeraka istog objekta:
obj_wall
obj_wall
obj_wall
obj_wall
I dalje imamo samo jedan tip objekta:
obj_wall
Ali ga možemo postaviti više puta.
Ako obj_player ima Collision Event sa obj_wall, pravilo važi za sve postavljene zidove tog objekta.
To znači da ne moramo praviti poseban Collision Event za svaki zid.
11. Zidovi mogu napraviti nivo
Od objekata zida možemo napraviti:
-
hodnik;
-
lavirint;
-
prostoriju;
-
granice nivoa;
-
prepreke.
Na primer:
┌──────────────────────────────┐
│██████████████████████████████│
│█ █│
│█ ■ █│
│█ PLAYER █│
│█ █│
│█ ██████ ███████ █│
│█ █│
│█ ███████ █│
│█ █│
│██████████████████████████████│
└──────────────────────────────┘
Sada već imamo nešto što liči na pravi nivo igre.
12. Šta je Bounding Box / granica objekta?
Za sudare GameMaker mora da zna koji deo Sprite-a pripada objektu.
To možemo jednostavno posmatrati kao njegovu granicu.
Na primer:
┌───────┐
│ ■ │
│ PLAYER│
└───────┘
Kada se granice igrača i zida dodirnu, GameMaker može registrovati sudar.
Za početak nije potrebno detaljno proučavati matematički model sudara.
Važno je razumeti:
GameMaker koristi granice objekata da bi utvrdio da li su objekti u kontaktu.
13. Eksperiment
Postaviti igrača blizu zida.
Pokrenuti igru.
Pokušati da se prođe kroz zid.
Zatim promeniti ponašanje igrača prilikom sudara.
Ponovo pokrenuti igru.
Posmatrati razliku.
Pitanje:
„Koji događaj se dogodio kada je igrač dodirnuo zid?“
Odgovor:
Collision Event.
14. Samostalni zadatak
Napraviti nivo sa:
-
jednim igračem;
-
najmanje šest zidova;
-
najmanje jednim dodatnim objektom;
-
mogućnošću kretanja igrača;
-
Collision Event-om između igrača i zida.
Igrač ne sme jednostavno da prolazi kroz zidove.
Nivo treba da ima oblik jednostavne prostorije ili lavirinta.
15. Dodatni zadatak
Napraviti zatvorenu prostoriju:
████████████████████
█ █
█ █
█ ■ █
█ █
█ █
████████████████████
Igrač ne sme da izađe van prostorije.
16. Pitanja za proveru znanja
-
Šta je sudar?
-
Šta je Collision Event?
-
Između kojih objekata može nastati sudar?
-
Zašto nam je Collision potreban?
-
Koja je razlika između
spr_walliobj_wall? -
Da li jedan Object može imati više različitih događaja?
-
Šta se događa kada igrač dodirne zid?
-
Da li moramo napraviti poseban objekat za svaki zid?
-
Zašto je važno testirati igru?
-
Šta GameMaker koristi da bi odredio da li su objekti u kontaktu?