.[ ČeskéHry.cz ].
LUA
Jdi na stránku 1, 2  Další
 
odeslat nové téma   Odpovědět na téma    Obsah fóra České-Hry.cz -> C / C++
Zobrazit předchozí téma :: Zobrazit následující téma  
Autor Zpráva
perry



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

PříspěvekZaslal: 11. září 2013, 17:01:29    Předmět: LUA Odpovědět s citátem

Když už se tu dneska řeší ta LUA Very Happy 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 Crying or Very sad, 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. Wink
_________________
Perry.cz
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu Zobrazit autorovi WWW stránky
mar



Založen: 16. 06. 2012
Příspěvky: 535

PříspěvekZaslal: 11. září 2013, 17:07:21    Předmět: Re: LUA Odpovědět s citátem

No já luu (lua? Smile 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 Smile
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
perry



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

PříspěvekZaslal: 11. září 2013, 17:48:55    Předmět: Odpovědět s citátem

Jo.. boost mi nesmí přes práh taky Very Happy Jako těch wrapperů je hromada, to vím. Spíš jak jsem psal d), jestli se to vůbec vyplatí Smile
_________________
Perry.cz
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu Zobrazit autorovi WWW stránky
nou



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

PříspěvekZaslal: 11. září 2013, 19:24:41    Předmět: Odpovědět s citátem

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
Zobrazit informace o autorovi Odeslat soukromou zprávu
VODA



Založen: 29. 07. 2007
Příspěvky: 1695
Bydliště: Plzeň

PříspěvekZaslal: 11. září 2013, 20:07:13    Předmět: Odpovědět s citátem

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
Zobrazit informace o autorovi Odeslat soukromou zprávu Zobrazit autorovi WWW stránky
OndraSej



Založen: 28. 07. 2007
Příspěvky: 757
Bydliště: Brandýs nad Labem

PříspěvekZaslal: 11. září 2013, 20:31:28    Předmět: Odpovědět s citátem

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
Zobrazit informace o autorovi Odeslat soukromou zprávu Zobrazit autorovi WWW stránky
VODA



Založen: 29. 07. 2007
Příspěvky: 1695
Bydliště: Plzeň

PříspěvekZaslal: 11. září 2013, 21:11:46    Předmět: Odpovědět s citátem

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
Zobrazit informace o autorovi Odeslat soukromou zprávu Zobrazit autorovi WWW stránky
OndraSej



Založen: 28. 07. 2007
Příspěvky: 757
Bydliště: Brandýs nad Labem

PříspěvekZaslal: 11. září 2013, 21:34:00    Předmět: Odpovědět s citátem

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
Zobrazit informace o autorovi Odeslat soukromou zprávu Zobrazit autorovi WWW stránky
VODA



Založen: 29. 07. 2007
Příspěvky: 1695
Bydliště: Plzeň

PříspěvekZaslal: 11. září 2013, 21:52:39    Předmět: Odpovědět s citátem

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
Zobrazit informace o autorovi Odeslat soukromou zprávu Zobrazit autorovi WWW stránky
mar



Založen: 16. 06. 2012
Příspěvky: 535

PříspěvekZaslal: 11. září 2013, 22:51:35    Předmět: Odpovědět s citátem

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 Smile
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++ Smile,
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
Zobrazit informace o autorovi Odeslat soukromou zprávu
VODA



Založen: 29. 07. 2007
Příspěvky: 1695
Bydliště: Plzeň

PříspěvekZaslal: 11. září 2013, 23:26:50    Předmět: Odpovědět s citátem

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
Zobrazit informace o autorovi Odeslat soukromou zprávu Zobrazit autorovi WWW stránky
OndraSej



Založen: 28. 07. 2007
Příspěvky: 757
Bydliště: Brandýs nad Labem

PříspěvekZaslal: 12. září 2013, 09:19:10    Předmět: Odpovědět s citátem

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
Zobrazit informace o autorovi Odeslat soukromou zprávu Zobrazit autorovi WWW stránky
frca



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

PříspěvekZaslal: 12. září 2013, 16:15:32    Předmět: Odpovědět s citátem

Zrovna o tom vyšel článek na gamedev.net:
http://www.gamedev.net/page/resources/_/technical/game-programming/the-lua-tutorial-r2999
_________________
www.FRANTICWARE.com
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu Zobrazit autorovi WWW stránky
Mem



Založen: 28. 07. 2007
Příspěvky: 1959
Bydliště: Olomouc

PříspěvekZaslal: 12. září 2013, 16:31:57    Předmět: Odpovědět s citátem

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
Zobrazit informace o autorovi Odeslat soukromou zprávu Zobrazit autorovi WWW stránky
perry



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

PříspěvekZaslal: 12. září 2013, 18:29:12    Předmět: Odpovědět s citátem

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 Smile 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
Zobrazit informace o autorovi Odeslat soukromou zprávu Zobrazit autorovi WWW stránky
Zobrazit příspěvky z předchozích:   
odeslat nové téma   Odpovědět na téma    Obsah fóra České-Hry.cz -> C / C++ Časy uváděny v GMT + 1 hodina
Jdi na stránku 1, 2  Další
Strana 1 z 2

 
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