[PYTHON] [Cocos2d-x] So erstellen Sie eine Skriptbindung (Teil 1)

Einführung

Ich heiße @tkyaji. Dies ist meine erste Teilnahme am Adventskalender. Ich möchte eine Implementierungsmethode schreiben, wenn ich Cocos2d-x eine Skriptbindung hinzufüge. Die Version von Cocos2d-x ist 3.2.

Darüber hinaus war die Vorbereitung für die Verwendung des Bindungsgenerators der Adventskalender des letzten Jahres. giginet hat also einen sehr leicht verständlichen Artikel geschrieben Ich werde die Erklärung dazu weglassen (es wurde gespeichert) [Cocos2d-x 3.0] Automatisieren der Skriptbindung mit dem Bindungsgenerator

In der folgenden Erklärung wird die hinzuzufügende Skriptsprache als "Lang" beschrieben. Ersetzen Sie beispielsweise für Lua "Lang" durch "Lua".

Grobe Prozedur

  1. Erstellen Sie eine LangEngine-Klasse, die ScriptEngineProtocol erbt
  2. Schreiben Sie eine Funktion zum Konvertieren zwischen C ++ - Typ und Lang-Sprachtyp
  3. Fügen Sie dem Bindungsgenerator eine Zielsprache hinzu
  4. Schreiben Sie mit dem Bindungsgenerator die Logik zur Erzeugung des Klebercodes ernsthaft
  5. Wenn Sie alles können, entsprechen Sie dem Befehl cocos

Es ist fast so. Die Implementierungen der Befehle bindings-generator und cocos sind in Python geschrieben. Es wird wahrscheinlich das letzte sein, das den Befehl cocos unterstützt. Erstellen Sie also zuerst ein Lua-Bindungsprojekt und Ich denke, es ist besser, es darin umzusetzen.

Erstellen Sie eine LangEngine-Klasse

Erstellen Sie eine Engine-Klasse, die "LuaEngine" für Lua und "ScriptingCore" für JS entspricht. Es erbt von cocos2d :: ScriptEngineProtocol und überschreibt die folgende virtuelle Funktion.

Gibt Konstanten für jede Skriptsprache zurück. Es gibt eine Aufzählung mit dem Namen "ccScriptType" in "ScriptEngineProtocol". Fügen Sie daher hier und die Konstante "kScriptTypeLang" hinzu Ich werde es zurückgeben.

Wird vom Destruktor der Ref-Klasse aufgerufen. Wenn eine Instanz in C ++ aufgrund von Autorelease usw. stirbt, wird auch die Instanz in Lang-Sprache gelöscht. Implementieren Sie eine solche Verarbeitung. Die Ref-Klasse hat die Felder "_ID" und "_scriptObject". Durch Festlegen der Instanzinformationen für die Lang-Sprache können hier die C ++ - Instanz und die Lang-Sprachinstanz festgelegt werden. Kann verlinkt werden.

Liest die angegebene Lang-Sprachzeichenfolge und führt sie aus.

Lädt die angegebene Lang-Sprach-Skriptdatei und führt sie aus. Grundsätzlich führt diese Methode die Skriptdatei im Verzeichnis * src * aus Dies ist die erste Methode, die implementiert werden muss.

executeGlobalFunction

Führt eine globale Funktion in der Sprache Lang mit dem angegebenen Namen aus.

sendEvent

Wird aufgerufen, wenn verschiedene Ereignisse (Drücken der Menütaste, Berühren, Planen usw.) ausgelöst werden. Das Argument ScriptEvent bestimmt den Ereignistyp. Wenn das Ereignis von einer anderen Methode als C ++ registriert wird, wird der in dieser Methode registrierte Prozess aufgerufen. In Lua wird der Rückruf beispielsweise mit der Methode "registerScriptTapHandler" registriert Führen Sie in diesem Fall die mit registerScriptTapHandler in sendEvent registrierte Lua-Funktion aus. Wenn Sie dagegen ein Ereignis in "EventDispatcher" wie in C ++ registriert haben, Es ist nicht notwendig, es in "sendEvent" zu implementieren.

handleAssert

Von CCASERT aufgerufen. Hier implementieren wir die Fehlerprotokollausgabe und die Fehlerbehandlung in der Lang-Sprache. Lösen Sie beispielsweise eine Ausnahme für die Sprache Lang aus.

parseConfig

Für die Zusammenarbeit mit CocoStudio?

Implementierte Typkonvertierungsfunktion zwischen C ++ ⇔ Lang-Sprache

Die Quelle ist "LuaBasicConversions" für Lua und "js_manual_conversions" für JS. Wir werden eine Funktion erstellen, die C ++ - und Lang-Sprachtypen konvertiert. Im Fall von Lua ist beispielsweise die Funktion, die Vec2 konvertiert, wie folgt definiert.

// c++ -> lua
void vec2_to_luaval(lua_State* L,const cocos2d::Vec2& vec2)
{
    if (NULL  == L)
        return;
    lua_newtable(L);                                    /* L: table */
    lua_pushstring(L, "x");                             /* L: table key */
    lua_pushnumber(L, (lua_Number) vec2.x);               /* L: table key value*/
    lua_rawset(L, -3);                                  /* table[key] = value, L: table */
    lua_pushstring(L, "y");                             /* L: table key */
    lua_pushnumber(L, (lua_Number) vec2.y);               /* L: table key value*/
    lua_rawset(L, -3);
}

