In C++ einbettbare Skript-Engine, die beliebig beendet werden kann?

Ich mache ein Programmierspiel in C++ und Qt, habe aber eine einzigartige Einschränkung, was meine Auswahl an Engines angeht; Da es möglich ist, dass der Player Code schreibt, der sich endlos wiederholt oder lange zum Ausführen braucht, muss ich in der Lage sein, die Ausführung einer Skript-Engine jederzeit zu beenden. Ich habe gestern bei StackOverflow eine Frage dazu gestellt , und leider gibt es keine Möglichkeit, einen Thread in C++ zu beenden, ohne potenziell Ressourcenprobleme zu verursachen (Sperren werden nicht freigegeben, Speicherlecks usw.).

Mir wurde gesagt, dass ich eine Skript-Engine benötige, die es mir erlaubt, Skripte nach Belieben zu beenden, ohne die Sitzung des Spielers zu gefährden. Welche Möglichkeiten habe ich unter diesen Voraussetzungen?

  • Es muss in eine C++-Anwendung einbettbar sein.
  • Es muss unter Windows, Mac, Linux und Android funktionieren.
  • Es muss keine Mainstream-Sprache wie Python sein, aber es muss jemandem beigebracht werden können, der völlig neu in der Programmierung ist.
    • Haskell, Scheme, Prolog usw. sind richtig, es sei denn, Sie können mich davon überzeugen, dass sie gute erste Sprachen für einen 11-Jährigen zum Erlernen wären.
  • Ich muss in der Lage sein, die Ausführung eines Skripts jederzeit zu stoppen.
    • Ich kann den Thread selbst nicht beenden, warum also nicht die Skript-Engine beenden?
  • Ich sollte die volle Kontrolle über den Scripting-Kontext haben (z. B. welche Objekte/Funktionen/Typen verfügbar sind).
  • Die Qt-Integration wäre nett, ist aber optional (ich kann meinen eigenen Wrapper erstellen).
  • Es muss nicht sehr schnell sein – der Code des Spielers wird wiederholt ausgeführt, aber nicht mehr als einmal alle halbe Sekunde oder so.
  • Ich muss in der Lage sein, C++-Funktionen von dieser Skript-Engine aufzurufen, und ich muss in der Lage sein, in dieser Skriptsprache geschriebene Funktionen von C++ aus aufzurufen.
Tatsächlich benötigen Sie möglicherweise nicht die Möglichkeit, die Skript-Engine nach Belieben zu beenden. Es könnte durchaus ausreichen, ihm signalisieren zu können, dass Sie ein lange laufendes Skript beenden möchten; oder Sie könnten Timeouts intern verwenden, wie setTImeout() von Javascript
Denken Sie auch daran, dass Sie Benutzer anweisen können, einfache Skripte zu schreiben, indem Sie eine kleine Teilmenge der Grammatik der Skriptsprache verwenden - und wenn sie versuchen, etwas Komplexeres zu schreiben, liegt es an ihnen. Und eine letzte Anmerkung – sehen Sie sich an, was vorhandene FOSS-Spiele verwenden (0 AD, Battle for Wesnoth, Cave Story) – zumindest verwenden einige von ihnen eine Skript-Engine, und Sie können sich auch inspirieren lassen, wie Sie sie verwenden können.

Antworten (1)

Vielleicht möchten Sie Lua ausprobieren .

  • Es ist in C oder C++ einbettbar

  • Es ist portabel (funktioniert auf allen Plattformen, die einen C-Compiler haben)

  • Es ist eine ziemlich einfache Sprache

  • Sie können Lua von C++ aufrufen und umgekehrt (sogar mehrfach verschachtelt)

  • Sie haben die volle Kontrolle darüber, welche Funktionalität/Objekte/... den Skripten zur Verfügung gestellt werden

  • Nach meinem Verständnis sollte es möglich sein, eine laufende Lua-Engine in einer Multithread-Umgebung zu beenden

Wenn Sie vollständig in C++ bleiben möchten, könnten Sie an luabind interessiert sein .

@JesseTG: Die Schlacht um Wesnoth verwendet Lua ausgiebig.
Viele Spiele tun das: z. B. WoW (für Benutzer-Addons) und Civilization V, um nur zwei AAA-Titel aus dem Kopf zu nennen
Wenn Lua unter einem C++-Thread läuft und Sie ihn beenden, beenden Sie den C++-Thread und verletzen den ursprünglichen Einwand des OP. Warum ist das eine Antwort?