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

C'est une suite de la partie 1 [Cocos2d-x] Comment créer une liaison de script (partie 1)

Voyons maintenant comment implémenter le générateur de liaisons.

Créer un fichier pour la langue Lang

Tout d'abord, créez un répertoire pour le langage Lang sous le répertoire tools de Cococ2d-x. Il est difficile de créer à partir de zéro, je vais donc copier le répertoire Lua.

cp -r tools/tolua tools/lang
cp -r tools/bindings-generator/targets/lua tools/bindings-generator/targets/lang

Jetons d'abord un coup d'œil aux fichiers du répertoire * tools / lang *. Je pense qu'il existe des scripts Python appelés * genbindings.py * et des fichiers ini qui commencent par "cocos2dx".

Ouvrez * genbindings.py * et réécrivez la partie suivante de la clause try ~ except.

try:

    lang_root = '%s/tools/lang' % project_root
    output_dir = '%s/cocos/scripting/lang-bindings/auto' % project_root

    cmd_args = {'cocos2dx.ini' : ('cocos2d-x', 'lang_cocos2dx_auto'), \
                }
    target = 'lang'
    generator_py = '%s/generator.py' % cxx_generator_root
    for key in cmd_args.keys():
        args = cmd_args[key]
        cfg = '%s/%s' % (lang_root, key)
        print 'Generating bindings for %s...' % (key[:-4])
        command = '%s %s %s -s %s -t %s -o %s -n %s' % (python_bin, generator_py, cfg, args[0], target, output_dir, args[1])
        _run_cmd(command)

    if platform == 'win32':
        with _pushd(output_dir):
            _run_cmd('dos2unix *')

    print '---------------------------------'
    print 'Generating lang bindings succeeds.'
    print '---------------------------------'

except Exception as e:
    if e.__class__.__name__ == 'CmdError':
        print '---------------------------------'
        print 'Generating lang bindings fails.'
        print '---------------------------------'
        sys.exit(1)
    else:
        raise

Je me sens comme cela.

Dans cmd_args, décrivez la source à générer et son fichier de paramètres. Comme il est difficile de tout gérer depuis le début, nous allons le limiter au plus basique "cocos2d-x.ini". Lorsque "cocos2d-x.ini" est parfait, je pense que c'est une bonne idée d'augmenter les fichiers correspondants un par un.

Ensuite, jetons un œil au contenu de "cocos2d-x.ini". Il existe différents paramètres, mais je pense que les éléments susceptibles d'être réécrits sont les suivants.

L'en-tête C ++ à analyser. Analysez en suivant include à partir du fichier d'en-tête spécifié.

La classe à générer.

Décrivez la méthode à exclure dans la classe spécifiée par les classes. Par exemple, * Sprite :: [getQuad] * exclut la méthode getQuad de la classe Sprite. [*] Désigne toutes les méthodes.

Spécifiez quand le nom de la méthode créée sur le langage Lang est différent du nom de la méthode C ++. Raccourcissez les noms de méthodes longs.

Précisez quand le nom de classe créé sur le langage Lang est différent du nom de méthode C ++.

Spécifiez une classe abstraite. (Ne faites pas de constructeur)

Après avoir vérifié le contenu du fichier ini, fermez-le sans rien changer.

Maintenant, exécutons * bindings-generator * dans cet état pour générer du code glue. Exécutez * genbindings.py * que vous avez réécrit précédemment. Après quelques journaux, si "Génération des liaisons lang réussit." S'affiche, cela signifie qu'il réussit. En cas de succès, les fichiers suivants doivent avoir été générés.

cocos2d-x/cocos/scripting/lang-bindings/auto/lang_cocos2dx_auto.hpp cocos2d-x/cocos/scripting/lang-bindings/auto/lang_cocos2dx_auto.cpp

Je n'ai encore rien changé dans le code généré, donc le contenu est toujours la description de Lua.

Modifier le fichier de modèle pour la génération de code de colle

Pour modifier le code généré, modifiez le fichier de modèle sous le répertoire suivant. Puisque le générateur de liaisons utilise un moteur de template Python appelé Cheetah, Vous écrirez selon la grammaire de Cheetah.

