« Előző oldal- - - ^Tartalom^- - - Következő oldal »
ÚTVONALTERVEZÉS:
(GM 5.3-tól)
Az ezzel kapcsolatos függvények egy másik csoportja
ütközésmentes nyomvonalat számít. Ha ez a nyomvonal
elkészült, hozzá lehet rendelni egy tárgyhoz. A nyomvonal
kiszámítása némileg időigényes, de végrehajtása már
gyors. Mindez persze csak akkor működik, ha a helyzet
időközben nem változik. Ilyenkor (pl. ütközés esetén)
újra kell számítani a nyomvonalat.
Az első két függvény egyenes vonalú mozgást valósít meg:
mp_linear_path(nyomv,xc,yc,lepesm,ellmind) - egy
egyenes vonalú nyomvonal számítása a tárgy pillanatnyi
helyétől xc,yc helyig, a
jelölt lépésméretet használva. A lépéseket az mp_linear_step
függvényhez hasonlóan használja. A jelzett útvonalnak már
léteznie kell, és felül lesz írva az újjal. A függvény
visszatér, hogy található-e nyomvonal. Megáll és hibát
jelez, ha nincs egyenes útvonal a kiindulási és célpont
között. Hiba esetén is létrehoz egy nyomvonalat, mely addig a
pontig tart, ahol a tárgy megakadt.
mp_linear_path_object(nyomv,xc,yc,lepesm,obj) -
hasonló az előzőhöz, de most csak obj tárgy
példányai vannak figyelembevéve mint akadályok. Az obj
lehet egy tárgy vagy példányazonosító. GM 6.1-től.
mp_potential_path(nyomv,xc,yc,lepesm,ellmind,tenyezo)
- egy nyomvonal számítása a tárgy pillanatnyi helyétől xc,yc
helyig, a jelölt lépésméretet használva, elkerülve az
akadályokkal való ütközést. Az mp_potential_step
függvénybeni lépésmezőket használja, és a paraméter még
beállítható az mp_potential_settings függvényben
is. A jelzett útvonalnak már léteznie kell, és felül lesz
írva az újjal. A függvény visszatér, hogy található-e
nyomvonal. Az örökös számítás elkerülésére a tenyezo
hosszát 1-nél nagyobbra kell állítani. A függvény megáll,
és hibát jelez, ha nem talál a tényezőidőnél rövidebb
nyomvonalat a kiindulópont és a cél között. Hiba esetén is
létrejön egy nyomvonal, ami a cél felé indul, de nem fogja
elérni.
mp_potential_path_object(nyomv,xc,yc,lepesm,ellmind,obj)
- hasonló az előzőhöz, de most csak obj
tárgy példányai vannak figyelembevéve mint akadályok. Az obj
lehet egy tárgy vagy példányazonosító. GM 6.1-től.
A következő függvények a rács-alapú megközelítéssel egy
még összetettebb mechanizmust használnak (néha A*
algoritmusnak nevezik). Ez még sikeresebbé teszi a nyomvonalak
megtalálását (bár hibák itt is előfordulhatnak), és ezek
hossza is rövidebb lehet.
Először is elhelyezünk egy finom vagy durvább (ez gyorsabb
lesz) rácsot a pályán. Azután minden fontos tárgynak
meghatározzuk a rácscelláját az átfedésével (használva a
foglalatát vagy a pontos ellenőrzést), és megjelöljük
ezeket a cellákat tiltottnak. Így egy cella teljesen tiltott
lesz, még akkor is, ha csak részben van átlapolva egy
akadállyal. Végül meghatározunk egy kiindulópontot és egy
célt (melyeknek szabad cellákban kell lenniük), és a
függvény kiszámítja a legrövidebb utat ezek között. A
nyomvonal a szabad cellák közepén fog futni. Ha a cellák
elég nagyok, a közepébe elhelyezett tárgyat teljesen
magukbafoglalják. Ez a nyomvonal most már hozzárendelhető egy
tárgyhoz.
A rács-alapú megközelítés nagyon hatásos (és sok profi
játékban használják), de szükséges, hogy néhány dolgot
jól átgondoljunk. Meg kell határozni, hogy mely terület és
cellaméret felel meg a játéknak, hogy mely tárgyakat kell
kikerülni, és szükséges-e a pontos ellenőrzés. Ezek a
paraméterek erősen befolyásolják a megközelítés
hatásosságát.
Különösen a cella mérete a döntő. Emlékezzünk vissza
arra, hogy a celláknak elég nagyoknak kell lenniük a mozgó
tárgy befogadására (tudjuk biztosan a tárgy eredetpontját
(origin), és tudjunk arról is, hogy a nyomvonal elmozdítható,
ha a tárgy eredetpontja nincs a közepén). Ha a cellák túl
nagyok, könnyen mind tiltott lehet, mert átvághatnak egy
akadályt.
A következő függvények használhatók:
mp_grid_create(bal,teteje,vcellak,fcellak,cellasz,cellam)
- egy rács létrehozása. Egy indexszel tér vissza, amely a
további hívásokra használható. Több rácsszerkezet is
létrehozható és fenntartható egyazon időben. Bal
és teteje jelzik a rács sarkát a bal
oldalánál és a tetejénél. Vcellak és fcellak
a cellák száma vízszintesen és függőlegesen, az utolsó
két paraméter pedig a cellák szélessége és magassága.
mp_grid_destroy(id) - a jelzett rács
megsemmisítése, és az általa használt memória
felszabadítása. Ne felejtsük ezt hívni, ha már nincs
szükségünk a szerkezetre.
mp_grid_clear_all(id) - minden cella szabadnak
jelölése.
mp_grid_clear_cell(id,v,f) - az adott cella
törlése. A 0,0 a bal fölső sarokban lévő.
mp_grid_clear_rectangle(id,bal,teteje,jobb,alja)
- az adott területen minden cella törlése.
mp_grid_add_cell(id,v,f) - az adott cella
tiltottá tétele. A 0,0 a bal fölső sarokban lévő.
mp_grid_add_rectangle(id,bal,teteje,jobb,alja) -
a jelölt területen minden cella tiltása.
mp_grid_add_instances(id,obj,pontosan) - minden
cella megjelölése olyanná, hogy átvágják az adott tárgyat,
azaz tiltottak lesznek. A tárgy példányának id-je is
megadható, valamint az all kulcsszó is. Pontosan
jelzi, hogy a pontos ütközésérzékelést kell-e használni
(csak akkor működik, ha a tárgynál is be van állítva).
mp_grid_path(id,nyv,xstart,ystart,xcel,ycel,atlos)
- egy nyomvonal számítása a rácson keresztül. Nyv
egy létező
nyomvonal kell, hogy legyen, ami át lesz írva az újjal,
melynek xstart,ystart a
kiinduló-, és xcel,ycel a
végpontja. Atlos jelzi, hogy az átlós mozgás
megengedett-e a vízszintes vagy függőleges helyett. A
függvény visszatér, hogy sikerült-e találnia egy nyomvonalat
(a nyomvonal a jelenlegi tárgy példányától függ; a rácson
megy keresztül, és nem egy előírt példányé).
mp_grid_draw(id) - kirajzolja a rácsot, melyben
a zöld cellák a szabadok, és a pirosak a tiltottak.
Lassúsága miatt ezt csak hibakereső módban használjuk.