2D hra, nekonečný svět. – Hry – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

2D hra, nekonečný svět. – Hry – Fórum – Programujte.com2D hra, nekonečný svět. – Hry – Fórum – Programujte.com

 

10. 3. 2013   #1
-
0
-

Ahoj všichni, rád bych se zeptal místních borců programátorů. Programuji hru, a trochu jsem se zasekl na jednom logickém problému. Nejde mi o kusy kódu, jako spíš o nějaký nápad na efektivní řešení. 

Jde o 2D hru. Konkrétně o vesmír. Tam nastává problém při generování nekonečného vesmíru, kde se generují různé objekty. Mé řešení bylo že generuji objekty ve směru a rychlosti pohybující se kamery. To působí velice hezky a věrohodně, ale nastává problém když se začnu vracet stejným směrem tak na stejném místě se generují věci znovu. A samozřejmně pokud se zdálí od objektu na určitou vzdálenost, tak kvůli optimalizaci se objekt smaže. Ale toto řešení je opravdu nehezké a možná i dost špatné. Víte někdo jak na to? Napadlo mě už dost řešení který by fungovali, ale z hlediska optimalizace a prasáctví kódu :D sem je zavrhnul.

Nahlásit jako SPAM
IP: 2001:718:1801:1a02:200:5e...–
http://www.davidrosko.gekoni.cz/
Tom
~ Anonymní uživatel
434 příspěvků
10. 3. 2013   #2
-
+1
-
Zajímavé

Me napadaji 2 reseni:

1) uklada to co si uz prosel, ale to je nerealne, pokud chces mit nekonecny vesmir :)

2) Generovat objekty na zaklade nejakych pevne dannych pravidel. Muze tam byt i nahoda, ale musis si ulozit seed, abys byl schopny na zaklade tech pravidla vygenerovat se stejnym seedem vzdy stejne objekty (seed se muze s novou hrou menit, takze i vesmir bude pokazdy jiny). Takze jakmile se otocis, tak znovu zacnes generovat objekty podle stejnych pravidel, jako kdyz si letel tam....tzn objekty se vygeneruji stejne.

Nahlásit jako SPAM
IP: 89.102.36.–
m4r100
Návštěvník
10. 3. 2013   #3
-
+1
-
Zajímavé

Nevim jestli jsem to pochopil spravne, ale nepouzivas zadnou ctvercovou mapu? Pokud ne, tak si ji vytvor. Je to dobry zpusob na reseni kolizi, vykreslovani jenom toho co potrebujes, atd.

Tvuj pripad bych resil tak, ze si vytvorim treba mapu velikosti 50x50 (map[50,50]) nebo vetsi, na obrazovku se vleze napriklad jenom 30x30, takze se bude vykreslovat jenom 30x30 ctvercu z te mapy. Ktere, to zavisi na pozici hrace. Vzdycky, kdyz se hrac pohne tak se cela mapa posune na druhou stranu a vygeneruje nova na praznych ctvercich (ve smeru pohybu). Tim padem se bude moct hrac vracet, ale jenom o tu rezervu (20 ctvercu, popripade vic, pokud je vetsi mapa).

Nahlásit jako SPAM
IP: 78.102.208.–
Doomista+1
Stálý člen
11. 3. 2013   #4
-
0
-

taky bys to mohl řešit tak, že bys měl v průměru cca 10000 objektů na kruh s poloměrem 4000 (v tvých číselných jednotkách, které máš). následně vytvořit strukturu, která udrží v paměti řekněme xy souřadnice objektu plus informaci o typu objektu (typy objektů včetně rozměrů pro kolize by tam byly globálně definovány a ušetřila by se paměť) a jen tak pro jistotu mít rozsah struktury 15k objektů. je to jednodušší než řešit seed, ramku ti to taky nezlikviduje nějak zásadně a bude to schopno udržet dost informací na to, aby to nevypadalo tak divně.

Nahlásit jako SPAM
IP: 195.113.191.–
Na vše stačí iostream...
15. 3. 2013   #5
-
0
-

#2 Tom
To je hodne dobrý nápad s tím seed :). Ale bohužel to by mělo za následek, že mapa bude vždy stejná, když se vrátím na starou pozici po delší době. Například zničím planetu odletím a vrátím se zpět, abych ji zničil znovu. To by bylo pro hráče takové nudné expení. :) 

