Roguelike odhalování mapy bez kostek? [GM:S/gmz]

Pokud si nevíte s něčím rady ohledně tvorby v Game Makeru - pište sem!
Post Reply
Kaleta
Posts: 16
Joined: October 23, 2011, 1:53 pm
Facebook: http://facebook.com/

Roguelike odhalování mapy bez kostek? [GM:S/gmz]

Post by Kaleta »

Zdravím všechny.
Zkouším udělat engine na roguelike hru, odehrávající se ve mřížce. Mám dvě kritéria:
- Použít co nejvíc zabudovaných funkcí z Game Makeru (mp_grid pathfinding, ds_grid, atd)
- Udělat to pořádně - tahový systém, odhalování mapy, apod.

A právě s tím odhalováním mapy mám problém. Dokážu udělat jednoduchý a špinavý raycasting od hlavní postavy přes collision-line na všechny čtverečky na mapě a odhalit je nebo je skrýt podle toho, jestli jsou nebo nejsou vidět. Samozřejmě ta detekce kolizí není dokonalá a občas je vidět přes rohy něco, co by nemělo, ale to je teď jedno.

Povedlo se mi udělat odhalování mapy se čtverečky. Tady jsou 32x32, ale já je mám 64x64 a to už je teda dost zubatá grafika.
(pozor, obrázky jsou pouze ilustrační, nejsou z této hry, je to Dark Disciples I a II, super RPG s výborným příběhem a designem)
Image

Proto jsem chtěl udělat alespoň trochu zaoblené okraje, něco jako tohle:
Image

Teoreticky to jde (upravil jsem trochu jeden trik z automatické orientace sprajtů u zdí a převrátil ho "naruby"), ale ta detekce zdí a kolizí přes collision_line prostě není dost dobrá, aby to fungovalo. Navíc zdi mají ve zvyku zůstat ve "stínu" a to, že je schválně nechávám odhalit, ten efekt ještě zhoršuje.

Se změnami depth si hrát nechci, protože bych chtěl ještě poloviditelnost na mapě - co už bylo prozkoumáno (viditelné zdi) ale je "ve stínu".

Pokud se podíváte na zdroják, potřebujete pouze změnit dva skripty:
step_fovgrid
draw_fovgrid
draw_fovgrid_backup funguje skoro bezchybně...jenom ty kostky.

Prostě spusťte hru, choďte myší okolo (držení nebo klik, to je jedno) a držením Enteru vyzkoušíte druhý způsob vykreslování stínů.

Řeším to přes ds_grid, protože je to něco, od čeho bude záviset AI, resp. jestli vás nepřátelé uvidí a začne bitka. Chtěl bych i víc hlavních postav, takže to musí být globální datová struktura.
Ale to už bude ten raycasting hodně náročný a už teď to přepočítávání probíhá 1024krát za krok, bude to chtít vymyslet nějaká zjednodušení nebo omezení.

STAHUJTE ZDE

Takže v zásadě se ptám na dvě věci:
- Umíte někdo stíny bez kostiček, nebo aby ty velké kostky nevypadaly tak hrozně? (dokonce i moderní hry to mají)
- Umíte někdo lepší raycasting/line of sight pro fog of war?
http://www.unlok.ca/wayward/inspiration ... og-of-war/
User avatar
Mikos
Posts: 233
Joined: August 6, 2011, 12:34 am

Re: Roguelike odhalování mapy bez kostek? [GM:S/gmz]

Post by Mikos »

Ohľadom toho fog-u (kostičiek) si pozri surfaces.
http://docs.yoyogames.com/source/dadios ... index.html

Menšia záťaž na RAM aj na cele PC a ak budeš šikovný tak to nemusí vyzerať tak kostrbato :) A ten RayCasting netuším čo chceš :D
Kaleta
Posts: 16
Joined: October 23, 2011, 1:53 pm
Facebook: http://facebook.com/

Re: Roguelike odhalování mapy bez kostek? [GM:S/gmz]

Post by Kaleta »

Díky za tip :) Surfaces asi použiju na to vykreslování.

Jediné, co mě napadlo, je použít větší kruhy místo čtverců :D Ano, vypadá to lépe, jenom ty stíny se překrývají. Asi bude nejlepší naučit se surfaces, sloučit stíny do jednoho. Ještě by to šlo udělat nějakým pokročilým blend módem, ale to neumím.

