| Zobrazit předchozí téma :: Zobrazit následující téma |
| Autor |
Zpráva |
Houp
Založen: 28. 07. 2007 Příspěvky: 672
|
Zaslal: 3. leden 2013, 14:17:28 Předmět: Jak "nejlépe" na vlastní dialogy (okna)? |
|
|
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 |
|
 |
Ladis

Založen: 18. 09. 2007 Příspěvky: 1537 Bydliště: u Prahy
|
Zaslal: 3. leden 2013, 14:20:13 Předmět: |
|
|
Řekni mi, o které platformě mluvíš, že na to prý nemá funkci  _________________ Award-winning game developer |
|
| Návrat nahoru |
|
 |
goddard
Založen: 06. 11. 2007 Příspěvky: 175 Bydliště: Brno
|
Zaslal: 3. leden 2013, 14:33:19 Předmět: |
|
|
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 |
|
 |
Houp
Založen: 28. 07. 2007 Příspěvky: 672
|
Zaslal: 3. leden 2013, 14:34:45 Předmět: |
|
|
Ale já chci být obecný - 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 |
|
 |
pcmaster

Založen: 28. 07. 2007 Příspěvky: 1827
|
Zaslal: 3. leden 2013, 15:09:24 Předmět: |
|
|
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  _________________ Off-topic flame-war addict since the very beginning. Registered since Oct. 2003!
Interproductum fimi omne est. |
|
| Návrat nahoru |
|
 |
Houp
Založen: 28. 07. 2007 Příspěvky: 672
|
Zaslal: 3. leden 2013, 15:40:04 Předmět: |
|
|
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 |
|
 |
]semo[

Založen: 29. 07. 2007 Příspěvky: 1526 Bydliště: Telč
|
Zaslal: 3. leden 2013, 15:48:13 Předmět: |
|
|
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 |
|
 |
pcmaster

Založen: 28. 07. 2007 Příspěvky: 1827
|
Zaslal: 3. leden 2013, 16:55:11 Předmět: |
|
|
To sa ospravedlnujem, ale originalny dotaz som takto nepochopil  _________________ Off-topic flame-war addict since the very beginning. Registered since Oct. 2003!
Interproductum fimi omne est. |
|
| Návrat nahoru |
|
 |
perry

Založen: 28. 07. 2009 Příspěvky: 879
|
Zaslal: 3. leden 2013, 18:03:36 Předmět: |
|
|
]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)  _________________ Perry.cz |
|
| Návrat nahoru |
|
 |
goddard
Založen: 06. 11. 2007 Příspěvky: 175 Bydliště: Brno
|
Zaslal: 3. leden 2013, 18:41:34 Předmět: |
|
|
aha ted kdyz se na to divam, tak tohle je docela bezna praktika pro html5 hry _________________ http://www.dredwerkz.cz |
|
| Návrat nahoru |
|
 |
]semo[

Založen: 29. 07. 2007 Příspěvky: 1526 Bydliště: Telč
|
Zaslal: 4. leden 2013, 10:56:44 Předmět: |
|
|
| 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 |
|
 |
perry

Založen: 28. 07. 2009 Příspěvky: 879
|
Zaslal: 4. leden 2013, 11:08:18 Předmět: |
|
|
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 |
|
 |
]semo[

Založen: 29. 07. 2007 Příspěvky: 1526 Bydliště: Telč
|
Zaslal: 4. leden 2013, 11:12:35 Předmět: |
|
|
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 |
|
 |
|