Nahlásit jako SPAM
IP: 85.207.31.–
http://www.davidrosko.gekoni.cz/
15. 3. 2013   #6
-
0
-

#3 m4r10
Ahoj super díky moc za nápad :). Kolize řeším pomocí NVIDIA PHYSX takže bych to musel radikálně překopat. Ale ta čtvercová mapa mylsím že bude řešení :) pamatovat si nějaké prostory(čtverce)  aby když se vrátím na stejné místo za chvíli tak aby vše bylo jako při staru. Ale pokud se vrátím po delší době tak v prostoru se vygenerují nové asteroidy. Díky moc.

Nahlásit jako SPAM
IP: 85.207.31.–
http://www.davidrosko.gekoni.cz/
15. 3. 2013   #7
-
0
-

#4 Doomista
Ahoj, díky za radu. Ale bohužel problém byl spíš s tím jak generovat nové objekty dynamicky. Aby to bylo jako nekonečný vesmír. Tvé řešení je spíš jak vygenerovat velké množství v omezeném vesmíru. Ale přesto díky :) tvé řešení určitě se bude dát použít na vyladění.

Nahlásit jako SPAM
IP: 85.207.31.–
http://www.davidrosko.gekoni.cz/
Doomista+1
Stálý člen
15. 3. 2013   #8
-
0
-

#5 David Roško
problém znovu vytvořené planety by se dal řešit obrácením mého přístupu. nevytvářet databázi objektů které existují, ale objektů, které již neexistují, popřípadě by se dal třeba u asteroidů i definovat timeout pro spawn a po jeho naplnění by se entita smazala ze seznamu

Nahlásit jako SPAM
IP: 90.176.176.–
Na vše stačí iostream...
prdelnatý anděl
~ Anonymní uživatel
33 příspěvků
22. 6. 2013   #9
-
0
-

Já osobně bych do čtverečků nešel a zvolil bych u všech objektů evidovat jejich [x, y], pravděpodobně s indexací (kvůli tomu, že k nim bude potřeba přistupovat rychle právě na základě jejich pozice). Pak bych periodicky vyfiltrovával 'blízké předměty' (ty, které budou na obrazovce nebo +/- v nejbližším okolí) do jakéhosi lokálního seznamu a s ním bych pak pracoval při zobrazování těchto objektů a vyhodnocování stavu každého z nich - toto by bylo už být rychlé a s příjemným frameratem; filtrování blízkých objektů řádově jednou za pár vteřin (to by bylo třeba vyladit). Toto řešení (si myslím) by šlo i pro hru více hráčů s jedním herním serverem. Dokonce bych si uměl představit zapojit do toho i databázi (vše na jednom místě, optimalizované filtrování objektů pomocí indexů, vyřešené ukládání, atd). Jak nad tím přemýšlím, tak se mi to chce udělat ;-)

Nahlásit jako SPAM
IP: 213.151.77.–
Doomista+1
Stálý člen
22. 6. 2013   #10
-
0
-

#9 prdelnatý anděl
Nojo, ale autor chtěl dynamicky generovaný vesmír. To tvoje řešení počítá s víceméně statickým seznamem objektů. Vyloženě čtvercová mapa taky není nutná. Stačí si rozsekat prostor na kvadranty, řekněme třeba 400x400 jednotek (za předpokladu že planeta má kupříkladu 200x200) a seed by ošetřil i 'náhodnou' pozici objektu v rámci toho sektoru. Vypadá to líp, protože objekty pak nebudou striktně umístěny ve sloupcích a řadách, ale budou rozházené a zároveň by mělo být stále velmi jednoduché pro to vytvořit generovací algoritmus. Pak by se skutečně dal využít onen seznam nejbližších objektů, který by jednou za čas kontroloval zda objekty nejsou už za hranicí viditelnosti a zároveň by včas vytvářel nové objekty. Objekty které již jednou byly zničeny musí být evidovány zase v jiné databázi, aby se nespawnovaly znovu, jiné řešení mne nenapadá. Problémem by byla optimalizace té databáze, aby její kontrola nebrala příliš výpočetního času.

Nahlásit jako SPAM
IP: 90.176.176.–
Na vše stačí iostream...
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 2 hosté

Podobná vlákna

Nekonečný iframe — založil zonda

Chcete změnit svět? — založil janmo

Chcete změnit svět? — založil janmo

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032024 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý