Ergebnis 1 bis 12 von 12

Thema: Skriptsprache für Games

  1. #1

    Skriptsprache für Games

    Hallo liebe Progforler/innen

    Da ich zur Zeit an einer eigenen Skriptsprache arbeite die speziell für die Spieleentwicklung benutzen werden soll komme ich nichtr drum herum mir Gedanken über den Funktionsumfang und den Stil der Sprache an sich gedanken zu machen.

    Zuerst stellt sich natürlich die Frage ob es solch eine Sprache bereits gibt (würde mich wundern, wenn nicht) und was diese von einer allzweck-skriptsprache denn unterscheidet.

    Darüber hinaus würde ich gerne mal von euch wissen, was denn eine solche Sprache für besondere Eigenschaften und Funktionen haben sollte, um eben bestmöglich effektiv für Spiele genutzt zu werden. Es geht mir erstmal um allgemeine Ansätze, philosophiert ruhig auch gerne rum


    Um den Anfang zu machen:
    Ich persönlich halte eine Möglichkeit den zeitlichen Verlauf von Sprachfunktionen zu steuern für sehr hilfreich.

    Code:
    5s: myPicture.setColor( blau )      /// Färbt ein Bild blau in 5 sekunden
    
    1m: int k = 0 to 100      // in einer Minute ändert sich der wert von k von 0 auf 100

  2. #2
    Zitat Zitat
    Code:
    5s: myPicture.setColor( blau )      /// Färbt ein Bild blau in 5 sekunden
    
    1m: int k = 0 to 100      // in einer Minute ändert sich der wert von k von 0 auf 100
    Hieße dass dann das die Veränderungen über den Verlauf von 5 Sekunden bzw. 1 Minute geschehen, also graduell ?

  3. #3
    richtig.
    Erweiterungen wären da natürlich möglich, wie das man z.b eigene Verlaufskurven anhand von formeln erstellen kann bzw diese schon vordefiniert sind (abschwächen des Verlaufs zum Ende hin, abflachen im mittelteil etc ... )

  4. #4
    Vllt wären Methoden die überschrieben sind, cooler...

    Alos zb:
    Code (Java):
     
    myPicture.setColor( blau )      // Färbt das Bild Blau

    und:
    Code (Java):
     
    myPicture.setColor( blau,5 )      // Färbt ein Bild Blau in 5 sekunden
     


    Jedenfalls finde ich sowas immer ganz gut, wenn man durch Parameterangabe sowas machen kann.
    Vllt auch nicht unbedingt setColor, aber reColor oder movePic etc...

  5. #5
    Jep, sollte auf jeden Fall aus dem Namen ersichtlich sein. Bei set erwarte ich in der Regel wirklich eine Funktion, die nicht viel mehr tut, als einen Wert (sofort) zu setzen.

  6. #6
    Die meisten Spiele verwenden wohl Lua, was allerdings nicht speziell für Spiele, sondern für Embedding generell gedacht ist.

    Ist jetzt zwar etwas OT, aber wieso baust du denn überhaupt was eigenes?

  7. #7
    Lua ist auch gut, verwende ich für mein Spiel auch. Eine Alternative wäre Ruby.
    Ich habe auch gelesen, dass sich z.B. auch tcl für Spiele gut eignet.

    Auch könnte man Perl oder Python nehmen, aber das findet man eher unter unix-artigen Betriebssystemen.

  8. #8
    Ich finde das Konzept von "1m: tu irgendwas in einer Minute" etwas ungeschickt. So hat man doch überhaupt keine Kontrolle über das Event mehr, sobald es einmal mit diesem Befehl aufgerufen wurde. Ich nehme mal dein Beispiel: "1m: int k = 0 to 100". Dies ließe sich doch mit einer einfachen For-Schleife und einer "Stopuhr"-Funktion bestens umsetzen, und man hat innerhalb der Funktion noch Möglichkeiten per IF zu bestimmten Events auszusteigen, Schritte zurückzusetzen oder zu überspringen etc. Bei deinem Einzeiler klingt das für mich so, als würde von nun an die Variable k hochzählen, bis sie in einer Minute bei 100 angekommen ist. Wo bleibt da die Flexibilität? Klar kannst du überall im Code k-=10 schreiben, aber die Übersicht leidet dort doch extrem, weil du keine wirkliche Schleife hast, wo du genau siehst, an welcher Stelle hochgezählt wird, sondern irgendwo im Speicher existiert eine Variable, die sich jede Sekunde (unabhängig davon, wo die Ausführung deines Scriptcodes gerade ist) magisch erhöht.

    Als Anwendungsbeispiel: Mal angenommen, dieser Timer ist in einem Spiel eingebaut und stellt ein Zeitlimit für ein Level dar, soll aber gestoppt werden, sobald der Spieler ein Gegenstand einsammelt. Und nun? Wie stoppt man den Timer von dir? Dazu musst du dir dann ein Behilfskonstrukt a la "0s: stop k" oder sowas schreiben. Auch das ist wenig übersichtlich und sehr undurchsichtig im Programmcode. Oder du musst die Anzeige des Timers am Bildschirm durch einen festen Text (der die letzte Zeit anzeigt) ersetzen und intern zählt die ursprungsvariable k aber weiter. Auch das ist nur ein Workaround anstatt eine Lösung.

    Ich würde lieber Konstrukte wie Schleifen und eine Timer-Funktion in deine Sprache einbauen. Damit kannst du dir mit wenigen Zeilen selbst Funktionen schreiben, die jede Sekunde eine Variable +X zählen und weißt genau, an welcher Stelle im Programmcode das Zählen passiert, um eventuell Einfluss darauf zu nehmen - oder das Zählen anzuhalten etc.

    Auf die Gefahr hin, dass deine Scriptsprache dann zu kompliziert wird würde ich sagen - jeder, der einigermaßen ernsthaft etwas mit Programmierung bzw Scripten zu tun haben will, muss sich mit Schleifen auskennen und Variablen über die Zeit hinweg steuern können. Selbst beim RPG-Maker gibt es Schleifen. Man kann keinen wirklichen Einfluss auf das Geschehen nehmen, ohne sich ein bisschen mit solchen Befehlen und Funktionen zu befassen. Das müssen auch die Anwender deiner Scriptsprache tun - ohne geht es nicht.

  9. #9
    Zitat Zitat
    Ist jetzt zwar etwas OT, aber wieso baust du denn überhaupt was eigenes?
    Ich schätze csg antwortet nicht, weil er es nicht fassen kann, das jemand das nicht kennt, aber es geht um dieses Projekt von ihm.

    EDIT:
    Entschuldigung, dass ich es gewagt habe ironisch zu sein, ich bin schon dabei mich selbst als Strafe zu geißeln

    Geändert von Mivey (09.09.2010 um 22:24 Uhr)

  10. #10
    Zitat Zitat von Mivey Beitrag anzeigen
    Ich schätze csg antwortet nicht, weil er es nicht fassen kann, das jemand das nicht kennt, aber es geht um dieses Projekt von ihm.
    Aha, und jeder Mensch auf Erden sollte unbedingt schon von diesem Projekt gehört haben, oder wie?
    Nichts gegen CSG oder seine Arbeit, aber man kann ja nicht über alles bescheid wissen.

  11. #11
    Laufen diese Befehle eigentlich sequentiell oder synchron, csg?

  12. #12
    Tut mir leid, dass ich erst jetzt antworte - soviel zu tun.

    Zitat Zitat von Ynnus Beitrag anzeigen
    Ich finde das Konzept von "1m: tu irgendwas in einer Minute" etwas ungeschickt. So hat man doch überhaupt keine Kontrolle über das Event mehr, sobald es einmal mit diesem Befehl aufgerufen wurde. Ich nehme mal dein Beispiel: "1m: int k = 0 to 100". Dies ließe sich doch mit einer einfachen For-Schleife und einer "Stopuhr"-Funktion bestens umsetzen, und man hat innerhalb der Funktion noch Möglichkeiten per IF zu bestimmten Events auszusteigen, Schritte zurückzusetzen oder zu überspringen etc. Bei deinem Einzeiler klingt das für mich so, als würde von nun an die Variable k hochzählen, bis sie in einer Minute bei 100 angekommen ist. Wo bleibt da die Flexibilität? Klar kannst du überall im Code k-=10 schreiben, aber die Übersicht leidet dort doch extrem, weil du keine wirkliche Schleife hast, wo du genau siehst, an welcher Stelle hochgezählt wird, sondern irgendwo im Speicher existiert eine Variable, die sich jede Sekunde (unabhängig davon, wo die Ausführung deines Scriptcodes gerade ist) magisch erhöht.

    Als Anwendungsbeispiel: Mal angenommen, dieser Timer ist in einem Spiel eingebaut und stellt ein Zeitlimit für ein Level dar, soll aber gestoppt werden, sobald der Spieler ein Gegenstand einsammelt. Und nun? Wie stoppt man den Timer von dir? Dazu musst du dir dann ein Behilfskonstrukt a la "0s: stop k" oder sowas schreiben. Auch das ist wenig übersichtlich und sehr undurchsichtig im Programmcode. Oder du musst die Anzeige des Timers am Bildschirm durch einen festen Text (der die letzte Zeit anzeigt) ersetzen und intern zählt die ursprungsvariable k aber weiter. Auch das ist nur ein Workaround anstatt eine Lösung.

    Ich würde lieber Konstrukte wie Schleifen und eine Timer-Funktion in deine Sprache einbauen. Damit kannst du dir mit wenigen Zeilen selbst Funktionen schreiben, die jede Sekunde eine Variable +X zählen und weißt genau, an welcher Stelle im Programmcode das Zählen passiert, um eventuell Einfluss darauf zu nehmen - oder das Zählen anzuhalten etc.

    Auf die Gefahr hin, dass deine Scriptsprache dann zu kompliziert wird würde ich sagen - jeder, der einigermaßen ernsthaft etwas mit Programmierung bzw Scripten zu tun haben will, muss sich mit Schleifen auskennen und Variablen über die Zeit hinweg steuern können. Selbst beim RPG-Maker gibt es Schleifen. Man kann keinen wirklichen Einfluss auf das Geschehen nehmen, ohne sich ein bisschen mit solchen Befehlen und Funktionen zu befassen. Das müssen auch die Anwender deiner Scriptsprache tun - ohne geht es nicht.
    Ich muss dir recht geben, Schleifen und sonstige Möglichkeiten sind natürlich essentiell für eine Sprache, egal ob für Spiele oder nicht, und die werden natürlich auch vorhanden sein.
    Das ganze ist wohl ein wenig falsch rübergekommen und das Beispiel mit dem Counter war vielleicht auch nicht das beste. Diese Möglichkeit, so gut wie "jeder" Funktionen einen zusätzlichen zeitlichen verlauf zu geben ist natürlich nur eine möglichkeit zur erleichtern des skriptens. Wenn man genauren Zugriff und Kontrolle über die veränderten Werte braucht, kann man natürlich immernoch Schleifen oder sonstiges verwenden. Aber hier liegt der Punkt: Wenn ich ein Spiel mache, brauch ich das oft/meistens nicht.

    Mal ein kleines beispiel um ein Menü erscheinen zu lassen:

    Code (pseudocode):
    ]
    menueItem1.move(pos, 5000);
    menueItem2.move(pos, 5000);
    menueItem3.move(pos, 5000);
    menueItem4.move(pos, 5000);
    menueItem5.move(pos, 5000);
    menueHeader.move(pos, 1000);
    /// etc
     


    Die Sache ist einfach die, dass in einem Spiel (dafür ist die Sprache da), wirklich extrem viele Funktionen in irgendeiner Art einen zeitlichen Verlauf starten (so meine Erfahrung). Daher war mein Ansatz, den Parameter für die Zeit (der ja wirklich in sovielen Funktionen vorhanden ist) aus eben diesen zu extrahieren und vorzuziehen.

    Code (pseudocode):
     
    5000s: {
        menueItem1.move(pos);
        menueItem2.move(pos);
        menueItem3.move(pos);
        menueItem4.move(pos);
        menueItem5.move(pos);
    }
    1000s:menueHeader.move(pos);
    /// etc
     


    Im Endeffekt ist es also nur eine vereinfachte schreibweise die (meiner Meinung nach) einen besseren Überblick verschafft, aber im Endeffekt nicht genutzt werden muss. Für Programmierer die beim alten bleiben wollen werde ich wahrscheinlich dennoch Funktionen mitgeben, die den zeitparameter haben.

    Zitat Zitat von NPC Fighter Beitrag anzeigen
    Laufen diese Befehle eigentlich sequentiell oder synchron, csg?
    In diesem Falle wäre das theoretisch synchron.

    Code:
    /// Theoretisch gleichzeitig
    1m:movePicture(pic1,pos)
    1m:movePicture(pic1,pos)
    Code:
    /// Sequentiell
    wait 1m:movePicture(pic1,pos);
    
    /// oder
    1m:movePicture(pic1,pos);
    wait(1m);
    Zitat Zitat von mq Beitrag anzeigen
    Ist jetzt zwar etwas OT, aber wieso baust du denn überhaupt was eigenes?
    Wie Mivey sagte, ist für Glassworld und weil ich soetwas als Übung ohnehin mal machen wollte.

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •