CocosCreator klassisches Einstiegsprojekt flappybird

CocosCreator klassisches Einstiegsprojekt flappybird

Entwicklungsumgebung

CocosCreator v2.3.1

Node.js v10.16.0

vscode 1.46.1

Game-Engine-Konzept

Es kann als ein Satz vorab geschriebener Codes verstanden werden, der die Verwendung der zugrunde liegenden Schnittstelle kapselt und den Kernfunktionsanbieter für die Spieleentwicklung darstellt.

Es ist im Allgemeinen in 6 Teile gegliedert:

  1. Bild-Rendering: Steuert die Zeichenvorgänge des Computers bei Spielgrafiken, was sich direkt auf die Qualität des Spiels auswirkt.
  2. Audio-UI: Bietet Audioeffekte und eine Spiel-UI, um die Interaktion des Spiels mit den Benutzern zu verbessern
  3. Geräteeingabe: Tastatur, Maus, Gyroskop usw.
  4. Skript-Engine: Bietet eine Skriptschnittstelle und ermöglicht Spieleentwicklern das „Schreiben“
  5. Netzwerk-Engine: Dateninteraktionsmodul, das den Server verwendet, um die Interaktion für den Client bereitzustellen
  6. Physik-Engine (fortgeschritten): simuliert reale physikalische Effekte (Erdbeschleunigung, Kollisionen zwischen Objekten usw.).

Über Cocos Creator

Projektstruktur

Projektname (Projektordner)
├──Assets-Ressourcenordner----------Wird verwendet, um alle lokalen Ressourcen, Skripte und Bibliotheksdateien von Drittanbietern im Spiel zu platzieren. ├──Bibliotheksressourcenbibliothek----------------Die Dateistruktur und das Ressourcenformat werden hier in die für die endgültige Veröffentlichung des Spiels erforderliche Form verarbeitet. ├──Lokale lokale Einstellungen-------------Speichern Sie die Konfigurationsinformationen des Projekts (Editor-Panel-Layout, Fenstergröße, Position usw.).
├──Ordner für Erweiterungs-Plugins „packages“ – speichert benutzerdefinierte Erweiterungs-Plugins für das Projekt. ├──Settings – Projekteinstellungen-------------speichert projektbezogene Einstellungen wie Paketname, Szene und Plattformauswahl im Build-Release-Menü. ├──Temp – temporärer Ordner----------wird zum Zwischenspeichern der lokalen temporären Dateien von CocosCreator verwendet. └──project.json – Bestätigungsdatei-------------als Zeichen zur Bestätigung der Legitimität des CocosCreator-Projekts.

Beginnen wir mit dem eigentlichen Projekt

Konfigurieren der Codebearbeitungsumgebung

Visual Studio Code (im Folgenden als VS Code bezeichnet) ist eine neue leichte plattformübergreifende IDE von Microsoft. Es unterstützt Windows-, Mac- und Linux-Plattformen und ist sehr einfach zu installieren und zu konfigurieren. Verwenden Sie VS Code zum Verwalten und Bearbeiten von Projektskriptcodes und implementieren Sie problemlos Funktionen wie Syntaxhervorhebung und intelligente Codeeingabeaufforderungen.

Installieren Sie das Cocos Creator API-Adapter-Plugin

Dieser Vorgang installiert das Cocos Creator API-Adapter-Plug-In im globalen Plug-In-Ordner von VS Code. Nach erfolgreicher Installation wird in der Konsole eine grüne Eingabeaufforderung angezeigt: VS Code extension installed to ... . Die Hauptfunktion dieses Plug-Ins besteht darin, Syntaxaufforderungen, die den Verwendungsgewohnheiten von Cocos Creator-Komponentenskripten entsprechen, in den VS Code-Bearbeitungsstatus einzufügen.

Smart-Prompt-Daten im Projekt generieren

Wenn Sie beim Schreiben des Codes automatisch die API der Cocos Creator-Engine auffordern möchten, müssen Sie über das Menü intelligente API-Eingabeaufforderungsdaten generieren und diese automatisch in den Projektpfad einfügen.

