Zobrazit předchozí téma :: Zobrazit následující téma |
Autor |
Zpráva |
perry

Založen: 28. 07. 2009 Příspěvky: 879
|
Zaslal: 11. září 2013, 17:01:29 Předmět: LUA |
|
|
Když už se tu dneska řeší ta LUA Tak se zeptám.
a) Má význam psát si vlastní wrapper na LUA pro C++ ?
b) Pokud a == ano -> je ideální přístup ala COM-Interface ?
c) Předpokládám ale, že nejde udělat nějak automaticky bind funkcí, aniž bych je musel všechny "přepsat" a používat lua_push apod. fce. Tzn. každou funkci, kterou chci vidět v LUA, musím ručně přepsat. Zkoušel jsem hledat nějaký auto-bind (podobně jako v C# přes [Export] atribut), ale nic jsem nenašel. A dodefinovat si vlastní chování #pragma (ala OpenMP) jsem zjistil, že nejde , protože to je compiler-specific
d) Na základě c) mi ale přijde zbytečné psát C++ wrapper, protože klidně můžu napsat fce. do_this(ptrA, x, y), do_that(ptrB, y), ptrA = create_this()... a volat je.  _________________ Perry.cz |
|
Návrat nahoru |
|
 |
mar
Založen: 16. 06. 2012 Příspěvky: 610
|
Zaslal: 11. září 2013, 17:07:21 Předmět: Re: LUA |
|
|
No já luu (lua? nepoužívám, ale myslím, že co jsem se kdysi díval, tak existuje luabind. Jak moc to je/není použitelné, nevím, jak někde vidím include něčeho z boostu, okamžitě mažu z disku  |
|
Návrat nahoru |
|
 |
perry

Založen: 28. 07. 2009 Příspěvky: 879
|
Zaslal: 11. září 2013, 17:48:55 Předmět: |
|
|
Jo.. boost mi nesmí přes práh taky Jako těch wrapperů je hromada, to vím. Spíš jak jsem psal d), jestli se to vůbec vyplatí  _________________ Perry.cz |
|
Návrat nahoru |
|
 |
nou

Založen: 28. 07. 2007 Příspěvky: 1050
|
Zaslal: 11. září 2013, 19:24:41 Předmět: |
|
|
ja som raz v jednom projekte pouzil tolua++ http://www.codenix.com/~tolua/ parsuje to C++ hlavicky a automaticky vygeneruje wrapper. moze ale vadit ze treba pomocou komentarov
kód: |
//tolua_begin
//tolua_end
//tolua_export |
vyclenit co sa ma exportovat a co nie. _________________ Najjednoduchšie chyby sa najtažšie hľadajú. |
|
Návrat nahoru |
|
 |
VODA

Založen: 29. 07. 2007 Příspěvky: 1721 Bydliště: Plzeň
|
Zaslal: 11. září 2013, 20:07:13 Předmět: |
|
|
Když řešíme tu Luu (Lua), jak byste řešili to, když chci ve skriptu počkat na dokončení nějaké operace? Něco ve stylu:
kód: |
say("Hi")
moveTo(10, 10)
waitForLastCommand()
say("I'm here") |
A vláknům bych se rád vyhnul... _________________ Opravdovost se pojí s trýzní... |
|
Návrat nahoru |
|
 |
OndraSej

Založen: 28. 07. 2007 Příspěvky: 767 Bydliště: Brandýs nad Labem
|
Zaslal: 11. září 2013, 20:31:28 Předmět: |
|
|
VODA> pres corutiny - http://www.lua.org/pil/9.1.html
Kazdy objekt ma svoji corutinu s while cyklem, a moveTo bys pak mel napsane jako
kód: |
function moveTo(actor, targetLocation)
while isNotThere(actor, targetLocation) do
moveOneFrame(actor, targetLocation)
coroutine.yield()
end
end |
Pripadne si pres ten yield muzes predavat, jak dlouho ta akce trva a tu corutinu zavolat zase az po danem case. _________________ http://trionteam.net |
|
Návrat nahoru |
|
 |
VODA

