.[ ČeskéHry.cz ].
Jak "nejlépe" na vlastní dialogy (okna)?

 
odeslat nové téma   Odpovědět na téma    Obsah fóra České-Hry.cz -> Obecné
Zobrazit předchozí téma :: Zobrazit následující téma  
Autor Zpráva
Houp



Založen: 28. 07. 2007
Příspěvky: 672

PříspěvekZaslal: 3. leden 2013, 14:17:28    Předmět: Jak "nejlépe" na vlastní dialogy (okna)? Odpovědět s citátem

Nejen ve hrách se často stane, že program vyžaduje v určitém místě odpověď hráče. Programátor chce mít něco takového :

kód:
odpoved = zeptejSe("To je hezka otazka?", "Ano", "Ne")


Chtěl by, aby další řádky kódu se prováděli až poté, co uživatel odpoví. Předpokládejme, že jsme na platformě, kde neexistuje knihovna, která to umí.

Určitě bude existovat více způsobů, jak to udělat. Jaké jsou tedy možnosti? Jde to rozumně i bez vláken?
_________________
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu Zobrazit autorovi WWW stránky
Ladis



Založen: 18. 09. 2007
Příspěvky: 1537
Bydliště: u Prahy

PříspěvekZaslal: 3. leden 2013, 14:20:13    Předmět: Odpovědět s citátem

Řekni mi, o které platformě mluvíš, že na to prý nemá funkci Smile
_________________
Award-winning game developer
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
goddard



Založen: 06. 11. 2007
Příspěvky: 175
Bydliště: Brno

PříspěvekZaslal: 3. leden 2013, 14:33:19    Předmět: Odpovědět s citátem

odpoved = zeptejSe("To je hezka otazka?", "Ano", "Ne")
if (odpoved) { yes(); } else { no(); }

nebo jsem to spatne pochopil? dialogova okna najdes snad vsude, jak zminil Ladis vyse...
_________________
http://www.dredwerkz.cz
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu Zobrazit autorovi WWW stránky
Houp



Založen: 28. 07. 2007
Příspěvky: 672

PříspěvekZaslal: 3. leden 2013, 14:34:45    Předmět: Odpovědět s citátem

Ale já chci být obecný Smile - jde mi spíš o to, jak to ty platformy mají implementované. Teď to mám třeba v Qt ->

kód:
QString dirName = QFileDialog::getExistingDirectory(this, tr("Save to CSV"), "");


Funkce, která mě nechá prohledávat v systému adresáře, jeden vyberu a dostanu do stringu jeho adresu, kterou na dalším řádku využiju. (to je jen příklad)

No a mě by zajímalo, jak něco takového bych sám mohl udělat. Jaké návrhové vzory se na to hodí apod.
_________________
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu Zobrazit autorovi WWW stránky
pcmaster



Založen: 28. 07. 2007
Příspěvky: 1827

PříspěvekZaslal: 3. leden 2013, 15:09:24    Předmět: Odpovědět s citátem

Vsak zdrojaky Qt su volne dostupne, mozes sa pokojne pozriet dovnutra a uvidis presne, ako to maju osefovane.

Pravdepodobne maju direktivami preprocesora obalene casti pre jednotlive platformy. Pri kompilacii (kniznice Qt) sa pouzije len kod cielovej platformy.
Ako vyvolavat dialogy na jednotlivych platformach si uz asi vies najst sam.

Nechapem, preco by si to chcel programovat sam, kedze uz rieseni je kopec, ale ak na tom trvas, tak to spravis presne takto - napises si kody pre vsetky platformy a budes kompilovat len jednu cast.

kód:
string Something()
{
#ifdef WIN32
 return WinAPISomething();
#endif
#ifdef OSX
 return GaySomething();
#endif
#ifdef LINUKS
 return TuxSomething();
#endif
}


Dufam, ze si si nemyslel, ze je to nejake zazracne -- tvoje Qt, ktore mas skompilovane len prave jedinu platformu, vie pustat veci len na tej jednej platforme - na ostatnych musis mat "ine" Qt Smile
_________________
Off-topic flame-war addict since the very beginning. Registered since Oct. 2003!
Interproductum fimi omne est.
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
Houp



Založen: 28. 07. 2007
Příspěvky: 672

PříspěvekZaslal: 3. leden 2013, 15:40:04    Předmět: Odpovědět s citátem

Hmm, tak zkusím položit dotaz trochu jinak.

Mějme klasickou herní smyčku :
kód:

while(true)
{
  handleInput();
  update(time);
  draw(time);
}


V update se někde spustí trigger, který má spustit dialogové okno a na základě odpovědi se má Něco udělat. Jak tohle vyřešit, když nechci využít cizí knihovnu? Určitě to někdo řešil. Nebo to nejde rozumě napojit na herní smyčku a je třeba událostmi řízená aplikace?

Pseudokód :
kód:

update(time)
{
 .........
 // jednoduchy trigger
 if(hrdina.pozice == vstupDoRise)
 {
     odpoved = dialog("Chces vstoupit", "Ano", "Ne");
     if(odpoved == "Ano")
     {
         hrdina.pozice = vystupDoRise;
     }
}
...
}