Wählen Sie im Hauptmenü Entwickler -> VS Code-Workflow -> VS Code IntelliSense-Daten aktualisieren . Dieser Vorgang API data generated and copied to ... gemäß der Engine-API generierte Datendatei creator.d.ts in das Stammverzeichnis des Projekts (beachten Sie, dass es sich außerhalb des assets -Verzeichnisses befindet). Wenn der Vorgang erfolgreich ist, wird in der Konsole eine grüne Eingabeaufforderung angezeigt: API-Daten generiert und kopiert nach ...

Aktivieren Sie die Skriptkompilierung mit VS Code

Nachdem Sie das Projektskript mit einem externen Texteditor geändert haben, müssen Sie das Cocos Creator-Fenster erneut aktivieren, um die Skriptkompilierung auszulösen. Wir haben in der neuen Version von Creator eine Vorschauserver-API hinzugefügt, die die Editorkompilierung durch Senden einer Anfrage an eine bestimmte Adresse aktivieren kann.

Neues Projekt

1. Erstellen Sie ein leeres Projekt

2. Ressourcenmanager

Anschließend müssen im Ressourcenmanager die wichtigsten Szenen und Skriptdateien des Projekts erstellt und die für das Spiel benötigten Texturen (Bildressourcen) importiert werden. Die Ordner hier werden nicht standardmäßig erstellt, Sie müssen sie manuell erstellen, um die Verwaltung Ihrer Projekte zu erleichtern. Es ist zu beachten, dass Ressourcen ein spezieller Ressourcenordner in CocosCreator (im Folgenden als Cocos bezeichnet) sind. Alle Ressourcen, die dynamisch über cc.loader.loadRes geladen werden müssen (diese Methode wird später erwähnt), müssen im Ressourcenordner und seinen Unterordnern abgelegt werden. Wenn eine Ressource nur von anderen Ressourcen in Ressourcen abhängig ist und nicht direkt von cc.loader.loadRes aufgerufen werden muss, muss sie nicht im Ressourcenordner platziert werden.

3. Szenario

Erstellen Sie eine neue Szene in Szenen, klicken Sie mit der rechten Maustaste auf Szenen – erstellen Sie eine neue Szene. In Cocos Creator ist die Spielszene das Zentrum für die Organisation von Spielinhalten während der Entwicklung und auch der Träger für die Präsentation aller Spielinhalte für die Spieler. Die Spielszene umfasst im Allgemeinen folgende Inhalte:

  • Szenenbilder und Text (Sprite, Label)
  • Rolle
  • Spiellogikskripte, die in Form von Komponenten an Szenenknoten angehängt sind

Wenn der Spieler das Spiel startet, wird die Spielszene geladen. Nachdem die Spielszene geladen wurde, werden die Spielskripte der enthaltenen Komponenten automatisch ausgeführt, um verschiedene vom Entwickler festgelegte logische Funktionen zu implementieren. Deshalb sind neben den Ressourcen auch die Spielszenen die Grundlage für die gesamte Inhaltserstellung. Lassen Sie uns jetzt eine neue Szene erstellen. Für das Einsteigerprojekt Flappybird müssen Sie lediglich eine neue Szene erstellen. Nach Abschluss des Projekts wird der Effekt in etwa so aussehen.

4. Szeneneditor, Hierarchiemanager, Eigenschafteninspektor

Doppelklicken Sie auf die von Ihnen erstellte Vogelszene und Cocos öffnet diese Szene im Szeneneditor und Hierarchiemanager . Nach dem Öffnen der Szene zeigt der Hierarchiemanager alle Knoten in der aktuellen Szene und ihre hierarchischen Beziehungen an. Die Szene, die wir gerade erstellt haben, hat nur einen Knoten namens Canvas . Canvas kann als Canvas-Knoten oder Rendering-Stammknoten bezeichnet werden. Klicken Sie, um Canvas auszuwählen, und Sie können seine Eigenschaften im Eigenschafteninspektor sehen.

