graphgame gg0 14 - script

23
GraphGame gg014-Script Lua script Szécsi László

Upload: kasi

Post on 23-Feb-2016

33 views

Category:

Documents


0 download

DESCRIPTION

GraphGame gg0 14 - Script. Lua script Szécsi László. Egg / Script. ScriptedApp Scene:: ManagedApp -b ól származik Game-et ebből származtathatjuk scriptből hívható metódusokat tartalmaz egyelőre színtérépítéshez leszármaztatott osztályok ezekhez hozzátehetnek LuaTable - PowerPoint PPT Presentation

TRANSCRIPT

Page 1: GraphGame gg0 14 - Script

GraphGamegg014-Script

Lua script

Szécsi László

Page 2: GraphGame gg0 14 - Script

Egg/Script

• ScriptedApp– Scene::ManagedApp-ból származik– Game-et ebből származtathatjuk– scriptből hívható metódusokat tartalmaz• egyelőre színtérépítéshez• leszármaztatott osztályok ezekhez hozzátehetnek

• LuaTable– Lua táblázat formájában adott paraméterek

feldolgozásához– EnumReflectionMap enum típusú paraméterekhez

Page 3: GraphGame gg0 14 - Script

Lua script

• www.lua.org• teljes programnyelv• nincs main – majd a C++ programból hívunk

bele• nem erősen típusos

x = 3x = "valami szöveg"

Page 4: GraphGame gg0 14 - Script

Lua táblázat

tablazat = { [1]=2, ["kulcs"]=4, [5]="ertek" }• {} között ,-vel elválasztott mezők, minden

mező [kulcs]=ertek típusú, a kulcs és az érték is bármilyen típusú lehet

• ["valami"] helyett írható: valami• így fogjuk haszálni (pl. anyag attirbútumai):

{name='spotted', technique='textured', pass='textured'}

Page 5: GraphGame gg0 14 - Script

Lua táblázat

tablazat = { [1]=2, ["kulcs"]=4, [5]="ertek" }• elem elérése:mivanbenne = tablazat[5]mivanitt = tablazat["kulcs"]• utóbbi így is írható:mivanitt = tablazat.kulcs

Page 6: GraphGame gg0 14 - Script

Lua függvény

• a függvény is egy típusvaltozoaminekfggverteketadok =

function(elsoparam, masodikparam)csinaldezt(elsoparam)megezt(masodikparam)

end• ezután a fggv meghívása

valtozoaminekfggverteketadok(1, 2)

Page 7: GraphGame gg0 14 - Script

Lua és OO

• nincs objektum-orientáltság• de szerephetnek tablázatban értékként

függvények, a kulcsuk meg a nevükobjektum = {metodus=function(self,

masikparam) dosmthg() end }• a metódus meghívásaobjektum.metodus(objektum, 2)• de ugyanez rövidebben is írható:objektum:metodus(2)

Page 8: GraphGame gg0 14 - Script

LuaBind

• C++ objektum -> Lua táblázat• Lua fggv meghívása -> C++ metódus hívódjon• + C++-ból tudjunk Lua metódust hívni, Lua

táblázatból elemeket kivenni

Page 9: GraphGame gg0 14 - Script

C++ metódusok regisztrálása

module(luaState)[

class_<ScriptedApp>("ScriptedApp") .def("Material", &ScriptedApp::addMeshMaterial)

];

a lua „virtuális gép”

C++ classneve lua-ban

metódusra mutató pointer(pointer-to-member)

metódus neve lua-ban

Page 10: GraphGame gg0 14 - Script

Ezután a meghívása Lua-ban

O:IndexedMesh(_, {name='giraffe', file='giraffe.obj'} )

ehhez a tojás alakú lua változóhoz már hozzá van kötve a ScriptedApp példány

ennek a paraméternekitt még nincs funkciója

(az _ az egy változó neve)

attribútumok egy táblázatban

metódusscriptbeli neve

Page 11: GraphGame gg0 14 - Script

Hogyan csináljunk hierarchiát?

• legyen a paraméter egy függvény, ami _ nevű paraméterként kapja a szülőt

O:Material( _, {name='spotted', technique='textured', pass='textured'}, function(_) O:setSrv(_, {effectVariable='kdTexture', file='giraffe.jpg'})end )

• addMeshMaterial meghívja ezt a függvényt, ami inicializálja a létrehozott Mesh::Material-t

Page 12: GraphGame gg0 14 - Script

Olvashatóbb verzió: _ mindig a szülő

O:IndexedMesh(_, {name='giraffe', file='giraffe.obj'})

O:Material(_, {name='spotted', technique='textured', pass='textured'}, function(_) O:setSrv(_, {effectVariable='kdTexture', file='giraffe.jpg'})end )

O:MultiMesh(_, {name='giraffe'}, function(_) O:FlipMesh(_, {}, function(_) O:ShadedMesh(_, {mien='basic', indexedMesh='giraffe', material='spotted'}) end )end )

Page 13: GraphGame gg0 14 - Script

Hogy néz ki a C++ metódus?

• Lua táblázatot, Lua függvényt kap, mint paramétert

• luabind::object a – bármilyen Lua érték lehet• luabind::type(a) – típus lekérése

