[LuaPlus] Structs gebruiken

Pagina: 1
Acties:

  • Sponge
  • Registratie: Januari 2002
  • Laatst online: 09:40

Sponge

Serious Game Developer

Topicstarter
Sinds een paar dagen ben ik bezig LuaPlus te verwerken in m'n spel. Tot nu toe ging het er goed, en ben ik aardig opgeschoten. (de Particle emitters gebruiken nu deels luaplus)

Alleen een probleem. Ik kan gewon niet ontdekken hoe ik structs aan m'n lua code meegeef, of die eventueel weer aan m'n C++ code kan geven. LuaPlus leverde geen zoek resultaten op, en op google is er ook al zo weinig te vinden. Ik vermoed dat ik iets met een "UserData(box) moet doen...

Misschien heeft hier iemand ook ervaring met LuaPlus? (*hoopt*)

  • Creepy
  • Registratie: Juni 2001
  • Laatst online: 11:29

Creepy

Tactical Espionage Splatterer

Ik kan LuaPlus niet, Lua daarentegen wel. In een Lua/C combo gebruik ik Lua tables om zo een struct achtige structuur uit te kunnen wisselen tussen Lua en C. In Lua kan je dan om de normale manier de table benaderen. In C moet je zelf de table parsen en dat eventueel nog omzetten naar een struct.
(tables in Lua zijn errug krachtig ;) En met meta tables zou je zelfs Objecten vanuit C++ kunnen "doorgeven" (=converteren) naar Lua).

[ Voor 14% gewijzigd door Creepy op 21-01-2005 15:56 ]

"I had a problem, I solved it with regular expressions. Now I have two problems". That's shows a lack of appreciation for regular expressions: "I know have _star_ problems" --Kevlin Henney


  • Sponge
  • Registratie: Januari 2002
  • Laatst online: 09:40

Sponge

Serious Game Developer

Topicstarter
Creepy schreef op vrijdag 21 januari 2005 @ 15:54:
Ik kan LuaPlus niet, Lua daarentegen wel. In een Lua/C combo gebruik ik Lua tables om zo een struct achtige structuur uit te kunnen wisselen tussen Lua en C. In Lua kan je dan om de normale manier de table benaderen. In C moet je zelf de table parsen en dat eventueel nog omzetten naar een struct.
(tables in Lua zijn errug krachtig ;) En met meta tables zou je zelfs Objecten vanuit C++ kunnen "doorgeven" (=converteren) naar Lua).
Dat doorgeven van C++ objecten doet LuaPlus erg mooi. Het is een soort extra laagje over Lua heen. Ik kan in Lua gewoon Update() aanroepen, of vanuit de C++ code een functie in m'n Lua code. Dit allemaal zonder wijzigingen in de functies.

Echter, wil ik dus bijvoorbeeld direct de positie van een in-game object door kunnen geven wat dus een D3DXVECTOR3 is (wat dus gewoon 3 floats zijn), en om dat nou elke keer in een table te zetten, dat lijkt me nou niet helemaal optimaal.. :). Aangezien het voor de AI is zal elke bespaarde CPU cycle een aanwinst zijn ;).

code:
1
2
3
4
5
6
7
8
9
10
11
    int iret = MyLuaState->DoFile("aiVulture.lua");

    LuaObject obj = MyLuaState->GetGlobals().CreateTable("Position");
    D3DXVECTOR3 vPos;
    vPos = vecPosition;
    obj.AssignNewTable(MyLuaState);
    obj.SetUserData(1, (void*)vPos);
    

    D3DXVECTOR3 *vecRet;
    vecRet = static_cast<D3DXVECTOR3*>(obj[1].GetUserData());


Werkt al een beetje, ik kan de waarde weer terug krijgen. Maar het is me dan weer niet gelukt om deze table te gebruiken in de Lua code.

Ik gebruik Lua nog maar een paar daagjes, dus er is een kans dat ik echt iets doms doe/vergeet ;) :)

  • Creepy
  • Registratie: Juni 2001
  • Laatst online: 11:29

Creepy

Tactical Espionage Splatterer

Lua kent alleen tables voor dit soort structuren.

Wat je nu doet is eigenlijk rechstreeks een pointer dumpen in het stuk geheugen van Lua. Aangezien Lua geen C++ objecten kent kan je hier vanuit Lua zelf vrij weinig mee.

Heb je geen obj.settable o.i.d.? In de Lua API heb je lua_settable om een entry in de table aan te maken.
C:
1
2
3
4
5
6
7
8
// Create Settings Table on the Lua stack
lua_pushstring(L, "settings");
lua_newtable(L);

// Add a member 
lua_pushstring(L, "x");  // member name
lua_pushnumber(L, 1); // memer value
lua_settable(L, -3);      // -3. 3de item van boven op de stack is de settings table.      

Dat idee dus. Hierna kan je settings.x benaderen vanuit Lua.

Ook zou je eventuele C functies hieraan kunnen koppelen zodat je bijv. vanuit lua ook een settings.save of een settings.load aanroepen die weer een C functie triggeren (d.m.v. lua_pushcfunction() i.p.v. lua_pushnumber() ).

[ Voor 29% gewijzigd door Creepy op 21-01-2005 19:55 ]

"I had a problem, I solved it with regular expressions. Now I have two problems". That's shows a lack of appreciation for regular expressions: "I know have _star_ problems" --Kevlin Henney


  • Sponge
  • Registratie: Januari 2002
  • Laatst online: 09:40

Sponge

Serious Game Developer

Topicstarter
Ik kreeg even een ingeving door je bovenstaande code :). Aangezien het blijkbaar niet mogelijk is structs te gebruiken (jammer, so be it ;)) dus maar met een table:

In een init functie:
code:
1
2
3
4
    LuaObject PositionTable = MyLuaState->GetGlobals().CreateTable("Position");
    PositionTable.SetNumber("x",10.0f);
    PositionTable.SetNumber("y",20.0f);
    PositionTable.SetNumber("z",30.0f);


Lua:

code:
1
2
3
function Update()
    return Position.x;
end


Functie aanroepen:
code:
1
2
LuaFunction<LuaObject> UpdateAI =  MyLuaState->GetGlobal("Update");
LuaObject retValues  = UpdateAI();


En in m'n watch window staat nu '10'. Als ik die .x weghaal in de lua code, dan staat er 10,20,30 :) _o_.

Ik denk dat ik zo weer even vooruit kom, hopelijk :).

[ Voor 8% gewijzigd door Sponge op 21-01-2005 20:24 ]