Objekt Engine

Übersicht Sonstiges Smalltalk

Neue Antwort erstellen

Geeecko

Betreff: Objekt Engine

BeitragSa, Mai 26, 2007 11:05
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallöchen!
Wollte mal fragen, wie so eine Objekt-Engine aufgebaut ist.
Also mit ScriptSprache. Es könnte sein, das wer clonk kennt? ^^
Wenn ja, so wie das.
Aber wie funktioniert sowas generell? Wird bei jedem Schleifen durchlauf das Script von den Objekten ausgeführt? Würde das nicht hängen?
Und wenn der Spieler dann auf ein Objekt drauf läuft, es einsammelt, wegwirft etc etc etc.. wie wird das dann an die objekte übertragen?
Wird dann Zumbeispiel eine locale variable des objektes, was einen anderen Zustand erreicht hat, auf zum beispiel: Eingesammelt = 1
und dann im Script:
If EIngesammelt = 1
Message("Du hast mich eingesammelt!")
endif

oder wie macht ihr das? Codebeispiele in bmax sind erlaubt Smile

mfg
....

Vertex

BeitragSa, Mai 26, 2007 11:17
Antworten mit Zitat
Benutzer-Profile anzeigen
Naja, Items wie Trigger usw. lösen dann ein bestimmtes Ereignis aus d.h. rufen eine Benutzer definierte Funktion auf.

Ich vermute mal, dass heutzutage kaum eine Scriptsprache noch on the fly interpretiert wird. Die meisten werden kompiliert in eine fiktive Maschinensprache. Beispielsweise in P-Code
Der Code daher um einiges schneller in der virtuellen Maschine ausgeführt werden, als das er noch aufwendig durch Lexer, Parser, Optimizer u.ä. gejagt wird. Siehe beispielsweise Java mit Bytecode.

Weiterhin sollte eine Scriptengine, besser gesagt, die virtuelle Maschine als extra Thread auf der CPU laufen.

mfg olli
vertex.dreamfall.at | GitHub

Geeecko