Založen: 29. 07. 2007 Příspěvky: 1721 Bydliště: Plzeň
|
Zaslal: 11. září 2013, 21:11:46 Předmět: |
|
|
A nešlo by ten skript jen nějak krokovat?
Bych měl v kódu proměnnou doScript, když by byla true, skript by se krokoval, když by narazil na funkci waitForLastAction, tak by se nastavil na false a zpátky by se přepl až by přišlo potvrzení, že se poslední akce opravdu dokončila... _________________ Opravdovost se pojí s trýzní... |
|
Návrat nahoru |
|
 |
OndraSej

Založen: 28. 07. 2007 Příspěvky: 767 Bydliště: Brandýs nad Labem
|
Zaslal: 11. září 2013, 21:34:00 Předmět: |
|
|
Vsak neco takoveho presne delaji ty corutiny (mozna i o neco jednoduseji). Z waitForLastAction() muzes volat coroutine.yield(), ktere preda rizeni zpet tomu, kdo spustil tu corutinu a ten se pak muze rozhodnout, co bude spousted dal (jestli spustit skript nejakeho dalsiho objektu, renderovat dalsi frame, ...) a kdy znova spusti tuhle konkretni corutinu.
To coroutine.yield() muzes volat i libovolne zanoreny, takze pokud si vhodne navrhnes dispatch corutin objektu, tak pak muzes mit kod pro ovladani postav krasne jednoduchy (a bez toho, abys musel explicitne resit predavani rizeni mezi objekty). Pokud si navrhnes nejake zakladni funkce pro chovani postav (treba to moveTo, say, pickUp, putDown, attack, ...) a ty yieldy schovas do nich, tak pak celkove chovani muzes popsat napsat extremne jednoduse a bez toho, abys musel explicitne resit predavani rizeni dalsim objektum. Tj. skript postavy by skutecne byl
kód: |
while notDead() do
moveTo(0, 0)
moveTo(1, 0)
waitForSeconds(1)
moveTo(1, 1)
moveTo(0, 1)
say("And again")
end |
I kdyz samozrejme tohle je extremne zjednodusene (v praxi budes muset resit veci jako reakce na akce hrace, etc), ale to bude slozitejsi, at uz pouzijes libovolny pristup. _________________ http://trionteam.net |
|
Návrat nahoru |
|
 |
VODA

Založen: 29. 07. 2007 Příspěvky: 1721 Bydliště: Plzeň
|
Zaslal: 11. září 2013, 21:52:39 Předmět: |
|
|
No budu to muset tedy prozkoumat, do Lua zatím moc nevidím...
Ty coroutiny se mi zatím zdají dost divoké... _________________ Opravdovost se pojí s trýzní... |
|
Návrat nahoru |
|
 |
mar
Založen: 16. 06. 2012 Příspěvky: 610
|
Zaslal: 11. září 2013, 22:51:35 Předmět: |
|
|
VODA napsal: |
No budu to muset tedy prozkoumat, do Lua zatím moc nevidím...
Ty coroutiny se mi zatím zdají dost divoké... |
No tak ani tak divoké to není.
Je to obdoba "threadu" v Doom3 skriptech a latent funkcí v UnrealScriptu (aspoň doufám
Jediný problém bude u serializace, protože budeš muset řešit stav (řekněme že zarás může být jenom jedna stavová funkce na pozadí - i tak asi bude potřeba ukládat i stack threadu, pokud bys měl třeba uvnitř toho while lokální proměnné).
Alternativa může být rozdrobit logiku do víc funkcí (to bude složitější na skriptování a nepřehledné) a použít něco jako:
kód: |
func one()
{
if (dead())
return;
moveTo(0,0);
moveTo(1,0);
scheduleEvent("two", 1.0);
}
func two()
{
moveTo(1,1);
moveTo(0,1);
say("blah");
one(); // nebo scheduleEvent("one", 0.0) nebo init()
}
func init()
{
scheduleEvent("one", 0.0);
}
|
A pak by stačilo serializovat jenom frontu eventů.
Ale to už pak můžeš rovnou udělat v C++ ,
to by pak bylo:
- vázané na kód (málo pružné: rebuild při změně herní logiky)
- složitější implementovat v tom herní kód
+ snadnější na ladění (přímo v IDE)
+ rychlejší
Samozřejmě v praxi thread nemusí jenom čekat na určitou dobu ale třeba na dokončení animace atd. |
|
Návrat nahoru |
|
 |
VODA

Založen: 29. 07. 2007 Příspěvky: 1721 Bydliště: Plzeň
|
Zaslal: 11. září 2013, 23:26:50 Předmět: |
|
|
Tak já toho zase příliš řídit přes skript nepotřebuji. Co jsem tak přemýšlel, tak zatím si vystačím se 4 funkcemi skriptu, které potřebuji volat:
1) initLevel - zde si vytvořím podle herních proměnných level
2) endLevel - kdybych potřeboval něco při ukončení levelu
3) actionPerformed - když se stane nějaká událost (sepne trigger)
4) interactionPerformed - hráč provede interakci (např. klikne na NPC)
Předpokládám, že tyhle 4 funkce bych spouštěl jako coroutiny...
A ve skriptu by měli být používány zase nějaké jednoduché funkce, např.: spawnItem, spawnContainer, spawnEnemy, moveTo, rotateTo, getLevelVariableBoolean/Int/..., say, waitForLastAction, waitForAllActions, atd.
Zase to nechci komplikovat, např. AI si nakódím přímo, sbírání předmětů a operace s inventářem také...ale např. dialogy by bylo dobré řídit přes skript, popř. nějaké in-game sekvence, nebo logiku levelu (sepnutí triggeru, atp.)
Tady by se pak opravdu hodil ten yield a nebo by se každé volání skriptu uložilo do fronty příkazů (per coroutina) a následně bych to už zpracovával podle sebe... _________________ Opravdovost se pojí s trýzní... |
|
Návrat nahoru |
|
 |
OndraSej

Založen: 28. 07. 2007 Příspěvky: 767 Bydliště: Brandýs nad Labem
|
Zaslal: 12. září 2013, 09:19:10 Předmět: |
|
|
Ty corutiny jsou v zasade "vlakna" s kooperativnim multitaskingem (tj. kod funkce bezi, dokud se sam nerozhodne, ze je cas predat slovo nekomu jinemu). Ale jinak kazda ma svuj vlastni stack a je na ostatnich nezavisla. Takze se hodi hlavne ve chvili, kdy chces mit nejaky kod bezici dlouho (napr. po dobu zivota jedne postavy ve hre) a nechces ho nasilne rozdelovat do funkce, kterou budes volat opakovane.
Pokud potrebujes jen jednorazovy callback, ktery neco rychle udela a vrati, tak ti budou stacit normalni funkce. _________________ http://trionteam.net |
|
Návrat nahoru |
|
 |
frca

Založen: 28. 07. 2007 Příspěvky: 1561
|
|
Návrat nahoru |
|
 |
Mem

Založen: 28. 07. 2007 Příspěvky: 1959 Bydliště: Olomouc
|
Zaslal: 12. září 2013, 16:31:57 Předmět: |
|
|
C# yield používáme v našich herních skriptech v Unity docela často, je to fakt pohodlné a přitom elegantní a dostatečně názorné. Používáme to např. pro asynchronní tahání informací z netu (grafický banner ve hře, online score, ...), nebo animace vyvolané v kódu (např. animace a změny stavů nepřítele před smrtí, než si sám destryone svůj GameObject) |
|
Návrat nahoru |
|
 |
perry

Založen: 28. 07. 2009 Příspěvky: 879
|
Zaslal: 12. září 2013, 18:29:12 Předmět: |
|
|
frca Vynikající.. díky.. přesně takhle jsem se nakonec rozhodl to dělat místo jakéhosi "matlání" a napojování na to, aby to mohlo volat objekty Stejně bych musel psát k těm objektům ty "lua" wrappery, takže takhle alespoň držím přehled a čitelnost a nemusím nijak prasit Luu _________________ Perry.cz |
|
Návrat nahoru |
|
 |
|