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".
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 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 mitregisterScriptTapHandler
insendEvent
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?
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