Ziehen Sie das Himmelshintergrundbild aus dem Texturverzeichnis im Ressourcenpaket als Spielhintergrund auf die Leinwand. Passen Sie die Größe der Leinwand und des Himmels an. Die Größe des Himmels muss mindestens größer als die Leinwand sein, sonst kann das von Ihnen erstellte Spiel große schwarze Ränder aufweisen. Verwenden Sie dann eine ähnliche Methode, um bird0 (die anderen beiden dienen zum Erstellen einfacher Frame-Animationen zur Simulation des Vogelflugs), pipe1 (unteres Rohr) und pipe2 (oberes Rohr) zum Canvas hinzuzufügen. Die oberen und unteren Rohre sind eine Gruppe, und ich habe 4 Gruppen kopiert, also insgesamt 5 Gruppen. Der Hintergrund und jeder Rohrsatz werden durch ein Skript gesteuert, sodass sie sich nach links bewegen und so den Effekt erzielen, als würde ein Vogel kontinuierlich vorwärts fliegen.

5. Knotenbindung

Dabei ist zu beachten, dass alle Elemente unter Canvas in Form von Node-Knoten verwaltet werden. Erstellen Sie eine neue Skriptdatei im Skript „game.js“, ziehen Sie sie in Canvas oder binden Sie sie direkt an Canvas. Stellen Sie sicher, dass das Skript geladen wird, wenn die Szene geladen wird.

6. Lebenszyklus-Rückruf

Cocos Creator bietet Lebenszyklus-Rückruffunktionen für Komponentenskripte. Solange der Benutzer eine bestimmte Rückruffunktion definiert, führt Creator die entsprechenden Skripte automatisch zu einem bestimmten Zeitpunkt aus und der Benutzer muss sie nicht manuell aufrufen.

Die den Benutzern derzeit zur Verfügung gestellten Lebenszyklus-Rückruffunktionen sind:

  • onLoad onLoad -Rückruf wird ausgelöst, wenn der Knoten zum ersten Mal aktiviert wird, beispielsweise wenn die Szene geladen oder der Knoten aktiviert wird. Und onLoad wird immer ausgeführt, bevor eine start aufgerufen wird. Normalerweise führen wir in der onLoad Phase einige initialisierungsbezogene Vorgänge aus.
  • start Die start Callback-Funktion wird ausgelöst, bevor die Komponente zum ersten Mal aktiviert wird, d. h. bevor das erste update ausgeführt wird. start wird normalerweise zum Initialisieren einiger Daten verwendet, die häufig geändert werden müssen und sich während der Aktualisierung ändern können.
  • Ein wichtiger Punkt bei der Spieleentwicklung besteht darin, das Verhalten, den Status und die Position von Objekten vor dem Rendern jedes Frames zu aktualisieren. Diese Aktualisierungsvorgänge werden normalerweise im update platziert. Die folgenden vier Callback-Funktionen werden in diesem Projekt nicht verwendet
  • spätesUpdate
  • bei Zerstörung
  • beiAktivieren
  • beiDeaktivierung

Hauptcode

spiel.js

