[PYTHON] [Cocos2d-x] Comment créer une liaison de script (partie 1)

introduction

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".

Procédure approximative

  1. Créez une classe LangEngine qui hérite de ScriptEngineProtocol
  2. Ecrire une fonction pour convertir entre le type C ++ et le type de langage Lang
  3. Ajouter la langue cible au générateur de liaisons
  4. Avec le générateur de liaisons, écrivez sérieusement la logique de génération de code de colle
  5. Si vous pouvez tout faire, correspond à la commande cocos

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éer la classe LangEngine

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 dans ScriptEngineProtocol, alors ajoutez la constante kScriptTypeLang 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 avec registerScriptTapHandler dans sendEvent. 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?

Fonction de conversion de type implémentée entre le langage C ++ ⇔ Lang

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

[Cocos2d-x] Comment créer une liaison de script (partie 2)
[Cocos2d-x] Comment créer une liaison de script (partie 1)
[Cocos 2d-x 3.0] Comment automatiser la liaison de script avec le générateur de liaison
Comment faire un jeu de tir avec toio (partie 1)
Comment faire un test unitaire Part.2 Conception de classe pour les tests
Comment créer un laboratoire de piratage - Kali Linux (2020.1) VirtualBox 64 bits Partie 2-
Comment faire une traduction japonais-anglais
Comment créer un bot slack
Comment créer un robot - Avancé
Comment créer une fonction récursive
[Blender] Comment créer un plug-in Blender
Comment créer un robot - Basic
Comment faire un test unitaire Part.1 Modèle de conception pour l'introduction
Comment rendre les caractères de Word Cloud monochromatiques
[Blender] Comment définir shape_key avec un script
Comment rendre le sélénium aussi léger que possible
Comment utiliser le réseau de développeurs cybozu.com (partie 2)
Comment utiliser Tweepy ~ Partie 1 ~ [Obtenir un Tweet]
[Ubuntu] Comment exécuter un script shell
Comment créer une clé USB à démarrage multiple (compatible Windows 10)
Comment créer un indicateur personnalisé Backtrader
Comment créer un plan de site Pelican
Comment exécuter des scripts Maya Python
Comment créer un pilote de périphérique Linux intégré (11)
Comment faire correspondre WTForms TextArea à la suppression de fichier
Comment créer un plug-in Spigot (pour les débutants Java)
Comment créer un pilote de périphérique Linux intégré (1)
Comment créer un pilote de périphérique Linux intégré (4)
Comment rendre plusieurs noyaux sélectionnables sur Jupyter
Comment créer un pilote de périphérique Linux intégré (7)
Comment créer une sortie JSON Scintillante en japonais
Comment créer un pilote de périphérique Linux intégré (3)
Comment utiliser Tweepy ~ Partie 2 ~ [Suivez, aimez, etc.]
Comment créer un plug-in QGIS (génération de package)
Comment mesurer le temps d'exécution avec Python Partie 1
J'ai lu "Comment créer un laboratoire de piratage"
Comment créer un pilote de périphérique Linux intégré (6)
Comment créer le plugin Python de Substance Painter (Introduction)
Comment créer un pilote de périphérique Linux intégré (5)
Comment créer un pilote de périphérique Linux intégré (10)
Comment rendre le Python des débutants plus rapide [numpy]
Comment apporter des modifications à l'interpréteur Python dans Pycharm
Comment créer un pilote de périphérique Linux intégré (9)
Inspiré par "Comment créer du JavaScript purement fonctionnel"
Comment mesurer le temps d'exécution avec Python, partie 2
Comment faire pour qu'AWS rekognition reconnaisse les fichiers image locaux
Comment ajouter de l'aide à HDA (avec bonus de script Python)
[Suite] Inspiré par "Comment créer du JavaScript purement fonctionnel"
Comment faire reconnaître Yubico Yubikey par Manjaro Linux
Expliquez en détail comment créer un son avec python
Comment télécharger avec Heroku, Flask, Python, Git (Partie 3)
Comment créer un outil CLI interactif avec Golang
Comment télécharger avec Heroku, Flask, Python, Git (Partie 1)
Comment créer un package Python à l'aide de VS Code