_________________
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu Zobrazit autorovi WWW stránky
]semo[



Založen: 29. 07. 2007
Příspěvky: 1526
Bydliště: Telč

PříspěvekZaslal: 3. leden 2013, 15:48:13    Předmět: Odpovědět s citátem

Někdo mi kdysi říkal, že na to našel dobrý návrhový vzor. Spočívalo to v tom, že byl stack, v tom stacku byly "okna" a vstup od uživatele (a update) dostávalo jen to, co bylo ve stacku navrchu. Kreslit můžeš všechny. To je jeden ze způsobů.
_________________
Kdo jede na tygru, nesmí sesednout.
---
http://www.inventurakrajiny.cz/sipka/
Aquadelic GT, Mafia II, simulátory
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
pcmaster



Založen: 28. 07. 2007
Příspěvky: 1827

PříspěvekZaslal: 3. leden 2013, 16:55:11    Předmět: Odpovědět s citátem

To sa ospravedlnujem, ale originalny dotaz som takto nepochopil Smile
_________________
Off-topic flame-war addict since the very beginning. Registered since Oct. 2003!
Interproductum fimi omne est.
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
perry



Založen: 28. 07. 2009
Příspěvky: 879

PříspěvekZaslal: 3. leden 2013, 18:03:36    Předmět: Odpovědět s citátem

]semo[
Tenhle přístup používám... jedna vrstva je game screen, druhá HUD a třetí potom hlášky programu... přičemž se dá nastavit, zda je blokující nebo ne (zobrazí se hláška => pauza hry ano / ne)

Každá ta "hláška" může být potom dělaná jako samostatná instance
kód:
Dialog d = new Dialog("Chces vstoupi", "Ano", "Ne");
d.IsBlocking(true);
gameScreenManager.push(d);

class Dialog : GameScreen

GetIsBlocking() //čteno v hlavní smyčce

Render()

Update(time)
  if (klikAno) { disposed = true; .. další kód pro ano ... return; }
  if (klikNe) { disposed = true; ... další kód pro ne ... return;}
 
  dělej něco (třeba animace pozadí)



Jediný "problém" je pak ty obrazovky zase ze stacku vyházet... na to má každá flag disposed a pokud je disposed = true, tak se přeskakuje. A čas od času přileze můj GC a uklidí stack (resp. vyháže disposed obrazovky).
Pak to nastavení pro kliky dělám většinou přes ukazatel na instanci, kam se to má poslat, takže např. MainGameScreen.

Nevím do jaké míry je to efektnivní, ale funguje mi to docela slušně (inventář, pauza, nastavení apod) Smile
_________________
Perry.cz
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu Zobrazit autorovi WWW stránky
goddard



Založen: 06. 11. 2007
Příspěvky: 175
Bydliště: Brno

PříspěvekZaslal: 3. leden 2013, 18:41:34    Předmět: Odpovědět s citátem

aha Smile ted kdyz se na to divam, tak tohle je docela bezna praktika pro html5 hry
_________________
http://www.dredwerkz.cz
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu Zobrazit autorovi WWW stránky
]semo[



Založen: 29. 07. 2007
Příspěvky: 1526
Bydliště: Telč

PříspěvekZaslal: 4. leden 2013, 10:56:44    Předmět: Odpovědět s citátem

perry napsal:

Jediný "problém" je pak ty obrazovky zase ze stacku vyházet... na to má každá flag disposed a pokud je disposed = true, tak se přeskakuje. A čas od času přileze můj GC a uklidí stack (resp. vyháže disposed obrazovky).


Proč GC? Nestačilo by prostě, aby metoda "okno.Update" vracela boolean, jestli se má okno killnout/vyhodit ze stacku?
_________________
Kdo jede na tygru, nesmí sesednout.
---
http://www.inventurakrajiny.cz/sipka/
Aquadelic GT, Mafia II, simulátory
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
perry



Založen: 28. 07. 2009
Příspěvky: 879

PříspěvekZaslal: 4. leden 2013, 11:08:18    Předmět: Odpovědět s citátem

Protoze bych si mazal ze stacku, zatimco z nej ctu (iteruju). Takhle tam mam pole ukazatelu na prvky stacku a mazu to pres to pole. Je to trochu hack, ale jde to.
_________________
Perry.cz
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu Zobrazit autorovi WWW stránky
]semo[



Založen: 29. 07. 2007
Příspěvky: 1526
Bydliště: Telč

PříspěvekZaslal: 4. leden 2013, 11:12:35    Předmět: Odpovědět s citátem

Jasně, ale ten stack je dobrý právě jen pro blokující dialogy. Pokud máš i neblokující, tak potřebuješ jiný kontejner, např. deque, nebo prostě vector, tam můžeš mazat během iterace. Bylo by to trochu čistší, než mít jednu věc ve dvou kontejnerech. Ale když už to máš hotový a odladěný, tak proč ne.
_________________
Kdo jede na tygru, nesmí sesednout.
---
http://www.inventurakrajiny.cz/sipka/
Aquadelic GT, Mafia II, simulátory
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
Zobrazit příspěvky z předchozích:   
odeslat nové téma   Odpovědět na téma    Obsah fóra České-Hry.cz -> Obecné Časy uváděny v GMT + 1 hodina
Strana 1 z 1

 
Přejdi na:  
Nemůžete odesílat nové téma do tohoto fóra
Nemůžete odpovídat na témata v tomto fóru
Nemůžete upravovat své příspěvky v tomto fóru
Nemůžete mazat své příspěvky v tomto fóru
Nemůžete hlasovat v tomto fóru


Powered by phpBB © 2001, 2005 phpBB Group


Vzhled udelal powermac
Styl "vykraden" z phpBB stylu MonkiDream - upraveno by rezna