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