Hallo,
ich muesste eine Funktion aufrufen, die ueber eine .ini Datei festgelegt wird.
Gibt es in GLBasic soetwas wie eval bei anderen Sprachen, oder wenigstens Funktionsreferenzen wie im C?
Ich braeuchte praktisch folgendes:
bla.ini:
[objects]
object=myobject
objectfunction=myObjectCallMe
bla.gbas
function myObjectCallMe:
print "hello world from myobject", 100, 100
endfunction
function$=iniget$('objects','objectfunction')
callfunction(function$)
mit INLINE .. ENDINLINE steht dir ja auch C++ in GLBasic zur Verfügung. Wenn du also weißt, wie das prinzipiell in C oder C++ gehandhabt wird, kannst du es ja mal damit versuchen.
Das gbit's eigentlich nur bei interpretierten Sprachen. Sowas in C++ zu machen ist ein Riesenaufwand, da für für jede Funktion den Funktionsnamen irgendwo speichern und zuordnen musst.
Warum hast Du nicht eine Funktion und speichers in der .ini Datei einen Parameter, den Du mit SELECT auswertest?
also ein function pointer wuerde mir reichen, eventuell auch per inline c eine basic funktion aufrufen (?)
ich moechte eine point and click adventure engine umsetzen, mit select haette das den nachteil, dass alles in einer hauptschleife liegen muss ala
select object$
case "fenster"
if command$="oeffnen"
// tief einatmen
endif
enselect
und genau da liegt das problem, es soll eine engine sein, also letztendlich ueber .ini files konfiguriert und die eigentlichen aktionen sollen von den objekten selbst kommen.
letztendlich waere dieser code (der natuerlich nicht geht) der idealfall fuer mich
object fenster
function oeffnen:
// tief einatmen
endfunction
endobject
da das nicht moeglich ist gilt es einen anderen ansatz zu finden, da waeren mir erstmal nur function pointer ala c eingefallen, vielleicht weiss ja jemand noch ne andere idee
TYPE Tobject
what // 0=tuer, 1=fenster
ENDTYPE
function oeffnen: obj AS Tobject
SELECT obj.what
...
ENDSELECT
endfunction
so ganz kann ich dein Problem nicht nachvollziehen, muss ich gestehen.
Du kannst alles und jeden steuern mit deinem Coding, ob objektorientiert, prozedural oder Spagetti, ist erst einmal wurscht.
prinzipiell kannst du doch schematisch folgendermaßen vorgehen
Ini_lesen()
// hier Hauptschleife
WHILE GAME_END = FALSE
Handle_actions(object, action$) // Beispiel, wenn du die auszuführenden Aktionen als Zeichenkette speicherst
// ... weitere Aktionen
WEND
FUNCTION Handle_actions: pobj, pact$
SELECT pobj
CASE panzer
SELECT pact$
CASE "Fahren"
// Aktionen
CASE "Stoppen"
// Aktionen
CASE "Feuern"
// Aktionen
ENDSELECT
CASE auto
SELECT pact$
CASE "Fahren"
// Aktionen
// etcpp
ENDSELECT
CASE ...
ENDSELECT
ENDFUNCTION
meintest du so etwas in der Art?
das problem entsteht dadurch, das es kein hardgecodedes spiel ist, sondern ein konfigurierbares environment das ich fuer mehrere spiele nutzen will
die funktion handle_actions aus deinem beispiel, kann also nicht wissen, dass es einen 'case panzer' geben muss, sondern irgenwo gibt es eine room4711.ini - die es zum zeitpunkt des entwickelns der engine noch nicht gab - in der hinterlegt ist, dass ein panzer in der szene ist und was man mit dem so alles anstellen kann
natuerlich koennte man auch einfach die funktion handle_actions ausserhalb der engine, sozusagen durch das finale spiel definieren lassen, gehen wuerde es so - und wenn es keine andere moeglichkeit gibt wird mir auch nichts anderes bleiben - aber schoen isses nicht.
äh... Ja, soll der Programmcode in der ini stehen? Dann geht's nur mit einer Scripting Engine. Trucidare hat LUA mal in GLBasic eingebaut.
ja, ne, aber da koennten die funktionsnamen drinstehen die aufgerufen werden sollen bei den verschiedenen aktionen (benutze, oeffne, etc), aber ich seh schon, geht wohl nicht ;)
nicht so schlimm, mach ichs halt ueber einen dicken select im finalen spiel
meines wissens wird der glbasic code aber ja eh vorher in c code umgewandelt (?) daher moechte ich vielleicht anregen ueber eine zukuenftige loesung ala c function pointer nachzudenken, machbar sollte es sein und es gibt eine ganze reihe an anwendungsmoeglichkeiten dafuer.
das mit lua klingt allerdings trotzdem interessant, werd ich mir mal zu gemuete fuehren, sofern das plattform uebergreifend fungoniert
Du hast auch in C keine Chance eine Funktion über einen String anzusprechen. Nur mit viel Overhead, den Du slebst machen must (Im Prinzip SELECT)
Ja Lua leeeebt :) Ich bau es nur gerade um. Eine möglichkeit Funktionen anzusprechen ist sowohl als string als auch als datei möglich.
[OT] Gernot ich hab ne 360 Premium für 180 tacken bekommen :) wir können Proggen ;) [/OT]
180 Euro?
Da bekomm ich die ja neu, nur halt net als Premium :)
Viel spass beim ersten ROD, scheiss Kiste *Hust*
*meiner treuen XBOX 360 nachtrauer*
Das is ja das coole ;) Board und Laufwerk sind neu... Kein Rod mehr :) außerdem BenQ laufwerk (flash flash flash)
Quote from: GernotFrischDu hast auch in C keine Chance eine Funktion über einen String anzusprechen. Nur mit viel Overhead, den Du slebst machen must (Im Prinzip SELECT)
aber da der c code ja aus glbasic erzeugt wird, koennte man ja folgendes machen:
glbasic code:
type
name$
funcptr usefunction(par1, par2)
endtype
...
function AutoUse: par1, par2
// bla
endfunction
...
local auto as type
auto.name="turbokiste"
auto.usefunction="AutoUse"
und beim generieren des c codes wird daraus
typedef struct {
char *name;
void *(usefunction)(int, int);
} auto;
...
void AutoUse(int par1, int par2) {
// bla
}
...
auto *a=malloc(sizeof(auto *));
a->name=strdup("turbokiste");
a->usefunction=&AutoUse;
waere wirklich ein grosses plus fuer glbasic wenn sich sowas umsetzen liesse, den letztendlich koennte man so wenigstens ansatzweise objektorientiert programmieren.
Hmm... Evtl. als sub.
Sag hier bloß nicht das OO - Wort ;)
Ein großer Schritt wäre es, jedoch ist es auch mit Viel Arbeit unda uch vielen Fehlern verbunden.
mal sehen was der gf sich einfallen lässt ich halt mich da raus *versteck*
Nächstes Update:
CALLBYNAME("s1")
CALLBYNAME("sx")
CALLBYNAME("s2")
SUB s1:
PRINT "Hello", 0,0
ENDSUB
SUB s2:
SHOWSCREEN
MOUSEWAIT
ENDSUB
Jow wie wärs mit OO ........ó.Ã'
Du kannst jetzt SUBs mit dem Namen als Sting aufrufen. Das kann manchmal ganz nett sein. Besonders als Alternative zu CALLBACK.
Coollio :)
klasse, danke.