Raycasting je tohle, collision_line je jako paprsek od hráče na každou z kostek. V této chvíli používám tuhle metodu: Celá místnost je rozdělená na kostičky, 64x64, kterých je 1024 kusů. Každý krok (ne step) se testuje collision_line mezi každou ze 1024 kostek a hráčem. Jestli je volno, tak se kostka odbarví, jinak zase zčerná. Hrubé, ale účinné a jde to asi i trochu optimalizovat.
D-Sheep
Posts: 768
Joined: September 7, 2011, 10:17 pm
Facebook: http://facebook.com/sheepdave
Location: Praha, CZE
Contact:

Re: Roguelike odhalování mapy bez kostek? [GM:S/gmz]

Post by D-Sheep »

Jestli to chceš mít opravdu pořádně a efektivně, doporučoval bych ti ukládat si mapu stínů v něčem, co se jmenuje Quadtree. Je to geniální způsob, jak ukládat řídkou bitmapu. Protože tohle, co tam máš teď, je použitelný jen pro malý místnosti. Pokud budeš mít štěstí a já trochu času, dám dohoromady nějakou ukázku implementace v GM.
User avatar
Mikos
Posts: 233
Joined: August 6, 2011, 12:34 am

Re: Roguelike odhalování mapy bez kostek? [GM:S/gmz]

Post by Mikos »

Keď už tak tak namiesto collision_line by som nato použil place_meeting

http://docs.yoyogames.com/source/dadios ... eting.html

Na také niečo je to podľa mňa praktickejšie :)
Kaleta
Posts: 16
Joined: October 23, 2011, 1:53 pm
Facebook: http://facebook.com/

Re: Roguelike odhalování mapy bez kostek? [GM:S/gmz]

Post by Kaleta »

D-Sheep wrote:Jestli to chceš mít opravdu pořádně a efektivně, doporučoval bych ti ukládat si mapu stínů v něčem, co se jmenuje Quadtree. Je to geniální způsob, jak ukládat řídkou bitmapu. Protože tohle, co tam máš teď, je použitelný jen pro malý místnosti. Pokud budeš mít štěstí a já trochu času, dám dohoromady nějakou ukázku implementace v GM.
Wow, před pár dny jsem to myslím viděl u generování náhodných místností a drolících se textur :)
Máš pravdu, je to geniální a vůbec by mě nenapadlo pro fog of war. Ale nedělej si s tím tu práci, povedlo se mi ty cykly dost razantně omezit asi na čtvrtinu, z 1024 na 252-260, jenom tím, že beru zrovna ty, co jsou na obrazovce a ne v celé místnosti.

Tady je upravená verze:
https://dl.dropboxusercontent.com/u/374 ... engine.gmz

Spíš je problém s tím zobrazením stínů, s překrývajícími se kolečky. Budu se muset podívat na surfaces.
Mikos wrote:Keď už tak tak namiesto collision_line by som nato použil place_meeting

http://docs.yoyogames.com/source/dadios ... eting.html

Na také niečo je to podľa mňa praktickejšie :)
Pokud si dobře pamatuju, tak place_meeting zabírá jenom bod. Já potřebuju zabrat čáru mezi dvěma body a zjistit, jestli je volná. Tj. něco takového:

Image
User avatar
Mikos
Posts: 233
Joined: August 6, 2011, 12:34 am

Re: Roguelike odhalování mapy bez kostek? [GM:S/gmz]

Post by Mikos »

Toto cez collision_line nepôjde :) uff.. no to bude chcieť kombináciu surfaces a draw_vertex a veľa matematiky :D

GL&HF :) skúsim niečo zbúchať ak budem mať čas :)

Ehm dodám ešte pri niečom takom je dobre mať spravené mergovanie.
Kaleta
Posts: 16
Joined: October 23, 2011, 1:53 pm
Facebook: http://facebook.com/

Re: Roguelike odhalování mapy bez kostek? [GM:S/gmz]

Post by Kaleta »

Mikos wrote:Toto cez collision_line nepôjde :) uff.. no to bude chcieť kombináciu surfaces a draw_vertex a veľa matematiky :D

