Diskussionen über interessante Themen
-
SirLant schrieb:
Was mich jedoch interressieren würde, wäre wie man diese in sein Programm einbindet.
Kommt natürlich immer darauf an, welche Sprache man benutzt. Meine Skriptsprache der Wahl ist Python. Und das Einbinden dieser in C(++) Programme ist ein Kinderspiel. Man muss lediglich den Interpreter in sein Programm linken (bzw die Wrapper - lib für die Interpreter DLL), ein bisschen Wrapper Code schreiben um seine Python Funktionen von C aus aufrufbar zu machen und umgekehrt, und schon hat man ein Skript - Interface zu der (meiner Meinung nach) schönsten Skriptsprache wo gibt. Ich denke ähnlich wird es bei allen Skriptsprachen sein, die (auch) dafür gedacht sind als Skriptsprache eines Programmes zu dienen. Bei Python finde ich vorteilhaft, das es ein ähnliches Objektmodell wie C++ hat, das sich leicht miteinander integrieren lässt (zu sehen ua bei www.wxPython.org), eine schöne Syntax (besser als bei C, C++) hat und eine soooo grosse Auswahl von Modulen hat. Das ließe sich noch um einiges fortsetzen, aber wer wollte das dann noch lesen :D.
Generell: Wer an C++ gewöhnt ist, dürfte mit Python keine Probleme haben.
-
nehmen wir mal an, ich wollte eine scriptsprache erstellen, ich hab mir mal ein tutorial dazu durchgelesen, und eigentlich geht mir das viel zu weit, was die da machen...
wenn ich sowas machen würde, dann würde ich das vielleicht nach folgendem prinzip machen:
\1:
restart_game 5
im programm soll dann einfach die funktion restartgame(5); aufgerufen werden,dh meine scriptsprache soll die scriptsprache in funktionen übersetzen, die dann ausgeführt werden.
das kriegt man noch hin, also das ist nicht so das problem.
wie kann ich aber sowas lösen:
a=b+c;
in einem c++ programm, indem ich keine operatoren kennen würde, würde ich einfach folgendes machen:
zuweisung(a,addition(b,c));
sowas kann das script aber nicht generieren,der return wert ist im moment mein großes problem.
ich hab mir überlegt,ob man das so machen kann:
jede funktion besitzt eine return Variable,und der compiler macht folgendes:
aus: a=b+c wird
[cpp]
//irgendwo innerhalb einer Klasse
T return_addition;
addition(b,c);
zuweisung(a,return_addition);
der weg ist natürlich sehr umständlich, und ich bin auch nich sehr zufrieden damit, aber ich möchte soweit wie möglich von (pseudo) assembler entfernt sein(wenn das überhaupt möglich ist, falls nicht, dann muss ich mich dem schicksal beugen :P)
-
@ChokoCookie das meinte ich eigentlich nicht, das ist mir ja klar, habe ja wie
oben genannt schon kleine Beispiele bei Lua gesehen, was ich meine ist, wie man
die Skriptsprache in den C++ Code einbaut, so dass die Funktionen des Interpreters
meine Spielfunktionen mit den passenden Werten usw. aufrufen.
Dass ich das je nach Sprache anderst machen muss ist klar, und dass man einfach
die richtigen Funktionen des Interpreters hinschreiben muss, aber wie kann man
so etwas durchplanen und anschließend einbauen, dass es funktioniert.Mir fehlt einfach die vorstellung denkweise dazu um zu verstehen wie man das
in den Code 'flickt'
-
btw: kennt jemand ein gutes tutorial (wenns auf deutsch ist, noch besser
) für die aktuelle lua version?
-
Na ich denke, wenn man ein ordentlich designtes Klassenmodell in seinem Spiel hat, kann man das, oder Teile davon einfach für Skripte zugänglich machen. Ein paar Funktionen um die Kamera und die Modelle zu Steuern, dann noch für Sounds uä, das dürfte für Zwischensequenzen reichen. Kommt natürlich immer darauf an, wieweit man mit den Skripten in das Spiel eingreifen können will/soll. Wenn man zB Teile der KI skripten will, muss man detaillierten Zugriff auf die Spielmechanik erlauben.
-
ja klar,solche sachen werden einfach zu implementieren sein, aber sowas wie:
lightobjekt=turn_light_on(raum1->licht3)
bind(raum1->schalter1,lightobjekt)
kriegt man nichmehr so einfach hin,immerhin ist lightobjekt ein funktionpointer...
-
Ich schreiben unsere Scripts in C++ und binden sie dynamisch in das Hauptprogramm ein.
Ja genau, Dlls unter Win und SOs unter LinuxIch hatte mich voher mit Tcl und Lua abgequält, beide sind nicht geeignet
C++ Objekte vernünftig anzusprechen geschweige denn die Engine zu erweitern.Bei mir hat jetzt jeder Level eine eigenen shared object File, in dem der gesamte Scriptsource für den Level compiliert wurde.
Die Funktionen lade ich dann zur Runtime.
Nicht mehr benötigte Module werden über Garbage Collection aussortiert.Bin sehr zufrieden mit der Entscheidung, hat sich bisher nur bewährt.
Ok, man muß etwas mehr compilen, aber dafür brauche ich nacher keinen RuntimeInterpreter im Speicher halten und mir über die Speicherverwaltung und Parameterübergabe in Scriptfunktionen Gedanken machen.
Außerdem ist die Performance unerreicht
-
@Otze: Wenn du dich damit nicht abgeben willst, nimm Pyhton ;).
@Kane: für jedes Level eine DLL? Ist ja abgefahren. lol. Aber eine "Skriptsprache" (is ja wohl bei dir keine mehr), soll ja wohl vor allem einfach zu bedienen sein. Für dich und andere Leute, die Levels erstellen. Naja, falls ich mal genug Zeit habe ein "ernsthaftes" Spiel zu schreiben, verwende ich dafür auf jeden Fall auch wieder Python. Denn die von dir Beschriebenen Probleme gibt es damit sicher nicht. Ich glaube Performance ist bei Levelskripten auch nicht wirklich ein Problem.
-
vorallem nimmt dir dieser compilezwang die möglichkeit runtime zu scripten, du kannst also während des testes nich durchs level gehen, schalter betätigen, und im zweifelsfall vorort fixen.
aber das problem mit dem rückgabewert einer funktion geht mir nich ausm kopf,wie kann man das lösen?
(für leute die erst später zugeschaltet haben: a=b+c, b+c ist eine addition und deren rückgabewert wird a zugewiesen, wie krieg ichs hin, dass der rückgabewert der addition der gleichungsfunktion übergeben wird)
-
otze, auf die Schnelle wird kann man das schwer erklären. Am besten du liest ein Tutorial dazu.
-
Oder du kaufst dir das Drachenbuch, solltest du auf jeden Fall, wenn du das
ernsthaft machen möchtest, ohne Theorie wird es schwer.
-
-
buch is aufm weg zu mir
-
Ich gebe zu, dass ist keine Scriptsprache mehr was ich da benutze.
Ich persönlich finde Leveldesigner die nicht coden können und dann Scripts
schreiben die:
a) Speicherlecks erzeugen (von der Engine immer neue Resourcen verlangen)
b) Dinge durch Trial-and-Error lösen
c) allgemein ferhleranfällig sind oder keinen Weitblick haben
zeitaufwendiger als ein Runtime-modding.Da setze ich mich lieber selbst 5 min und schreibe einen (wiederverwertbaren)
"Script" der Türen öffnet und schließt ohne den Spieler zu zermatschen
falls er dazwischen steht.Das Compilen sehe ich eher als Vorteil, gute Compiler quitieren Fehler und
Warnungen bevor der Code in die Engine geladen wird.
Außerdem, man zeige mir eine Scriptsprache die Templates (und besonders die STL)
einbinden können ohne für jeden Rotz ne Wrapperfunktion zuschreiben.Außerdem kann ich die netten Debuggingfunktionen meines Compilers/IDE gleich
mitbenutzen.Zu Phyton:
Ich habe mal eine Präsentation zum Interfacen von OpenGL mit SWIG gesehen...
Grausam!Hab ich das "imho" vergessen ?! :p
-
Bei Python (und wahrscheinlich auch anderen Skriptsprachen), wird die STL wohl meistens überflüssig. zB Listen haben in Python die selbe Funktionalität wie std::vector, soll heissen man findet für alles ein equivalent, nur etwas bequemer zu benutzen.
Debugging ist in Python (imho) einfacher als bei C++.
Das argument mit den Leveldesignern die von coden keine Ahnung haben, ist wohl etwas kurzsichtig. Denn die, die etwas Ahnung haben, kommen mit Skripten sicher besser zurecht, als mit C++. Und denen, die keine Ahnung haben, musst es sowieso du schreiben. Wobei es sich wohl auch für Coder mit Python einfacher arbeitet als mit C++ (geht mir zumindest so).
Und pyOpenGl, finde ich nicht grausam (nach den Sampels, die ich gesehn hab). Das einzige, was wegfällt ist,
für jeden Rotz
ne Variable / nen Array zu deklarieren, per pointer an die Funktion zu übergeben und nacher eh nicht mehr brauchen zu können, weil der das Array die falsche Grösse hat / die Variable nicht den richtigen Namen. :p
Zu den Speicherlecks: in den Skripten entstehen die wohl kaum (zumindest Python hat nen hübschen Garbage Collektor), und das mit den Ressourcen von der Engine anfordern, ist wohl eher ne Frage des Interfacedesigns. :p
Naja, finde deinen Ansatz trotzdem cool, wenn auch etwas Umständlich
Besonders, wenn man was "mal so schnell" verändern will.
-
@TGGC: Ich verstehe deine Frage nicht.
Nur weil meine Scripts vorher und nicht während des Spiels compiled werden macht doch eine Scriptsprache nicht überflüssig.
Der C++Source wird eben bei einem Level dazu compiled, wie du auch ne Lightmap vorher berechnest.
Außerdem möchte ich den sehen der während das Spiel läuft, die Console öffnet
und sich sagt: "So, jetzt schreibe ich mal ingame den Script für den Lichtschalter hier".Mal im ernst die "Vorteile" von Interpretern werden, zumindest in dem Bereich überschätzt. Mandenkt sich "Die ganzen anderen Studios nehmen immer Scriptsprachen", also mach ich das auch....
Quark!
-
@ChockoCookie: Ich bin sicher das Phyton sehr viele, wenn nicht alle Bereiche die die STL bedient abgedeckt, aber ich kann in Phyton nicht hergehen und sagen:
"So du lieber Script, das ist ein Verweis auf einen std::map<string, entity*>-Objekt. Mach da mal was mit!"Und genaus das will ich!
Ich habe es satt, dass Tcl (und Phyton afaik auch) nur mit doubles, meine Engine aber mit floats arbeitet.
Ich habe es satt, dass ich mich mit Calling Conventions und ParameterStack rumschlagen muß wenn ich einen Wrapper für ein Lua-Interface schreibe, dass nacher noch von der Engine gewrappt werden muß.
Usw. usw.Edit: Rechtschreibung (die gröbsten Fehler ;))
-
Du verstehst da etwas nicht. Eine Scriptsprache benutzt man, wenn eine Anforderung des Projekts sich dadurch am leichtesten lösen lässt. Nur weil du eine solche Anforderung nicht erfüllen musst, heisst das nicht, das Scriptsprachen nichts taugen.
Bye, TGGC \-/
-
Ja gut, ist klar, das man STL Datentypen nicht so ohne weiteres zwischen C++ und anderen Sprachen (gilt nicht nur für skriptsprachen) hin und her schaukeln kann, sofern die STL dort nicht auch implementiert ist. Das ist nun mal die Krux bei gemischtsprachlichen Entwicklungsumgebungen. Aber für Levelskripting - Zwecke, dürfte das wohl nicht so oft erforderlich sein, denke ich.
Was man auch immer bei Lua machen muss, das Einbinden von Python in C++ und von C++ (modulen) in Python ist kein Problem. Ist ja direkt vorgesehen.
Das mit den doubles stimmt schon. Sehe ich aber nicht als Nachteil. Performante Teile schreibt man sowieso nicht mit Skripten.
Ich denke du hast vollkommen recht, mit dem was du sagst. Wir haben nur eine unterschiedliche Auffassung von dem, was ein Skript Interface können soll. Und man erkauft sich einfach zu viele Vorteile, als das ich darauf verzichten möchte
-
Naja ich kann euch schon verstehen
Vielleicht liegt es auch daran dass Dlls unter Windows kein
Spaziergang sind, unter System die *.so Files verwenden sieht das hingegen ganz anders aus.Wie auch immer, ich komme mit meiner Lösung am besten klar.
Habt ihr euch mal FarCry angeschaut?
Die halbe Engine besteht bei denen aus Lua.