Mon nom est @tkyaji. C'est ma première participation au Calendrier de l'Avent. Je voudrais écrire une méthode d'implémentation lors de l'ajout de la liaison de script à Cocos2d-x. La version de Cocos2d-x est 3.2.
De plus, la préparation requise lors de l'utilisation du générateur de liaisons était le calendrier de l'Avent de l'année dernière. giginet a écrit un article très simple à comprendre, Je vais omettre l'explication à ce sujet (elle a été enregistrée) [Cocos2d-x 3.0] Comment automatiser la liaison de script avec le générateur de liaison
Dans l'explication suivante, le langage de script à ajouter est décrit comme "Lang". Par exemple, pour Lua, remplacez "Lang" par "Lua".
C'est presque comme ça. Les implémentations des commandes bindings-generator et cocos sont écrites en Python. Ce sera probablement le dernier à prendre en charge la commande cocos, alors créez d'abord un projet Lua Binding et Je pense qu'il vaut mieux y mettre en œuvre.
Créez une classe Engine qui correspond à LuaEngine
pour Lua et à ScriptingCore
pour JS.
Il hérite de cocos2d :: ScriptEngineProtocol
et remplace la fonction virtuelle suivante.
Renvoie des constantes pour chaque langage de script. Il y a une énumération appelée
ccScriptType
dansScriptEngineProtocol
, alors ajoutez la constantekScriptTypeLang
ici et Je vais le retourner.
Appelé par le destructeur de classe Ref. Lorsqu'une instance sur C ++ meurt en raison de la libération automatique, etc., l'instance sur le langage Lang est également supprimée, Mettez en œuvre un tel traitement. La classe Ref contient les champs «_ID» et «_scriptObject». En définissant ici les informations d'instance sur le langage Lang, l'instance C ++ et l'instance de langage Lang peuvent être définies. Peut être lié.
Lit et exécute la chaîne de langue Lang spécifiée.
Charge et exécute le fichier de script de langage Lang spécifié. Fondamentalement, cette méthode exécute le fichier de script sous le répertoire * src *, donc C'est la première méthode à mettre en œuvre.
executeGlobalFunction
Exécute une fonction globale sur la langue Lang avec le nom spécifié.
sendEvent
Appelé lorsque divers événements (pression de bouton de menu, toucher, programmation, etc.) sont déclenchés. L'argument «ScriptEvent» détermine le type d'événement. Si l'événement est enregistré par une méthode différente de C ++, le processus enregistré dans cette méthode est appelé. Par exemple, dans Lua, le rappel est enregistré avec la méthode
registerScriptTapHandler
, donc Dans ce cas, exécutez la fonction Lua enregistrée avecregisterScriptTapHandler
danssendEvent
. Inversement, si vous avez enregistré un événement dans ʻEventDispatchercomme en C ++, Il n'est pas nécessaire de l'implémenter dans
sendEvent`.
handleAssert
Appelé du CCASERT. Ici, nous allons implémenter la sortie du journal des erreurs et la gestion des erreurs en langage Lang. Par exemple, générez une exception sur le langage Lang.
parseConfig
Pour une coopération avec CocoStudio?
La source est LuaBasicConversions
pour Lua et js_manual_conversions
pour JS.
Nous allons créer une fonction qui convertit les types C ++ et les types de langage Lang.
Par exemple, dans le cas de Lua, la fonction qui convertit Vec2 est définie comme suit.
// 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;
}
Ces fonctions de conversion sont utilisées lors de l'implémentation du générateur de liaisons. Vous n'êtes pas obligé de tout créer d'abord, car vous pouvez ajouter les types dont vous avez besoin au besoin lors de l'implémentation du générateur de liaisons. Il est également possible d'implémenter la fonction de conversion ci-dessus sans la créer, mais dans la plupart des cas, il est plus facile de la créer.
Pour le moment, c'est tout pour aujourd'hui. Demain, je voudrais expliquer l'implémentation de * bindings-generator *.
[Cocos2d-x] Comment créer une liaison de script (partie 2)
Recommended Posts