Ahoi,
Jo hab jetzt 6 Stunden lang auf meine Tasta eingehackt und lief auch alles glatt, nur die Hauptsache, wo ich anfangs dachte "kein Problem", läuft kurz um gar nicht :D
Und zwar gibts einmal Klasse A, die Luaengine, bei der uA Macrofunktionen registriert sind..
.. und Klasse B in der die Spieldaten gesammelt werden. Diese Klasse enthält Funktionen, die diese Daten zurückgeben. Diese Funktionen sind bei der Engine registriert, damit der User diese Spieldaten in seinem Script benutzen kann.
Das Problem ist, dass diese Funktionen beim Aufruf durch die Engine immer den festgelegten Standartwert von 0 zurückgeben.
Es gibt also 2 Arten von Variablen der Dataklasse (sozusagen). Die richtigen, mit denen auch die GUI arbeitet, die auch die richtigen Werte anzeigt und die falschen, mit denen die Engine hantiert.
Ich habe leider nicht die leiseste Ahnung, wo das Problem liegt.
Set Data:
Set Data wird über den GUIthread aufgerufen.
Auszug der GameData class:
Die Lua-Klasse
Wenn ich jetzt die PlayerX() Funktion aufrufe, um den Wert von PlayerX aus der GameData Klasse an die Engine zu liefern, dann wird immer der Standartwert von 0 zurückgegeben, als wenn das Objekt gerade instanziert würde. Da ich aber zu Testzwecken in den Konstruktor eine MsgBox getan habe, konnte ich feststellen, dass GameData nicht initialisiert wird.
Hlep plx, da ich nicht den geringsten Schimmer habe ..
Grüße
Jo hab jetzt 6 Stunden lang auf meine Tasta eingehackt und lief auch alles glatt, nur die Hauptsache, wo ich anfangs dachte "kein Problem", läuft kurz um gar nicht :D
Und zwar gibts einmal Klasse A, die Luaengine, bei der uA Macrofunktionen registriert sind..
.. und Klasse B in der die Spieldaten gesammelt werden. Diese Klasse enthält Funktionen, die diese Daten zurückgeben. Diese Funktionen sind bei der Engine registriert, damit der User diese Spieldaten in seinem Script benutzen kann.
Das Problem ist, dass diese Funktionen beim Aufruf durch die Engine immer den festgelegten Standartwert von 0 zurückgeben.
Es gibt also 2 Arten von Variablen der Dataklasse (sozusagen). Die richtigen, mit denen auch die GUI arbeitet, die auch die richtigen Werte anzeigt und die falschen, mit denen die Engine hantiert.
Ich habe leider nicht die leiseste Ahnung, wo das Problem liegt.
Set Data:
Code:
GameData gd = new GameData();
public void _SetData()
{
Thread t = new Thread(new ThreadStart(SetData));
t.IsBackground = true;
t.Start();
}
public void SetData()
{
IntPtr handle = OpenProcess(0x0008 | 0x0010 | 0x0020, false, (uint)Id);
if (handle == null)
{
MessageBox.Show("Error when creating processhandle.", "Error!");
return;
}
UIntPtr SizeInt = (UIntPtr)sizeof(int);
UIntPtr SizeFloat = (UIntPtr)sizeof(float);
IntPtr bw;
bool success;
byte[] buffer = new byte[4];
while (true)
{
success = ReadProcessMemory(handle, PlayerXa, buffer, SizeFloat, out bw);
if (!success)
{
int error = Marshal.GetLastWin32Error();
MessageBox.Show("Error while getting GameData. Errorcode: " + error.ToString(), "Error!");
}
float PX = BitConverter.ToSingle(buffer, 0);
this.Playerx = PX;
gd.Playerx = PX;
MessageBox.Show(gd.Playerx.ToString());
/* hier lass ich mir mal den Wert anzeigen. Der Wert stimmt. */
buffer = new byte[4];
Thread.Sleep(150);
}
/* für das PropertyGrid */
public float PlayerPosX
{
get { return Playerx; }
set { }
}
Auszug der GameData class:
Code:
public float Playerx;
public float PlayerX()
{
return Playerx;
}
/* gibt den Wert von Playerx zurück. Playerx wird im SetData Thread durch den ausgelesenen Wert definiert.
*/
Code:
Lua pLuaVM = new Lua();
private Thread LuaThread;
public void Register()
{
GameData data = new GameData();
pLuaVM.RegisterFunction("PlayerX", data, data.GetType().GetMethod("PlayerX"));
}
/* diese Registerfunktion wird beim Start der Applikation aufgerufen */
/* über den Run-Button wird dann die Scriptexecution ausgelöst: */
public void Main()
{
LuaThread = new Thread(new ThreadStart(LuaRun));
LuaThread.IsBackground = true;
LuaThread.Start();
}
public void LuaRun()
{
try
{
this.running = 1; /*running flag wird auf normal laufend gesetzt*/
pLuaVM.DoString(this.script); /* Methode, die die LUAvm einen String abarbeiten lässt*/
}
catch (ThreadAbortException ex)
{
}
catch (Exception ex)
{
MessageBox.Show("Error: " + ex.Message, "Error!");
}
}
Hlep plx, da ich nicht den geringsten Schimmer habe ..
Grüße