• a() – lua függvény meghívása C++-ból• LuaTable segédosztály: táblázatelemek elérése

Page 14: GraphGame gg0 14 - Script

Így néz ki a C++ metódusvoid Script::ScriptedApp::addFlipMeshToMultiMesh( Egg::Mesh::Multi::P multiMesh, //< szülő a hierarchiában, _ a scriptben luabind::object attributes, //< lua táblázat az attributumokkal luabind::object initializer //< ezt kell meghívni a feltöltéshez) {

LuaTable attributeTable(attributes, "FlipMesh"); // táblázatkezelő Egg::Mesh::Flip::P flipMesh = Egg::Mesh::Flip::create(); // új objektum initializer(flipMesh); // visszahívás a scriptbe multiMesh->add(flipMesh); // kész objektumot hozzáadjuk a szülőhöz}

Page 15: GraphGame gg0 14 - Script

C++ metódus hibakezelésselvoid Script::ScriptedApp::addFlipMeshToMultiMesh( Egg::Mesh::Multi::P multiMesh, //< szülő a hierarchiában, _ a scriptben luabind::object attributes, //< lua táblázat az attributumokkal luabind::object initializer //< ezt kell meghívni a feltöltéshez) { try{ LuaTable attributeTable(attributes, "FlipMesh"); // táblázatkezelő Egg::Mesh::Flip::P flipMesh = Egg::Mesh::Flip::create(); // új objektum initializer(flipMesh); // visszahívás a scriptbe multiMesh->add(flipMesh); // kész objektumot hozzáadjuk a szülőhöz } catch(Egg::HrException exception){ exitWithErrorMessage(exception); }}

Page 16: GraphGame gg0 14 - Script

ScriptedApp.h

/// Lua scripting state.lua_State* luaState;/// Runs a Lua script from a file./// @param luaFilename the Lua script file to be

executed.void runScript(const std::string& luaFilename);

Page 17: GraphGame gg0 14 - Script

ScriptedApp::createResourcesusing namespace luabind;luaState = lua_open();open(luaState);luaL_openlibs(luaState);

// ide jön a binding

int s = luaL_dostring(luaState, "O = nil; _ = nil; function setEgg(egg) O = egg end"); if(s != 0){ std::string errs = lua_tostring(luaState, -1); MessageBoxA( NULL, errs.c_str(), "Lua error!", MB_OK); }call_function<Script::ScriptedApp*>(luaState, "setEgg", this);

Page 18: GraphGame gg0 14 - Script

Bindingmodule(luaState)[class_<Mesh::Indexed>("IndexedMesh"),class_<Mesh::Flip>("FlipMesh"),class_<Mesh::Multi>("MultiMesh"),class_<Mesh::Material>("Material"),

class_<Script::ScriptedApp>("ScriptedApp").def("IndexedMesh", &Script::ScriptedApp::addIndexedMesh).def("Material", &Script::ScriptedApp::addMeshMaterial).def("setSrv", &Script::ScriptedApp::addSrvToMaterial).def("MultiMesh", &Script::ScriptedApp::addMultiMesh).def("FlipMesh", &Script::ScriptedApp::addFlipMeshToMultiMesh).def("ShadedMesh", &Script::ScriptedApp::addShadedMeshToFlipMesh).def("MultiMeshFromFile", &Script::ScriptedApp::addMultiMeshFromFile).def("StaticEntity", &Script::ScriptedApp::addStaticEntity).def("FirstPersonCam", &Script::ScriptedApp::addFirstPersonCam)];

Page 19: GraphGame gg0 14 - Script

Scriptből hívható metódusok legyártása• addIndexedMesh• addMeshMaterial• addSrvToMaterial• addMultiMesh• addFlipMeshToMultiMesh• addMultiMeshFromFile• addStaticEntity• addFirstPersonCam

Page 20: GraphGame gg0 14 - Script

Feladatok

• új project: gg014-Script• ScriptedApp-ból származó Game• createResources– runScript("podScene.lua");

Page 21: GraphGame gg0 14 - Script

podScene.luaO:IndexedMesh(_, {name='giraffe', file='giraffe.obj'})

O:Material(_, {name='spotted', technique='textured', pass='textured'}, function(_)

O:setSrv(_, {effectVariable='kdTexture', file='giraffe.jpg'})

end )O:MultiMesh(_, {name='giraffe'}, function(_)O:FlipMesh(_, {}, function(_)O:ShadedMesh(_, {mien='basic', indexedMesh='giraffe', material='spotted'})

end )end )

#9.0

Page 22: GraphGame gg0 14 - Script

podScene.luaO:StaticEntity(_, {name='giraffe0', multiMesh='giraffe', position = { x=2, y=0, z=0} } )

O:FirstPersonCam(_, {name='default', position={x=20, y=20, z=20} } )

#9.0

Page 23: GraphGame gg0 14 - Script

Feladatok

• csináljuk meg scriptből a hátteret– full screen quad geometria a ‘quad.x’ betöltésével

is legyártható• geopod betöltés, példányok létrehozása• geopod envmappelt ablakokkal• 33 geopod lua ciklussal– for var=kezdo,veg,lepes do something end– neve: 'ship' .. iShip– .. a string konkatenáció operátor