EntwicklungsumgebungCocosCreator v2.3.1 Node.js v10.16.0 vscode 1.46.1 Game-Engine-KonzeptEs 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:
Über Cocos CreatorProjektstrukturProjektname (Projektordner) Beginnen wir mit dem eigentlichen Projekt Konfigurieren der CodebearbeitungsumgebungVisual 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-PluginDieser 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: Smart-Prompt-Daten im Projekt generierenWenn 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 Aktivieren Sie die Skriptkompilierung mit VS CodeNachdem 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 Projekt1. Erstellen Sie ein leeres Projekt2. RessourcenmanagerAnschließ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. SzenarioErstellen 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:
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 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. KnotenbindungDabei 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ückrufCocos 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:
Hauptcodespiel.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; } } }) ZusammenfassenDie 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:
|
<<: Installieren Sie MySQL offline mit RPM unter CentOS 6.4
>>: CentOS-Methode zum Ändern der Standard-SSH-Portnummer – Beispiel
COALESCE ist eine Funktion, die sich nacheinander...
Inhaltsverzeichnis App-Update-Prozess Grobes Flus...
Dieser Artikel stellt die Blue-Green-Bereitstellu...
Inhaltsverzeichnis Vorwort Erstellen einer Kompon...
Dieser Artikel beschreibt die langsame MySQL-Abfr...
Das Herunterladen dieser Datenbank nimmt viel Zei...
In diesem Artikel werden die spezifischen Schritt...
Inhaltsverzeichnis npm herunterladen Schritt (1) ...
Der Weg vor uns ist lang und beschwerlich, aber i...
Das MySQL-Entwicklungsteam hat am 14. Oktober 201...
Inhaltsverzeichnis TOKEN Timer-Aktualisierung 2. ...
In diesem Artikel wird hauptsächlich erläutert, w...
Jeder qualifizierte Linux-Betriebs- und Wartungsm...
<br />Nachfolgend sind die Probleme aufgefüh...
Dieser Artikel beschreibt die Installation des Sy...