BeitragSa, Mai 26, 2007 11:40
Antworten mit Zitat
Benutzer-Profile anzeigen
Gibt`s sowas fertig für Bmax? Außer Lua? ^^
Lua find ich persöhnlich jetzt nicht so toll.
Ich kann mich damit einfach nicht anfreunden.
Habe mir das so überlegt: Jedes Objekt kann verschiedene Zustände haben:
-Eingesammelt
-Im Inventar
-Rechtsklick im Inventar
-Linksklick im Inventar
etc etc etc.....
Und wenn dann zum beispiel der spieler rechtsklick drauf macht, wird der Script Rechtsklick im Inventar ausgeführt.
Noch eine Frage: Ist Lua denn schnell, um Zumbeispiel 1000Objekte so zu scripten?
....

Vertex

BeitragSa, Mai 26, 2007 15:10
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich kenne noch BP Scripting Language von Helios siehe:
http://blitzbasic.com/Communit...opic=57520
Die Links sind im thread alle tot aber hier ist seine HP:
http://www.binaryphoenix.com/i...amp;pid=11

Er hat das Modul sehr sauber programmiert, so dass du auch ganz gut ein Blick hinter die Kulissen werfen kannst.

Ansonsten kann ich keine Angaben über Lua o.ä. machen, da ich selbst noch nicht damit gearbeitet habe. Hatte bisher noch keine große Möglichkeit mit der Scriptengine von TGEA zu arbeiten, aber da ist das Prinzip so: Die Coreengine kann über die Scripts angesprochen werden. Also man kann beispielsweise im Script selber einen Particleemitter erstellen, die Farbe ändern usw. Die Scripts dienen meistens zum Prototyping und werden dann im Nachhinein fest in die Engine eingebaut. Das erspart langwierige Entwicklungszeiten. Du kannst ja hier mal dir ein paar Sachen anschauen: http://www.codesampler.com/torque.htm

Ich finde die Syntax der Scriptsprache nicht so berauschend, habe aber auch kaum Vergleichsmöglichkeiten. Dürfte aber einen kleinen Einblick in Sachen Scripting geben.

mfg olli
vertex.dreamfall.at | GitHub

Geeecko

BeitragSa, Mai 26, 2007 20:05
Antworten mit Zitat
Benutzer-Profile anzeigen
Gibets dafür nen Tut?
Also für dieses Binary Phönix. Ich finde es von dem Example her geil.
Frage mich wie man neue Functionen hinzugügt. Also aúßer Print und so.

Edit:
dööfer gehts nich XD schon gefunden ^^
Aber was mich iritiert: ich will nicht immer nur eine Funktion ausführen, sondern den ganzen Script... Muss ich dann immer den gazen Script in eine Funktion packen???


Achja: Wenn ich Thread.InvokeScriptFunction("Example03",False)
mache, führt der das dann nur einmal aus? habe noch ziehmlich viele fragen XD aber langsam kommts
....

Vertex

BeitragSo, Mai 27, 2007 9:16
Antworten mit Zitat
Benutzer-Profile anzeigen
Du kannst ja in dem Code herumstöbern was alles möglich ist. Es sehr an C angelehnt. Unterschied gibt es nur bei den Variablen. Sie müssen a) mit var deklariert werden und können nur vom Typ Integer, Float und String sein. Dabei kann eine Variable zur Laufzeit mal Integer, mal String mal Float sein. Ist also wie bei PHP geregelt.

Für jeden Script musst du ein TScriptThread erstellen. Und es ist üblich, dass man bei Appliaktionen Main Funktionen erst aufgerufen werden. Das macht dein Windows auch, wenn du eine .EXE-Datei startest. Ist ein bisschen unglücklich gewählt mit Function Example01() statts Function main() und dann Thread.InvokeScriptFunction("main", False)

Ich habe mir nochmal den Code angesehen vom Compiler und der VM. Ich bin begeistert wie genial er das ganze zusammengewerkelt hat. Habe aber auch noch einiges an Potential für Geschwindigkeit entdecken können.

Schwachpunkt ist hier nur, dass BMax laut Aussagen anderer nicht Multithreading fähig ist. Man kann schließlich nicht das Spiel anhalten lassen, nur weil ein wait(1000); im Script steht.

Aber die Scriptsprache ist dennoch genau das, was du brauchst. Der Player läuft meinetwegen direkt in einen Trigger rein, dann musst du etwas umständlich schauen, ob der Benutzer eine MyTrigger_OnCollision im Script drin hat, und dann rufst du Thread.InvokeScriptFunction("MyTrigger_OnCollision",False) auf.

Ich müsste mal selber schauen, ob das so funktioniert aber wenn es geht, dann ist das, was du suchst.

mfg olli
vertex.dreamfall.at | GitHub

Geeecko

BeitragSo, Mai 27, 2007 10:02
Antworten mit Zitat
Benutzer-Profile anzeigen
Thx Vertex!
Das kann ich gut gebrauchen. Aber man muss doch gar nicht nachschauen,
ob das vorhanden ist, oder? Wenn es sie nicht gibt, passiert auch nichts Wink
Aber mal schauen. Jedenfals besser als LUA und der Mist.

Achja:
Was genau ist mit einem Trigger gemeint? Grob weiß ich es aber...
Was genu macht der und ist es?
....

Vertex

BeitragSo, Mai 27, 2007 10:10
Antworten mit Zitat
Benutzer-Profile anzeigen
Trigger sind für mich unsichtbare Kollisionshüllen. Wenn man mit ihnen kollidiert passiert etwas. Beispielsweise wenn man vor einer Tür steht, kollidiert man mit einer unsichtbaren Box und die Tür öffnet sich. Tritt man wieder aus dem Trigger aus, so schließt sie sich wieder.

Weiteres Anwendungsgebiet ist, denke ich, Bot-Programmierung. Der Bot sieht ein Gegner und wiegt ab, ob er nun auf den Gegner schießt, lieber per Pathfinding Munition aufsucht, sich ranschleicht usw. So kann man sicher ganz ansehnliche AIs programmieren.

Ansonsten sollte die Funktion vorhanden sein. Habe beim Code Überfliegen irgendwo eine Fehlermeldung entdecken können á la "Host function not found".

Da ich mich noch nicht mit LUA(oder Lua?) auseinander gesetzt habe: Was gefällt dir daran nicht? Sieht auch sehr C ähnlich aus.

mfg olli
vertex.dreamfall.at | GitHub

Geeecko

BeitragSo, Mai 27, 2007 10:39
Antworten mit Zitat
Benutzer-Profile anzeigen
Sie funktioniert gar nicht richtig... bei mir...
Ich kann z.b. nicht CheckString verwenden, sondern musste mir einen eigenen Code schreiben, bzw. aus dem BlitzBasic.com Forum herraussuchen, die den String erst nach C formatiert oder so... kp ^^

Nochmal das mit den funktionen:
Man kann ja den file öffnen, und dann per if und mid etc. "Function" herausfiltern, und dan gucken, welche Funktion es ist. Dann einfach AddFUnction() oder so. Trigger können nur "aktiviert" werden, wenn man darauf läuft, oder hinabsteigt, oder?

Aber eine Frage generell zu Objekten: Wenn ich einen Teleporter mache (zum beispiel) müsste ich ja immer einen neues Objekt programmieren, welches dann woanders hin führt als die anderen. Wie macht man das dann?
Wenn man ein Objekt platziert, öffnet sich ein Fenster. Dort werden alle Standart variablen (die man im objekt editor eingeben kann) angezeigt, und mann muss ihnen werte zuweisen. Z.b. X und Y. dort tippt man dann die neue X und Y koordinate ein. Oder wie macht man das?
....

Vertex

BeitragSo, Mai 27, 2007 11:08
Antworten mit Zitat
Benutzer-Profile anzeigen
Damit kannst du dir alle Funktionen im Script ausgeben lassen:
Code: [AUSKLAPPEN]
Local FunctionSymbol:TScriptFunctionSymbol

Print "Function list:"
For FunctionSymbol = EachIn Thread.FunctionList
   Print " - " + FunctionSymbol.Ident + " has " + FunctionSymbol.ParameterCount + " parameters"
Next


Also auch prüfen, ob eine Funktion existiert.

mfg olli
vertex.dreamfall.at | GitHub
 

Black

BeitragSo, Mai 27, 2007 14:37
Antworten mit Zitat
Benutzer-Profile anzeigen
Also ich finde TorqueScript eine recht gute Skript-Sprache. Auch wenn's eine Eigenproduktion von GG ist, hat sie dank der Community und dem Bedarf einige gute IDEs und es gibt auch genügend Leute, die in ihr programmieren können.
Der einzige große Nachteil ist, dass es Variabeln on-the-fly deklariert, was bei größeren Projekten leicht zu nervigen Bugs führen kann (man soll mal rausfinden, dass das Spiel nur abstürzt, weil man irgendwo aus Versehen einen Buchstabenverdreher rein gemacht hat...).
Wer an Language-Design interessiert ist, dem empfehle ich, sich bei der Reference (falls man dazu Zugang hat) die Implementation der Arrays anzuschauen - ist eine sehr elegante Lösung, die sehr viel Freiraum für den Script-Programmierer bietet.

Da aber TorqueScript propietär ist und man einen Torque-Ableger braucht, um darin entwickeln zu können, ist es wahrscheinlich nichts für euch.

Off-topic:
Zitat:
Die Scripts dienen meistens zum Prototyping und werden dann im Nachhinein fest in die Engine eingebaut.


Sorry, aber da läuft mir ein kalter Schauer den Rücken runter. Dies stimmt a) so im Großen nicht (man schaue sie zum Beispiel TGB an oder auch die meisten TGE-Games) und b) ist es allgemein ein schlechter Rat, etwas, das man ohne Performance-Verlust in einer flexiblen und einfachen Skript-Sprache schreiben kann, nachträglich in den Engine-Code zu portieren, wo der Code dann wesentlich Bug-anfälliger und Änderungs-resistenter wird.

Geeecko

BeitragSo, Mai 27, 2007 16:25
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich werde jezz dieses PB oder wie das heißt nehemen Wink
Dann wird es bestimmte FUnktionen geben wie Z.b.
-OnLeftKlickImInventar (Natührlich heißen sie anders)
-OnReghtKlick...
-FirstCollision (Wenn sie kollidieren (heißt es wird immer nur dann ausgeführt, wenn ein "ding" in ein anderes "reinfährt")
-Collect
-Weggeworfen
-LeftkLICK
-Rightklick
-Key[XY]
mehr fällt mir nicht ein Smile
....

Vertex

BeitragSo, Mai 27, 2007 18:53
Antworten mit Zitat
Benutzer-Profile anzeigen
Nein, ich meine nur Performence lastige Dinge, die beispielsweise direkt auf die Renderpipe zugreifen müssen, dann auf die Engine selber ausgelagert werden müssen. Ich kanns mir auch nicht vorstellen, komplett auf Scripts zu verzichten.

Ansonsten ja, Variablen, die on the fly programmiert werden, sind sehr schlecht zu debuggen. Siehe BlitzBasic: man hat eine Variable PlayerX und will mit PlayrX zugreifen. BB erstellt automatisch eine neue Variable PlayrX, setzt sie zu 0 und wir Programmierer müssen nun sehen, wo der Fehler ist. Weiterhin finde ich Typ lose Variablen auch nicht berauschend beim Debuggen. Sehe keinen Sinn, aus PlayerName von String auf Integer zu wechseln.

Neben den Typ losen Variablen hat MicroC noch einen großen Nachteil: Sie ist prozedural. Es ist bedeutend einfacher mal eine Klasse TPlayer zu übergeben, als PlayerX, Y, Z, Name, Health usw.

Wegen TorqueScript: Ja, sobald mal meine Grafikkarte eintrudelt(ist ja nun schon die 3te) werde ich TS auch testen können. Da die Doku(bei TGEA, bei TGE soll sie ja besser sein) nicht so berauschend ist, fande ich die Syntax auch nicht so besonders. Beispielsweise warum man zwischen Namespaces und Packages unterscheidet, warum so etwas wie 1234.MyMethod() möglich ist(also eine Instanz durch ihre Referenz(hier 1234) direkt anzusteuern). Ich pers. stehe auch strikte Sprachen, wo ich vor dem Kompilieren direkt meine Fehler finde und nicht erst zur Laufzeit. Wenn mir so ein schlechter Stil wie 1234.MyMethod() nicht angekreidet wird, dann braucht die Entwicklung auch bedeutend länger. Aber hier ziehe ich gut und gerne auch PHP damit in den Dreck. Da ist das Debuggen ja auch eine Katastrophe. Die perfekte ScriptSprache werde ich wohl noch noch selber designen müssen ^^

mfg olli
vertex.dreamfall.at | GitHub
 

Black

BeitragMo, Mai 28, 2007 0:31
Antworten mit Zitat
Benutzer-Profile anzeigen
Ja es gibt immer einen Trade-Off zwischen Effizienz und Quellcode-Sauberkeit (leider), aber man soll ja in eine Sprache hinein schreiben und nicht in ihr seinen Code entwickeln (Code Complete).
TorqueScript erlaubt einige nette Dinge, die den Code total verschandeln können und es unmöglich machen zu debuggen, aber richtig angenehm sind, wenn man sie vorsichtig benutzt (ist genauso wie in C++, wo es auch sehr viele Möglichkeiten gibt, alles falsch zu machen).
Z.B. Arrays: der [] operator fügt das Ergebnis der evaluierten Expression zum vorangehenden Variablennamen hinzu, was mit den lazy declarations zu einem simplen aber mächtigen Array-Mechanismus führt:
%myArray[ 1+2 ] wird zu %myArray3, aber auch %myArray[ "Hallo Welt" ] wird zu einem eigenen Variablennamen, wodurch man z.B. elegant dictionaries erstellen kann.
Es gibt auch noch viele andere Tricks, mit denen man Dinge erledigen kann, die mit Engine-Code unmöglich bzw. sehr umständlich zu lösen wären.
Ich hab momentan zugang zu allen GG-Produkten (bin atm als Contractor für sie tätig), hatte aber leider noch keine Zeit mich genauer mit TAE auseinanderzusetzen. Was ich aber gehört habe: es ist eine ziemlich gute Engine aber im Moment gilt noch: Beware the bugs Wink

Neue Antwort erstellen


Übersicht Sonstiges Smalltalk

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group