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
ccScriptTypedansScriptEngineProtocol, alors ajoutez la constantekScriptTypeLangici 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 avecregisterScriptTapHandlerdanssendEvent. Inversement, si vous avez enregistré un événement dans ʻEventDispatchercomme en C ++, Il n'est pas nécessaire de l'implémenter danssendEvent`.
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