cocos2d-x/tools/bindings-generator/targets/lang/templates/

Les fichiers de modèle suivants se trouvent sous le répertoire des modèles.

Sortie au début du fichier .hpp généré. Écrivez #include etc. Voici un prototype de la fonction register_all_cocos2dx.

Sortie au début du fichier .cpp généré. Écrivez #include etc.

Sortie à la fin du fichier .hpp généré.

Sortie à la fin du fichier .cpp généré. Implémentez la fonction register_all_cocos2dx et Ecrivez un processus pour appeler la méthode register définie pour chaque classe.

Sortie au début d'un groupe pour chaque classe.

Sortie au début d'un groupe pour chaque classe. Écrivez le code que vous souhaitez générer pour chaque classe.

Implémentez la fonction lang_register_cocos2dx_ *. Une collection de fonctions d'inscription de liaison pour chaque classe.

Sortie pour chaque fonction membre.

Sortie pour chaque fonction membre. S'il est surchargé, c'est une sortie.

Sortie pour chaque fonction membre statique.

Sortie pour chaque fonction membre statique. S'il est surchargé, c'est une sortie.

Sortie lors de la liaison de std :: function.

Sortie sous forme de fichier .hpp pour chaque fonction membre. (* fonction * .c fichier commun)

Si la fonction est surchargée, elle sera dans un fichier séparé, mais si elle est surchargée, ce sera un fichier séparé. Vous devez déterminer la fonction de surcharge à exécuter en fonction du nombre et du type d'arguments transmis depuis le langage Lang. C'est parce que le processus devient compliqué. De plus, je pense qu'il existe un modèle appelé apidoc_ *, mais c'est pour apidoc C'est pour sortir la signature de la fonction générée sur le langage Lang sous forme de commentaire.

Vous devez modifier le fichier Yaml suivant lié au modèle. cocos2d-x/tools/bindings-generator/targets/lang/conversions.yaml

Comme vous pouvez le voir dans le contenu, c'est un fichier qui définit la méthode de conversion de type. Utilisez la fonction de conversion de type entre le langage C ++ ⇔ Lang pour définir la fonction de conversion à appeler pour chaque type. "to_native" est le langage Lang-> C ++, from_native est le contraire. Je pense qu'il y a des chaînes de caractères clés qui commencent par «@», mais les chaînes de caractères qui commencent par «@» sont traitées comme des expressions régulières.

Modifier le fichier generator.py

Le script suivant est utilisé pour analyser le code C ++. cocos2d-x/tools/bindings-generator/clang/cindex.py Il s'agit de la liaison Python de Clang, qui est fournie avec le code source de Clang.

finalement

Je pense qu'il y a de nombreux endroits où l'explication est insuffisante, mais pour le moment, c'est la fin. Quant à la correspondance de la commande cocos, je la mets actuellement en œuvre, donc Il peut être écrit comme (Partie 3) lorsqu'il est organisé dans une certaine mesure. Je fais actuellement une reliure pour le langage Squirrel petit à petit.

Le calendrier de l'Avent de demain est giginet. giginet publiera le [livre Cocos2d-x] le 24 décembre (http://giginet.hateblo.jp/entry/2014/11/26/185855). Toutes nos félicitations! J'ai déjà réservé sur Amazon.

c'est tout. (Le 4 décembre était terminé pendant que j'écrivais. Je suis désolé ...)

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
[Blender] Comment rendre les scripts Blender multilingues
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)
[Python] Comment rendre une classe itérable
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 système de dialogue dédié aux débutants
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 pilote de périphérique Linux intégré (8)
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 rendre plusieurs noyaux sélectionnables sur Jupyter
Comment créer un dictionnaire avec une structure hiérarchique.
Comment créer un pilote de périphérique Linux intégré (7)
Comment créer un pilote de périphérique Linux intégré (2)
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 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"
Expliquez en détail comment créer un son avec python
Comment télécharger avec Heroku, Flask, Python, Git (Partie 3)