Es ist eine Fortsetzung von Teil 1 [Cocos2d-x] So erstellen Sie eine Skriptbindung (Teil 1)
Nun wollen wir sehen, wie man den Bindungsgenerator implementiert.
Erstellen Sie zunächst ein Verzeichnis für die Sprache Lang unter dem Tools-Verzeichnis von Cococ2d-x. Es ist schwer, von Grund auf neu zu erstellen, daher kopiere ich das Lua-Verzeichnis.
cp -r tools/tolua tools/lang
cp -r tools/bindings-generator/targets/lua tools/bindings-generator/targets/lang
Schauen wir uns zunächst die Dateien im Verzeichnis * tools / lang * an. Ich denke, es gibt einige Python-Skripte namens * genbindings.py * und einige INI-Dateien, die mit "cocos2dx" beginnen.
Öffnen Sie * genbindings.py * und schreiben Sie den folgenden Teil der try ~ without-Klausel neu.
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
Ich fühle mich so.
Beschreiben Sie in cmd_args die zu generierende Quelle und ihre Einstellungsdatei. Da es von Anfang an schwierig ist, alles zu handhaben, beschränken wir uns auf die grundlegendste "cocos2d-x.ini". Wenn "cocos2d-x.ini" perfekt ist, halte ich es für eine gute Idee, die entsprechenden Dateien einzeln zu vergrößern.
Schauen wir uns als nächstes den Inhalt von "cocos2d-x.ini" an. Es gibt verschiedene Einstellungen, aber ich denke, die Elemente, die wahrscheinlich umgeschrieben werden, sind wie folgt.
Der zu analysierende C ++ - Header. Analysieren Sie anhand der folgenden Header-Datei.
Die zu generierende Klasse.
Beschreiben Sie die Methode, die in der von Klassen angegebenen Klasse ausgeschlossen werden soll. Zum Beispiel schließt * Sprite :: [getQuad] * die getQuad-Methode der Sprite-Klasse aus. [*] Bedeutet alle Methoden.
Geben Sie an, wann sich der in der Sprache Lang erstellte Methodenname vom C ++ - Methodennamen unterscheidet. Verkürzen Sie lange Methodennamen.
Geben Sie an, wann sich der in der Sprache Lang erstellte Klassenname vom Namen der C ++ - Methode unterscheidet.
Geben Sie eine abstrakte Klasse an. (Machen Sie keinen Konstruktor)
Nachdem Sie den Inhalt der INI-Datei überprüft haben, schließen Sie sie, ohne etwas zu ändern.
Lassen Sie uns nun * bindings-generator * in diesem Zustand ausführen, um Klebercode zu generieren. Führen Sie * genbindings.py * aus, das Sie zuvor neu geschrieben haben. Wenn nach einigen Protokollen "Das Generieren von Lang-Bindungen ist erfolgreich" angezeigt wird, ist dies erfolgreich. Bei Erfolg sollten die folgenden Dateien generiert worden sein.
cocos2d-x/cocos/scripting/lang-bindings/auto/lang_cocos2dx_auto.hpp
cocos2d-x/cocos/scripting/lang-bindings/auto/lang_cocos2dx_auto.cpp
Ich habe noch nichts am generierten Code geändert, daher ist der Inhalt immer noch die Beschreibung für Lua.
Um den generierten Code zu ändern, ändern Sie die Vorlagendatei im folgenden Verzeichnis. Da der Bindungsgenerator eine Python-Template-Engine namens Cheetah verwendet, Sie werden nach der Grammatik des Geparden schreiben.
cocos2d-x/tools/bindings-generator/targets/lang/templates/
Die folgenden Vorlagendateien befinden sich im Vorlagenverzeichnis.
Ausgabe am Anfang der generierten .hpp-Datei. Schreiben Sie #include etc. Hier ist ein Prototyp der Funktion register_all_cocos2dx.
Ausgabe am Anfang der generierten CPP-Datei. Schreiben Sie #include etc.
Ausgabe am Ende der generierten .hpp-Datei.
Ausgabe am Ende der generierten CPP-Datei. Implementieren Sie die Funktion register_all_cocos2dx und Schreiben Sie einen Prozess, um die für jede Klasse definierte Registermethode aufzurufen.
Ausgabe am Anfang einer Gruppe für jede Klasse.
Ausgabe am Anfang einer Gruppe für jede Klasse. Schreiben Sie einen beliebigen Code, den Sie für jede Klasse generieren möchten.
Implementieren Sie die Funktion lang_register_cocos2dx_ *. Eine Sammlung verbindlicher Registrierungsfunktionen für jede Klasse.
Ausgabe für jede Mitgliedsfunktion.
Ausgabe für jede Mitgliedsfunktion. Wenn es überlastet ist, wird dies ausgegeben.
Ausgabe für jede statische Elementfunktion.
Ausgabe für jede statische Elementfunktion. Wenn es überlastet ist, wird dies ausgegeben.
Ausgabe beim Binden von std :: function.
Ausgabe als .hpp-Datei für jede Mitgliedsfunktion. (* Funktion * .c gemeinsame Datei)
Wenn die Funktion überladen ist, befindet sie sich in einer separaten Datei. Wenn sie jedoch überladen ist, handelt es sich um eine separate Datei. Sie müssen anhand der Anzahl und des Typs der von der Lang-Sprache übergebenen Argumente bestimmen, welche Überladungsfunktion ausgeführt werden soll. Dies liegt daran, dass der Prozess kompliziert wird. Ich denke auch, dass es eine Vorlage namens apidoc_ * gibt, aber dies ist für apidoc Hiermit wird die Signatur der in der Sprache Lang generierten Funktion als Kommentar ausgegeben.
Sie müssen die folgende Yaml-Datei bearbeiten, die sich auf die Vorlage bezieht.
cocos2d-x/tools/bindings-generator/targets/lang/conversions.yaml
Wie Sie dem Inhalt entnehmen können, handelt es sich um eine Datei, die die Typkonvertierungsmethode definiert. Verwenden Sie die Typkonvertierungsfunktion zwischen der Sprache C ++ ⇔ Lang, um die Konvertierungsfunktion zu definieren, die für jeden Typ aufgerufen werden soll. "to_native" ist Lang language-> C ++, from_native ist das Gegenteil. Ich denke, es gibt einige Schlüsselzeichenfolgen, die mit "@" beginnen, aber die Zeichenfolgen, die mit "@" beginnen, werden als reguläre Ausdrücke behandelt.
Das folgende Skript wird zum Analysieren des C ++ - Codes verwendet.
cocos2d-x/tools/bindings-generator/clang/cindex.py
Dies ist Clangs Python-Bindung, die mit dem Clang-Quellcode geliefert wird.
Ich denke, dass es viele Stellen gibt, an denen die Erklärung unzureichend ist, aber vorerst ist dies das Ende. Die Korrespondenz des Befehls cocos implementiere ich derzeit Es kann als (Teil 3) geschrieben werden, wenn es zu einem gewissen Grad organisiert ist. Ich mache gerade eine Bindung für die Sprache Eichhörnchen nach und nach.
Der Adventskalender von morgen ist giginet. giginet wird am 24. Dezember [Cocos2d-x book] veröffentlichen (http://giginet.hateblo.jp/entry/2014/11/26/185855). Herzliche Glückwünsche! Ich habe bereits bei Amazon gebucht.
das ist alles. (Der 4. Dezember war vorbei, als ich schrieb. Es tut mir leid ...)
Recommended Posts