cc.Klasse({
    erweitert: cc.Component,

    Eigenschaften:
        skyNode: cc.Node, //Himmelknoten definieren pipeNode: cc.Node, //Pipe-Knoten definieren birdNode: cc.Node, //Vogelknoten definieren clickLayerNode: cc.Node, //Listener-Knoten definieren, um auf Mausklick-Ereignisse zu hören scoreNode: cc.Node, //Punkteknoten definieren Gesamtpunktzahlknoten buttonNode: cc.Node, //Button-Knoten definieren, um die Spieltaste zu starten numberNode: cc.Node, //Nummernknoten definieren, um Punktekombination hinzuzufügen
        overNode: cc.Node, //Definiere den Endknoten des Spiels, Endschaltfläche spriteFrame: { //Definiere den Sprite-Frame-Knoten,
            Standard: [], //Array-Typ, bindet drei Bild-Sprites bird0, bird1 und bird2 und bildet eine Animation, indem sie in der Methode update() ständig geändert werden. Typ: cc.SpriteFrame //Bild-Sprite-Typ},
        Clip: {//Definieren Sie den Soundeffektknoten Standard: [], //Auch ein Array-Typ, der zum Binden mehrerer Ressourcen praktisch ist. Für das nachfolgende Lernen können Sie versuchen, den dynamischen Ladetyp zu verwenden: cc.AudioClip // Audiotyp}
    },
    onClickButton() {//Setze die Methode für den Klick-Button this.num = 0;//Setze num auf 0 zurück
        this.sign = true;//Legen Sie die Kennung fest, die steuert, ob das Spiel fortgesetzt wird. this.buttonNode.active = false;//Machen Sie den Schaltflächenknoten unsichtbar. this.overNode.active = false;//Machen Sie den OverNode-Knoten, der den Text „Game Over“ steuert, unsichtbar. this.birdNode.y = 50;//Nach dem Klicken auf die Schaltfläche kehrt die Position des Vogels an seine ursprüngliche Position zurück. this.power = 0;//Ändern Sie den Leistungsfaktor auf 0, um zu verhindern, dass der Vogel nach der Wiederauferstehung zu schnell fällt. this.scoreNode.getComponent(cc.Label).string = "" + this.num;//Ändern Sie den String-Wert des Score-Knotens auf 0. this.scoreNode.getComponent(cc.Label).string
        let list = this.pipeNode.children; //Verwenden Sie eine Liste, um die untergeordneten Knoten des Metallrohrs (.children) zu speichern
        for (let i = 0; i < list.length; i++) { //Erstelle eine Schleife, die Abbruchbedingung ist, dass i kürzer als die Länge der Liste ist let child = list[i]; //let eine untergeordnete Variable wird verwendet, um jedes list[i] in der Schleife zu speichern
            child.x += 1000; //Verschiebe das x des Pipeline-Knotens um 1000 nach rechts
        }
        cc.audioEngine.playMusic(diesen.clip[0], true);
    },
    onClickBagButton(event, data) { //Rucksack-Button-Methode definieren// cc.log(event, data);
        if (data == "bag") {//Beurteilen Sie, ob der übergebene Parameter den CustomEventData eines Ereignisses entspricht
            this.showBag(); //Rufe die Funktion auf, um den Rucksack anzuzeigen}
    },
    showBag() { //Definiere die Funktion zum Anzeigen des Rucksacks if (this.bagPrefab == null) { //Wenn das Laden der Ressource nicht erfolgreich ist setTimeout(() => { //Lege eine Verzögerung von 0,5 Sekunden fest, bevor mit dem Aufrufen der Methode zum Anzeigen der Tasche fortgefahren wird this.showBag();
            }, 500);
            zurückkehren;
        }
        //Laden der Ressource abgeschlossen let node = null; //Definiere einen Knoten und weise ihn null zu if (this.isOpen) { //Beurteile, ob der Rucksack geöffnet ist, der Anfangswert von this.isOpen ist false
            Knoten = cc.find("Canvas/panelBag");
            Knoten.aktiv = wahr;
        }
        anders{
            node = cc.instantiate(this.bagPrefab); //Spezifische voreingestellte Ressourcen laden und dem Knoten zuweisen
            cc.find("Canvas").addChild(node); //Den Knoten zum Canvas-Bildschirm hinzufügen}
        node.opacity = 0; //Setzt die Transparenz des Knotens auf 0;
        node.scale = 0,1; //Setze den Anfangsmaßstab des Knotens auf 0,1;
        let ac = cc.spawn( //Parallele Animation einkapseln und ac zuweisen
            cc.fadeIn(0.5), // Einblenden mit einer Geschwindigkeit von 0,5 s cc.scaleTo(0.5,1), // Skalieren auf 1 mit einer Geschwindigkeit von 0,5 s
        );
        node.runAction(ac); //Verwende die Funktion runAction, um das gekapselte ac auszuführen
        this.isOpen = true; //Weisen Sie dem Rucksacköffnungsparameter den Wert true zu
    },
    gameOver() { //Setze die Methode zum Spielende this.sign = false; //Spiel vorbei, ändere die Spielfortsetzungskennung auf false
        this.checkStill = false; //Überprüfe, ob das Spiel läuft und der Parameter false wird
        this.buttonNode.active = true; //Game over, mach den Start-Button this.buttonNode sichtbar this.overNode.active = true; //Game over, mach den overNode-Knoten des "Game Over"-Textes sichtbar cc.audioEngine.stopMusic(this.clip[0]); //Game over, Hintergrundmusik stoppen},
    addScore() { //Setze die Bewertungsmethode this.numberNode.opacity = 255; //Setze das .opacity-Element (Transparenz) des Bewertungsknotens numberNode auf 255
        this.num++; //Num-Wert lassen++
        this.scoreNode.getComponent(cc.Label).string = "" + this.num; //Das String-Element des Score-Knotens = leerer String "" plus num
        this.numberNode.y = this.birdNode.y; //Lass das y des Bonus-Kombiknotens numberNode gleich dem y des Vogelknotens sein this.numberNode.runAction(//Lass den Bonus-Kombiknoten numberNode ein- und ausblenden runAction, spawn, fadeOut, moveBy
            cc.spawn(
                cc.fadeOut(0.5),
                cc.moveBy(0,5, cc.v2(0, 50))
            )
        )
        cc.audioEngine.playEffect(this.clip[2]); // Bonusmusik},

    // LEBENSZYKLUS-RÜCKRUFE:

    beim Laden() {
        // cc.director.getCollisionManager().enabled = true; //Öffnen Sie das Kollisionsmanagementsystem cc.director.getCollisionManager().
        this.bagPrefab = null; //Definiere die Variable bagPrefab und weise sie dem Wert null zu // cc.loader.loadRes(Pfad, Ressourcentyp, Rückruffunktion); Fehler Wenn ein Fehler auftritt, drucke die Fehlerinformationen, Daten sind die erfolgreich geladene Ressource cc.loader.loadRes("prefab/panelBag", cc.Prefab, (Fehler, Daten) => {
            if (error) {//Beurteilen, ob die Fehlermeldung nicht leer ist cc.log(error);//Fehlermeldung drucken return;         
            }
            this.bagPrefab = data; //Die geladenen Ressourcen this.bafPrefab zuweisen
        });
    },

    Start() {
        this.isOpen = false; //Definieren Sie, ob der Rucksack geöffnet ist und setzen Sie es auf false;
        this.num = 0; //Ändern Sie den Parameter num auf 0, um zu verhindern, dass der Punktestand beim erneuten Starten des Spiels den Punktestand des vorherigen Spiels übernimmt. this.scoreNode.getComponent(cc.Label).string = "" + 0; //Setzen Sie den anfänglichen Punktewert auf 0.
        this.speed = 5; //Stelle die relative Verschiebungsgeschwindigkeit auf 5 ein
        this.power = 0; //Setze den Leistungsparameter auf 0
        this.checkStill = true; //Überprüfen, ob das Spiel läuft und der Parameter true wird
        this.curFrame = 0; //Definiere eine Variable zum Durchlaufen der Skinnode-Liste this.sign = false; //Definiere einen Bezeichner, um zu steuern, ob das Spiel gestartet wird. Der Anfangswert ist false.
        this.checkState = false; // false – Status ohne Kollisionserkennung true – Status der Kollisionserkennung this.up = 0; //
        this.clickLayerNode.on(cc.Node.EventType.TOUCH_START, () => {//Who.on(cc.Node.EventType type.Event, anonyme Methode ausführen() =>)
            this.power = 4; //Setzen Sie den anfänglichen Leistungsparameter direkt von 0 auf 4, um sicherzustellen, dass bei jedem Klicken auf den Vogel eine deutliche Erhöhung erfolgt. this.up++;
            cc.audioEngine.playEffect(diesen.clip[1]);
        })

        cc.audioEngine.playMusic(diesen.clip[0], true);
    },

    update(dt) {
        if (!this.sign) {//Setzen Sie die Kennung, um das Spiel anzuhalten return;
        }
        cc.log(2);
        this.skyNode.x -= this.speed;//Steuern Sie die Bewegung des Hintergrunds, indem Sie den x-Wert des Himmelsknotens steuernthis.birdNode.y += this.power + this.up;//Steuern Sie die Geschwindigkeit des freien Falls des Vogels durch den y-Wert des Vogelknotens und den anfänglichen Leistungsparameterthis.power -= 0,2;//Lassen Sie den Vogel sich sanft bewegen, indem Sie den Leistungswert schrittweise mit kleiner Amplitude ändernthis.birdNode.angle = this.speed * this.power;//Steuern Sie den Winkel des Auf- und Abstiegs des Vogels durch die Leistungs- und Geschwindigkeitsparameterif (this.skyNode.x < -1200) {//Beurteilen Sie, wann der Hintergrund und der Startpunkt 1200 Pixel voneinander entfernt sind, und setzen Sie den Hintergrundknoten skyNode.x auf 0 zurück (Endlosschleifenhintergrund)
            dies.skyNode.x = 0;
        }
        //node.children ist der untergeordnete Knoten des Rohrknotens let list = this.pipeNode.children; //Verwenden Sie eine Liste, um die untergeordneten Knoten des Metallrohrs (.children) zu speichern
        let checkNode = null; //Definieren Sie die Check-Pipeline-Knotenvariable und weisen Sie sie dem Wert null zu.
        for (let i = 0; i < list.length; i++) {//Verwenden Sie eine Schleife, um allen Pipeline-Knoten Werte und Geschwindigkeiten zuzuweisen let child = list[i];//Lassen Sie eine untergeordnete Variable jedes Element in der Liste speichern child.x -= this.speed;//Steuern Sie das x-=this.speed des Pipeline-Knotens
            // cc.log(Kind);
            wenn (Kind.x < -600) {
                child.x = 600; //Wenn das Kind außerhalb der Grenzen < -600 liegt, bringe das Kind auf 600 zurück.
                child.y = (Math.random() - 0,5) * 200; //Verwende die Funktion Math.random() (der Wert liegt zwischen 0 und 1), um das zufällige Auftreten der Pipeline durch den Port zu steuern. Der Easing-Wert beträgt 200.
            }
            let dis = Math.abs(this.birdNode.x - child.x) // let, eine Variable dis wird verwendet, um die Differenz zwischen dem x des Vogels und dem des Rohrs zu berechnen (Math.abs nimmt den Absolutwert)
            let width = (this.birdNode.width + child.children[0].width) / 2; //Definiere die Breitenvariable, um den kritischen Wert der Kollision zwischen dem Vogel und dem Rohr zu speichern if (dis < width) { //Wenn dis <= width, weise der Knotenvariable „check pipe“ den Wert child zu
                checkNode = Kind;
            }
        }
        if(this.birdNode.y + this.birdNode.height / 2 > cc.winSize.height / 2 //Beurteilen Sie, ob der Kopf des Vogels größer als die obere Bildschirmkante oder die Unterseite des Vogels kleiner als die untere Bildschirmkante ist|| this.birdNode.y - this.birdNode.height / 2 < -cc.winSize.height / 2){
                this.gameOver(); //Führe die Methode zum Beenden des Spiels aus}
        if(checkNode) {//Beurteile checkNode direkt. Wenn ihm kein Wert zugewiesen ist, ist er leer. this.checkState = true;//Der Status wechselt von nichts zu etwas und der Prüfstatusvariable checkState wird true zugewiesen.
            // Überprüfen Sie, ob die obere Grenze des rechteckigen Vogels (.y + height / 2) größer oder gleich der oberen Grenze des Kanals (checkNode.y + 100) ist oder die untere Grenze des Vogels kleiner oder gleich dem Kanal ist, wenn (this.birdNode.y + this.birdNode.height / 2 > checkNode.y + 100
                || dieser.birdNode.y - dieser.birdNode.height / 2 < checkNode.y) {
                this.gameOver(); //Spiel vorbei}
        }anders{
            if (this.checkState && this.checkStill) {//Beurteilen, ob die Variable „Status prüfen“ und die Variable „Überprüfen, ob das Spiel läuft“ beide wahr sind (&&)
                this.addScore(); //Rufen Sie die Funktion zum Hinzufügen von Punkten auf}
            this.checkStill = true; //Überprüft, ob das Spiel die Variable true zugewiesen hat
            this.checkState = false; // Weisen Sie der Check-State-Variable den Wert false zu.
            dies.oben = 0;
        }
        this.curFrame++; //Erhöhe die Bildratenvariable des Vogels if (this.curFrame > 2) { //Wenn die Bildratenvariable größer als 2 ist, ändere die Bildratenvariable auf 0;
            dies.aktuellerFrame = 0;
        }
        if (this.birdNode.y) { //Wenn der Stärkeparameter größer als 0 ist
            //Lassen Sie den SpriteFrame-Parameter der Sprite-Komponente des Vogelknotens mit dem Framerate-Parameter this.birdNode.getComponent(cc.Sprite).spriteFrame = this.spriteFrame[this.curFrame] ändern;
        }
    }
})

