[PYTHON] [Cocos2d-x] So erstellen Sie eine Skriptbindung (Teil 2)

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 eine Datei für die Sprache Lang

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.

Bearbeiten Sie die Vorlagendatei für die Erzeugung des Klebercodes

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.

Bearbeiten Sie generator.py

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.

Schließlich

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

[Cocos2d-x] So erstellen Sie eine Skriptbindung (Teil 2)
[Cocos2d-x] So erstellen Sie eine Skriptbindung (Teil 1)
[Cocos 2d-x 3.0] So automatisieren Sie die Skriptbindung mit dem Bindungsgenerator
Wie man ein Schießspiel mit toio macht (Teil 1)
So führen Sie einen Komponententest durch Teil 2 Klassendesign zum Testen
So erstellen Sie ein Hacking-Labor - Kali Linux (2020.1) VirtualBox 64-Bit Teil 2-
Wie erstelle ich eine japanisch-englische Übersetzung?
Wie man einen lockeren Bot macht
Wie erstelle ich einen Crawler?
So erstellen Sie eine rekursive Funktion
[Blender] So erstellen Sie ein Blender-Plug-In
[Blender] So erstellen Sie Blender-Skripte mehrsprachig
Wie erstelle ich einen Crawler?
So führen Sie einen Komponententest durch Teil 1 Entwurfsmuster zur Einführung
So machen Sie Word Cloud-Zeichen monochromatisch
[Blender] So legen Sie shape_key mit dem Skript fest
Wie man Selen so leicht wie möglich macht
Verwendung des Entwicklernetzwerks von cybozu.com (Teil 2)
[Python] Wie man eine Klasse iterierbar macht
Verwendung von Tweepy ~ Teil 1 ~ [Getting Tweet]
[Ubuntu] So führen Sie ein Shell-Skript aus
So machen Sie Multi-Boot-USB (Windows 10-kompatibel)
So erstellen Sie einen benutzerdefinierten Backtrader-Indikator
Wie erstelle ich eine Pelican Site Map?
So führen Sie Maya Python-Skripte aus
Wie man ein Dialogsystem für Anfänger erstellt
So erstellen Sie einen eingebetteten Linux-Gerätetreiber (11)
So stellen Sie sicher, dass WTForms TextArea dem Löschen von Dateien entspricht
So erstellen Sie einen eingebetteten Linux-Gerätetreiber (8)
So erstellen Sie ein Spigot-Plug-In (für Java-Anfänger)
So erstellen Sie einen eingebetteten Linux-Gerätetreiber (1)
So machen Sie mehrere Kernel auf Jupyter auswählbar
So erstellen Sie ein Wörterbuch mit einer hierarchischen Struktur.
So erstellen Sie einen eingebetteten Linux-Gerätetreiber (7)
So erstellen Sie einen eingebetteten Linux-Gerätetreiber (2)
Wie man eine kratzige JSON-Ausgabe japanisch macht
So erstellen Sie einen eingebetteten Linux-Gerätetreiber (3)
Verwendung von Tweepy ~ Teil 2 ~ [Folgen, Gefällt mir usw.]
So messen Sie die Ausführungszeit mit Python Teil 1
Ich las "Wie man ein Hacking Lab macht"
So erstellen Sie einen eingebetteten Linux-Gerätetreiber (6)
So erstellen Sie das Substance Painter Python-Plugin (Einführung)
So erstellen Sie einen eingebetteten Linux-Gerätetreiber (5)
So erstellen Sie einen eingebetteten Linux-Gerätetreiber (10)
Wie man Python für Anfänger schneller macht [numpy]
So nehmen Sie Python Interpreter-Änderungen in Pycharm vor
So erstellen Sie einen eingebetteten Linux-Gerätetreiber (9)
Inspiriert von "Wie man reines funktionales JavaScript macht"
So messen Sie die Ausführungszeit mit Python Part 2
So erkennt die AWS-Erkennung lokale Bilddateien
So fügen Sie HDA Hilfe hinzu (mit Python-Skriptbonus)
[Fortsetzung] Inspiriert von "Wie man reines funktionales JavaScript erstellt"
Erklären Sie ausführlich, wie Sie mit Python einen Sound erzeugen
Hochladen mit Heroku, Flask, Python, Git (Teil 3)