// lua -> c++
bool luaval_to_vec2(lua_State* L,int lo,cocos2d::Vec2* outValue)
{
    if (nullptr == L || nullptr == outValue)
        return false;
    
    bool ok = true;
    
    tolua_Error tolua_err;
    if (!tolua_istable(L, lo, 0, &tolua_err) )
    {
#if COCOS2D_DEBUG >=1
        luaval_to_native_err(L,"#ferror:",&tolua_err);
#endif
        ok = false;
    }
    
    if (ok)
    {
        lua_pushstring(L, "x");
        lua_gettable(L, lo);
        outValue->x = lua_isnil(L, -1) ? 0 : lua_tonumber(L, -1);
        lua_pop(L, 1);
        
        lua_pushstring(L, "y");
        lua_gettable(L, lo);
        outValue->y = lua_isnil(L, -1) ? 0 : lua_tonumber(L, -1);
        lua_pop(L, 1);
    }
    return ok;
}

Diese Konvertierungsfunktionen werden bei der Implementierung des Bindungsgenerators verwendet. Sie müssen nicht alles zuerst erstellen, da Sie die benötigten Typen nach Bedarf hinzufügen können, während Sie den Bindungsgenerator implementieren. Es ist auch möglich, die obige Konvertierungsfunktion zu implementieren, ohne sie zu erstellen, aber in den meisten Fällen ist es einfacher, sie zu erstellen.

Das ist vorerst alles für heute. Morgen möchte ich die Implementierung von * bindings-generator * erläutern.

[Cocos2d-x] So erstellen Sie eine Skriptbindung (Teil 2)

Recommended Posts

[Cocos2d-x] So erstellen Sie eine Skriptbindung (Teil 2)
[Cocos2d-x] So erstellen Sie eine Skriptbindung (Teil 1)
[Cocos 2d-x 3.0] So automatisieren Sie die Skriptbindung mit dem Bindungsgenerator
Wie man ein Schießspiel mit toio macht (Teil 1)
So führen Sie einen Komponententest durch Teil 2 Klassendesign zum Testen
So erstellen Sie ein Hacking-Labor - Kali Linux (2020.1) VirtualBox 64-Bit Teil 2-
Wie erstelle ich eine japanisch-englische Übersetzung?
Wie man einen lockeren Bot macht
Wie erstelle ich einen Crawler?
So erstellen Sie eine rekursive Funktion
[Blender] So erstellen Sie ein Blender-Plug-In
Wie erstelle ich einen Crawler?
So führen Sie einen Komponententest durch Teil 1 Entwurfsmuster zur Einführung
So machen Sie Word Cloud-Zeichen monochromatisch
[Blender] So legen Sie shape_key mit dem Skript fest
Wie man Selen so leicht wie möglich macht
Verwendung des Entwicklernetzwerks von cybozu.com (Teil 2)
Verwendung von Tweepy ~ Teil 1 ~ [Getting Tweet]
[Ubuntu] So führen Sie ein Shell-Skript aus
So machen Sie Multi-Boot-USB (Windows 10-kompatibel)
So erstellen Sie einen benutzerdefinierten Backtrader-Indikator
Wie erstelle ich eine Pelican Site Map?
So führen Sie Maya Python-Skripte aus
So erstellen Sie einen eingebetteten Linux-Gerätetreiber (11)
So stellen Sie sicher, dass WTForms TextArea dem Löschen von Dateien entspricht
So erstellen Sie ein Spigot-Plug-In (für Java-Anfänger)
So erstellen Sie einen eingebetteten Linux-Gerätetreiber (1)
So erstellen Sie einen eingebetteten Linux-Gerätetreiber (4)
So machen Sie mehrere Kernel auf Jupyter auswählbar
So erstellen Sie einen eingebetteten Linux-Gerätetreiber (7)
Wie man eine kratzige JSON-Ausgabe japanisch macht
So erstellen Sie einen eingebetteten Linux-Gerätetreiber (3)
Verwendung von Tweepy ~ Teil 2 ~ [Folgen, Gefällt mir usw.]
So erstellen Sie ein QGIS-Plug-In (Paketerzeugung)
So messen Sie die Ausführungszeit mit Python Teil 1
Ich las "Wie man ein Hacking Lab macht"
So erstellen Sie einen eingebetteten Linux-Gerätetreiber (6)
So erstellen Sie das Substance Painter Python-Plugin (Einführung)
So erstellen Sie einen eingebetteten Linux-Gerätetreiber (5)
So erstellen Sie einen eingebetteten Linux-Gerätetreiber (10)
Wie man Python für Anfänger schneller macht [numpy]
So nehmen Sie Python Interpreter-Änderungen in Pycharm vor
So erstellen Sie einen eingebetteten Linux-Gerätetreiber (9)
Inspiriert von "Wie man reines funktionales JavaScript macht"
So messen Sie die Ausführungszeit mit Python Part 2
So erkennt die AWS-Erkennung lokale Bilddateien
So fügen Sie HDA Hilfe hinzu (mit Python-Skriptbonus)
[Fortsetzung] Inspiriert von "Wie man reines funktionales JavaScript erstellt"
Wie man Yubico Yubikey von Manjaro Linux erkennt
Erklären Sie ausführlich, wie Sie mit Python einen Sound erzeugen
Hochladen mit Heroku, Flask, Python, Git (Teil 3)
So erstellen Sie ein interaktives CLI-Tool mit Golang
Hochladen mit Heroku, Flask, Python, Git (Teil 1)
So erstellen Sie ein Python-Paket mit VS Code