Zusammenfassen

Die oben beschriebene Erkennung, ob der Vogel und das Stahlrohr kollidieren, wird durch mathematische Berechnungsmethoden erreicht. Meine Projektdatei enthält jedoch immer noch die Version mit der Cocos-Kollisionskomponente, die sich in der BoxCollider-Komponente auf jedem Pipe-Knoten, Eingangsknoten und in bird.js manifestiert. Es gibt auch einen Rucksack, den ich zu machen gelernt habe. Er verwendet hauptsächlich den voreingestellten Knoten (cc.prefab), um das Rucksackfenster zu realisieren und Requisitenbilder (Sprite) dynamisch in das Fenster zu laden. Ich bin noch in der Lernphase. Wenn Sie Fragen haben, können Sie diese gerne im Kommentarbereich diskutieren. Ich werde später einige andere Projekte mitteilen! Einschließlich Vergleichsprojekten zwischen Standalone- und LAN-Online-Versionen; es können auch einige Optimierungsstrategien verwendet werden, wie z. B.: Ressourcenmanager, Netzwerkkommunikationsmanager, Signalsteckplatz usw. Ich hoffe, Sie können mir etwaige Mängel verzeihen.

Oben sind die Details von Flappybird, einem klassischen Einsteigerprojekt von CocosCreator. Weitere Informationen zum Erstellen von Flappybird mit CocosCreator finden Sie in den anderen verwandten Artikeln auf 123WORDPRESS.COM!

