HTML

Survive Developement

Itt olvashatod a Survive! nevű játék fejlesztésének állapotát, lépéseit. És mi is lesz a játék? Egy zombis-túlélős játék, ahol elsősorban a csapatmunkára építkezve kell megpróbálni életben maradni egy kihalt városban. A terep teljesen a tietek, nincsenek szabályok: éljetek túl, ahogy tudtok!


Küldj e-mailt nekünk:
gilgamesco@gmail.com

Sikolyok

Ettől tépjük a hajunkat:

Friss topikok

  • Sir Butcher: A gyors mozgású ütközés-érzékelés majd a lövésnél lesz topic :D A második esetben teljesen igaza... (2012.04.05. 16:38) Ütközésérzékelés
  • _fpeti_: Halad ez. (2012.04.04. 22:01) Gravitáció
  • Sir Butcher: Az sem rossz, az tény :D Szerencsére egyelőre annyi különbözőt kell csinálnom, hogy esélyem sincs ... (2012.02.20. 21:48) Scenery - Még több látvány
  • Sir Butcher: Na, ideírom: obj-nél megoldottam a csontokat. Melléktermékként összejöttek, extra számítás nélkül ... (2011.12.02. 11:48) Model Animálás - a probléma, és a (vélt) megoldás
  • Burwor: "A tesztvárosban sétálgatva belefutsz egy házba, aminek hiányzik egy fala. Mit csinálsz?" Zárva a... (2011.11.10. 15:00) Sziduri - a grafmotor bemutatkozik

Telekbányász

2011.10.22. 16:41 :: GizmoSDK

 Miután már egy működő, és valamennyire elviselhető városgenerátort sikerült összedobni, nekiálltam a telekbányásznak. Ez a kis modul felelős azért, hogy a városgenerátor által kiköpött gráfból kiszedjem a telkeket, vagyis azokat a területeket, amiket minden oldalról út határol. A tőlem megszokott elméleti fejtegetés következik.

Adott egy gráf, ami úgy van reprezentálva, hogy tudjuk az összes pont koordinátáját, meg, hogy mi mivel van összekötve. Namármost a kérdés, hogy ebből hogyan kapunk egy olyan adatszerkezetet, ami mondjuk hasonlít egy poligontömbhöz. Először is, mi a poligon? Hát az simán pontok (illetve pontosabban: pozíciók) tömbje. Vagyis a poligontömb nem más, mint pozíciók tömbjének tömbje. Szeretjük az adatszerkezeteket, ugye? :D

Viszont az sem árt, ha nem csak random pontokat rakunk bele egy tömbbe, hanem azok csatlakoznak egymáshoz utakon keresztül. Oké, ezt még meg tudjuk oldani, egyszerűen fogunk egy tetszőleges pontot, kiválasztunk egy tetszőleges szomszédot, és máris van két pontunk, ami össze van kötve. Aztán a következő pontnál is kiválasztunk egy szomszédot (ami szerencsés esetben különbözik az első ponttól), és így tovább. Tulajdonképpen a telek kiszedése hasonló ehhez, csak nem véletlenszerűen választjuk a szomszédokat.

Amikor a városban vagyunk, és programozók egy csoportja odaszegezi az uzit a homlokunkhoz, hogy sétáljunk körbe egy telket, hogyan abszolváljuk a feladatot? Elindulunk egy kereszteződésből, és minden kereszteződésnél az ISO-szabvány szerint megjelölt irányba (esetünkben ez most legyen a bal oldal, mert az a jobb :D), majd a következő kereszteződésnél is elsétálunk balra. Ámde nemcsak akármelyik bal oldali elágazásba sétálunk bele, hanem amelyik legközelebb van az előző utcához. Ezt úgy tudnánk szépen leírni, hogy amikor elérünk egy kereszteződéshez, akkor szembefordulunk azzal az úttal, amerre jöttünk, majd elkezdünk jobbra forogni, és az első út, amit meglátunk, az lesz a "legbalabbik" út.

Példa.

Itt egy ábra. Az "A" jelű pontból indultunk, és megérkeztünk a "B" jelű pontba. Megfordulunk, úgy, hogy "A"-val szembe nézünk, ekkor a narancssárga vonal mutatja az irányunkat. Majd a pirossal jelölt nyíl irányában megfordulunk jobbra, és az első út lesz a keresett út.

No, ha ez megvan, akkor már csak azt kell megoldani, hogy ne járjunk be olyan poligont, amit már egyszer bejártunk. Kis belegondolással belátható, hogy minden utat pontosan kétszer fogunk bejárni (egyszer oda, egyszer vissza), mivel minden útnak két oldala van, tehát minden út két telekkel lesz "szomszédos". Tehát jelölni kell valamivel, hogy ezt az utat ilyen irányban már egyszer bejártuk-e. Én egy egyszerű megoldást választottam: mivel már nem lesz szükségem a gráfra, és mivel egy út mindkét végpontjában tárolva van az út, egyszerűen kitörlöm az utat abból a pontból, amiből épp kiindultam. Visszafelé még vissza tudok jönni egyszer, mivel a másik végpontban még benne van. Íme, egy példa az eredményből:

Persze jogosan veti fel valaki, hogy mi van a szélekkel? Nos, igen, a mostani rendszer azokat is bejárja, szóval ezzel majd kezdeni kell valamit. Több ötletem is van erre, például megadom, hogy egy poligon maximum "n" pontot tartalmazzon. Vagy, mivel ez az egyetlen ilyen invalid telek, elég, ha megkeresem azt a telket, ami rengeteg pontból áll, és kitörlöm. De biztosabb, ha megnézem a külső szögek összegét. A belső (elfogadható) telkeknél ez 360 fok lesz, míg a telekhatárnál -360 fok.

És most, hogy megvannak a telkek, jöhet a következő napirendi pont: a lakások legenerálása. Hallelujah!

Szólj hozzá!

Címkék: gráf generálás városgenerálás

A bejegyzés trackback címe:

https://survivedev.blog.hu/api/trackback/id/tr413322180

Kommentek:

A hozzászólások a vonatkozó jogszabályok  értelmében felhasználói tartalomnak minősülnek, értük a szolgáltatás technikai  üzemeltetője semmilyen felelősséget nem vállal, azokat nem ellenőrzi. Kifogás esetén forduljon a blog szerkesztőjéhez. Részletek a  Felhasználási feltételekben és az adatvédelmi tájékoztatóban.

Nincsenek hozzászólások.
süti beállítások módosítása