Mängumeistrid
Vaja abi: random teekond läbi leveli - Printerisõbralik versioon

+- Mängumeistrid (http://www.suvaline.org/MM)
+-- Foorum: Mängumeistrid (/forumdisplay.php?fid=3)
+--- Foorum: Abi, õpetused ja näited (/forumdisplay.php?fid=5)
+--- Teema: Vaja abi: random teekond läbi leveli (/showthread.php?tid=571)



Vaja abi: random teekond läbi leveli - InCreator - 02.09.2014 07:43

Selline lugu:
On vaja tekitada suvaline teekond läbi leveli. Sisuliselt üritan Pall 2-le tekitada random level generatorit.

http://i.imgur.com/k5cXjgK.png

Level on jagatud ruutudeks, tekitaja liigub ruuthaaval.

Tingimus 1:
Küll aga on tähtis, et sama ruutu ei kasutataks samas suunas (horisontaalselt või vertikaalselt) rohkem kui ühe korra.

Saab läbida korra vertikaalselt. Korra horisontaalselt. Ja korraga nii vertikaalselt ja horisontaalselt (risti läbi sõita sama ruut). Aga mitte sama teed tagasi tulles või sama teed läbi ruudu korrates

Pilt selgitab paremini.
[Pilt: 3bl6dVp.png].

Ruudustik ise on ds_grid, ja teekonna tekitaja asukohad võib eraldi ds_gridi tampida.
Aga kuidas seda ristumist/sama tee mitte kasutamist GM päriselt kasutama sundida?

Esimesel pildil on näha, et pall rikub seda reeglit ja kasutab parempoolse serva ruute uuesti vertikaalselt. Mängus oleks see võimalik ainult klaasnurke kasutades, ja tahan et generator "nii kaugele" veel mõelda ei suudaks.

Tingimus 2:
Et tekiks random teekond, tohib tekitaja keerata suvalises ruudus ennast 90 kraadi (tekib nurgakujuline teekond)
sellist ruutu ei tohi tekitaja enam kunagi läbida, ühtegi pidi.


Küsimus ongi, kuidas neid reegleid GMile arusaadavalt selgitada?

Ainus mõte praegu on tampida ruutude läbimine ds_gridi ja enne iga sammu vaadata, kuhu satume

* Kui pall läbib ruudu xy horisontaalis (suund on 0 või 180) panen ds_gridi xy väärtuseks "h". Sarnases suunas enam samale ruudule ei saa.
* Kui pall läbib ruudu xy vertikaalis (suund on 90 või 270) panen ds_gridi xy väärtuseks "v"
* Kui üks väärtus on pandud ja pall läbib uues suunas, on väärtuseks "rist" ja sellele ruudule pall enam minna ei tohi
* Kui pall kasutab suvaliselt 90-kraadi alla keeramist, väärtuseks "nurk" ja lukustab gridi xy samamoodi igaveseks

Loogiline eks? Aga nii on pallil lihtne sõita ekraani nurka, ja ennast nurka kinni mängida. Ilusa, tervet levelit utiliseeriva random teekonna asemel saame lihtsalt kiire ja lühikese failure.

Ja kuidagi liiga robustne tundub. Kindlasti on keegi asja nutikamalt lahendanud


RE: Vaja abi: random teekond läbi leveli - jnt - 02.09.2014 12:18

Esimene mõte, mis tekkis praegu (ilma midagi googeldamata) oli asja nö. vektoriteks jagamine. Ehk siis jookseb mingi loop (kas korduse või tulemuse tingimusega) ja igal loopil otsustatakse, et nüüd tehakse random x-y pikkune vektor. Pannakse veel randomiga juurde vektori suund (mis on piiratud veidi. Näiteks nö mäkke üles ronimine ei tohi teatud nurgast suurem olla) ja tõmmatakse joon valmis.

Nii teeks kõige lihtsama vektoritega raja (lisaks võivad veel olla tingimused juures seoses raja omavahelise ristumisega) ja lõpuks hakatakse neid vektoreid nö rasterisse viima, ehk sinu puhul vektori järgi maapinda joonistama.

Esimene mõte praegu hommikul. Üpris unine veel. Ilmselt natukese aja pärast täiendan oma mõtet või lükkan selle ise ümber. Big Grin


RE: Vaja abi: random teekond läbi leveli - InCreator - 02.09.2014 15:35

Um, tegu pole maapinna joonistamisega. Vaid nagu ütlesin, random teekonnaga 2D gridis.

Nagu pathfinding real-time strategy mängudes.


RE: Vaja abi: random teekond läbi leveli - jnt - 02.09.2014 16:10

(02.09.2014 07:43)InCreator Kirjutas:  Sisuliselt üritan Pall 2-le tekitada random level generatorit.

Kindel? Või mõistan ma seda kuidagi valesti? Tongue Kas sa tahad pathfinderit või pm. level generaatorit?


RE: Vaja abi: random teekond läbi leveli - Timo - 03.09.2014 15:00

Ma eile õhtul proovisin midagi teha, töötab kuni sinna maani kui läheb liiga seina äärde, ma fixin selle ära ja siis saadan sulle koodi ja selgituse. Kui ma ei leia noh eks ma saadan ikka või vähemalt selgitan mis ma tegin.

Gifist on näha, et kui rada jõuab vasakule serva siis ta hakkab imelikult tõmblema edasi tagasi ning küsimärgid(järgmine samm) ja punane ruut(sobimatu samm) hakkavad rajast hoopis eemal vilkuma ning rada ei pea enam reeglitest kinni.

[Pilt: pathgen.gif]

Mis ma teen:
*Salvestan gridi mis pidi sealt läbi liiguti
*Salvestan gridi mitu korda on läbi käidud (max 2)
*Oman array'd kus igas sammus salvestatakse suund kuhu edasi astutakse.
*Keelan tagasi astumist
*Luban astuda kohale kus gridilt on läbi käidud ainult 1 kord ja see on risti suunaga.
*Kui seisad juba olemasoleva raja peal siis luban ainult edasi astuda.
*Ei luba kaks korda järjest samas suunas keerata, vältides silmuseid kuhu takistust ei saa lisada:
Saab otse sihtpunkti lennutada ju ja tükke jääb üle.[Pilt: sellises_olukorras_kohustuslik_nurk.PNG]
*Omad mitut array'd et salvestada, eelmiste sammude staatusi ning mis suundasid on proovitud.
*Kui kuhugi neljas suunas astuda pole lähen sammu tagasi ning märgin, et see suund on kinni ja võtan järgmise.

Suht midagi sellist ongi. Sinna tuleb veel täiustusi teha, et ta rohkem mängitav oleks mitte ei teeks pikka sirget ühes suunas, näiteks piirata liiga pikalt ühte suunda liikumist või sundida hoida ruumi keskkoha poole kui liiga servas on. Samamoodi liiga palju pöördeid on igav.


RE: Vaja abi: random teekond läbi leveli - InCreator - 03.09.2014 15:16

Täiega sinnapoole, mida vaja on.
Eriti hea kui pöörde tegemise / otse minemise sagedust saaks kontrollida: mida rohkem sakitamist, seda keerulisem on mängija jaoks pärast. Teisest küljest, paljud mängijad järgivad melu ühes ekraani nurgas ja ei tule vahel selle pealegi et järgmise sammu jaoks tuleb pall ajada sirgjooneliselt hoopis teise...
Ja 19x10 ruuduse taseme jaoks ehitaja parajaks timmida. Et ka visuaalselt jääks suht huvitav teekond


RE: Vaja abi: random teekond läbi leveli - Timo - 06.09.2014 13:34

Okei ühed vead sain parandatud aga kusagil on veel mingi jama sees, paar pathi genereerib ilusti aga siis tuleb üks katkine jälle vahele.

Praegu see risti mineku lubamine genereerib päris keerulisi lahendusi
[Pilt: raskemap.PNG]

Seega ma loodan, et sul olid need torud veel plaanis, nüüd peab olema toru mis lubab mõlemat pidi läbi minna aga nurka ei luba peale teha. Need reeglid mõtlesin ma ka juba välja mis pärast kohustuslikud nurgad ja otseteid blokeerivad ruudud maha panevad ning torud kui rajad sõidavad kõrvuti jms.


Praegune source ja exe, et niisama mängida: http://www.snjrp.eu/s/PallGeneraator.rar
R täht teeb restardi, kui lased lõpuni teha siis on järgmiste ruumide väljanägemised igal käivitamisel samad.
Kõik kood on objekt1 sees, objekt0 oli koopia lihtsalt mingist ajast. Hoiatan ette kood pole eriti loetav, sest hetkel saab nii kiiremini vigu leida.