Das könnte Sie auch interessieren:
  • Detaillierte Erklärung des Cocoscreater-Prefabs
  • So verwenden Sie residente Knoten für die Ebenenverwaltung in CocosCreator
  • So verwenden Sie CocosCreator zur Tonverarbeitung bei der Spieleentwicklung
  • CocosCreator ScrollView-Optimierungsreihe: Frame-Laden
  • Detaillierte Erläuterung des CocosCreator-Projektstrukturmechanismus
  • So verwenden Sie den CocosCreator-Objektpool
  • So zeigen Sie in CocosCreator eine Textur an der Wischposition an
  • Organisieren Sie die allgemeinen Wissenspunkte von CocosCreator
  • Umfassende Erklärung zum CocosCreator Hot Update
  • CocosCreator Universal Framework Design Network
  • So verwenden Sie CocosCreator zum Erstellen eines Schießspiels
  • So verwenden Sie einen Gamecontroller in CocosCreator

<<:  Installieren Sie MySQL offline mit RPM unter CentOS 6.4

>>:  CentOS-Methode zum Ändern der Standard-SSH-Portnummer – Beispiel

Artikel empfehlen

Codebeispiel für die Verwendung der MySql COALESCE-Funktion

COALESCE ist eine Funktion, die sich nacheinander...

Eine kurze Diskussion über React Native APP-Updates

Inhaltsverzeichnis App-Update-Prozess Grobes Flus...

So verwenden Sie Nginx zur Simulation einer Blue-Green-Bereitstellung

Dieser Artikel stellt die Blue-Green-Bereitstellu...

So erstellen Sie Ihre eigene Angular-Komponentenbibliothek mit DevUI

Inhaltsverzeichnis Vorwort Erstellen einer Kompon...

Detailliertes Tutorial zum Ersetzen von mysql8.0.17 in Windows 10

In diesem Artikel werden die spezifischen Schritt...

Neue Funktionen in MySQL 8.0: Hash Join

Das MySQL-Entwicklungsteam hat am 14. Oktober 201...

Probleme und Erfahrungen bei der Webentwicklung

<br />Nachfolgend sind die Probleme aufgefüh...