GL&HF :) skúsim niečo zbúchať ak budem mať čas :)

Ehm dodám ešte pri niečom takom je dobre mať spravené mergovanie.
Díky, ale ke štěstí mi chybí jenom to mergování, jestli vím, co myslíš :) Vidíš ty stíny a tmu?
Image
Opravdické dynamické stíny naštěstí dělat nemusím (i když by bylo hezké to umět), mám to o dost jednodušší, že tou collision_line jenom testuju, jestli je nějaký čtverec viditelný, černý, nebo šedý. Ty zaoblené okraje by byly hezké, ale asi se bez nich musím obejít, nebo udělat efekty přes surfaces.

Ale možná by tě zajímalo, že přesně tohle už udělal Jazzuo v hodně staré verzi GM. Jak vidíš, tak surfaces není třeba :D
http://www.gamemakergames.com/archive/action-maze
Image
User avatar
Mikos
Posts: 233
Joined: August 6, 2011, 12:34 am

Re: Roguelike odhalování mapy bez kostek? [GM:S/gmz]

Post by Mikos »

Ako si na tom :) veľmi rád by som sa dozvedel niečo viac o tvojom postupe :) sám som si pozrel system raycastu (naozaj to chce matematiku) :) a zostrojil som niečo :) ak by si mal s tým stále problém daj vedieť :)
Kaleta
Posts: 16
Joined: October 23, 2011, 1:53 pm
Facebook: http://facebook.com/

Re: Roguelike odhalování mapy bez kostek? [GM:S/gmz]

Post by Kaleta »

Mikos wrote:Ako si na tom :) veľmi rád by som sa dozvedel niečo viac o tvojom postupe :) sám som si pozrel system raycastu (naozaj to chce matematiku) :) a zostrojil som niečo :) ak by si mal s tým stále problém daj vedieť :)
Promiň, že dlouho nepíšu - mám teď toho hodně ve škole i v práci. Tady máš novou verzi.
https://dl.dropboxusercontent.com/u/374 ... engine.gmz

Co se týče postupu, tak hlavní věc je skript step_fovgrid (složka process step). Udělal jsem jenom to, že jsem to převedl na surfaces a trochu se s tím naučil pracovat. Věřil bys, že vykreslování sprajtu na surface (resp. gumování tmavosti) je stejné bez ohledu na alpha? Musím místo alpha dát světlost do make_color_hsv(odstín,sytost, světlost), potom to určuje, nakolik bude ten surface průhledný.

Jinak jsem to dal tak nějak dohromady - vypadá to prasácky (prolínání stínů), funguje to prasácky (naštěstí pouze pro omezené množství políček na obrazovce), zvládá to jenom jeden (centrální) zdroj světla, ale dělá to to, co by fog of war měl dělat.

Pro další vývoj by bylo třeba vyřešit tyhle problémy:
- Neprolínat stíny. Tam, kde je černota, je černota, to není problém. (i když nějaká textura na neprozkoumané oblasti by byla hezká :) ) Tam, kde je stín, by měla být uniformní poloprůhledná šeď. A úplně nejlepší by bylo, kdyby okraje mezi stínem a světlem a stínem a temnotou měly gradient. To vyžaduje dost pokročilou znalost surfaces a kdoví čeho ještě.

- Zlepšit algoritmus. Nejdřív vykreslit temnotu všude. Potom vykreslit světla pro všechny světelné zdroje. A pak to zase částečně zakrýt podle toho, co je viditelné z centrálního zdroje světla - nebo vícero centrálních zdrojů.
Je dobré to dělat přes datové struktury jako ds_grid, protože potom je viditelnost objektivní a to lze využít pro věci jako plížení, kradení a útoky ze zálohy.

Kdyby se povedlo alespoň okopírovat tenhle herní engine, byl by to nevídaný úspěch. Upřímně řečeno, autor Jeff Vogel používá skoro stejný engine od roku 1994, používá i spoustu notoricky stejné grafiky, ani ta hratelnost není někdy dokonalá a soustředí se čistě příběh, questy a objevování. Čtvercový tahový systém je prostě poklad vývojářského světa.
[youtube]http://www.youtube.com/watch?v=9H0Q01lpgk4[/youtube]
Post Reply