CocosCreator-Tutorial für den Einstieg: Erstellen Sie Ihr erstes Spiel mit TS

CocosCreator-Tutorial für den Einstieg: Erstellen Sie Ihr erstes Spiel mit TS

Prämisse

Unabhängig davon, welche technischen Kenntnisse Sie sich aneignen, sollte die offizielle Dokumentation Ihr erstes Tutorial sein. Lesen Sie daher bitte zumindest den Abschnitt „Erste Schritte“ http://docs.cocos.com/creator/manual/zh/getting-started/, bevor Sie diesen Artikel lesen.

Hier wird davon ausgegangen, dass Sie Cocos Creator erfolgreich installiert haben.

TypeScript vs. JavaScript

Natürlich gehe ich hier nur auf die Vorteile ein:
1. ts ist eine Obermenge von js und ts unterstützt die gesamte js-Syntax.
2. ts unterstützt nahezu perfekte Codehinweise, während js fast keine Codehinweise unterstützt.
3. ts hat Typdefinitionen, die viele bedeutungslose Fehler während der Kompilierung vermeiden können.
4. ts kann refaktorisiert werden und ist für große Projekte geeignet.
5. ts kann die gesamte neue Syntax wie es6 async verwenden. Allerdings unterstützt js Cocos Creator es6 noch nicht vollständig.
6. Der wichtigste Punkt: Alle meine zukünftigen Tutorials werden in ts geschrieben. Wenn Sie ts nicht verwenden, verlieren Sie mich für immer .

Auswahl des Code-Editors

Hier sind nur zwei Empfehlungen:

  1. Visual Studio Code
  2. WebStorm

Die Vorteile von VS Code liegen in seiner Schnelligkeit und der guten Integration mit Cocos Creator. Für einige Funktionen müssen Sie jedoch selbst Plug-Ins installieren.

Der Vorteil von Webstorm ist, dass alle gewünschten Funktionen eingebaut sind. Der Nachteil ist, dass es Speicher beansprucht und ich persönlich finde es ein bisschen hässlich.

Ich selbst verwende WebStorm bei der Arbeit und VS Code zu Hause.

Wenn Sie immer noch nicht wissen, welches Sie verwenden sollen, kann ich Ihnen nur empfehlen, zuerst VS Code zu verwenden, da der folgende Inhalt für VS Code ist.

Lernen Sie TypeScript

Da Sie ts zur Entwicklung von Spielen verwenden möchten, müssen Sie die Syntax von ts kennen. Es ist mir unmöglich, die gesamte Syntax von ts in diesem Artikel zu erklären, also https://www.tslang.cn/docs/home.html. Natürlich müssen Sie nicht alles auf einmal lesen. Sie können zuerst einen Blick darauf werfen und es dann noch einmal durchgehen, wenn Sie auf Probleme stoßen.

TypeScript-Umgebungskonfiguration

Öffnen Sie ein beliebiges Projekt und klicken Sie auf alle davon.

Die Konsole gibt aus

Öffnen Sie den Editor und Sie finden ein Skript namens creator.d.ts

Alle Eingabeaufforderungen des Erstellers basieren auf diesem Skript, und die API-Änderungen der Engine müssen dieses Skript auch rechtzeitig aktualisieren. Daher müssen Sie bei jeder Aktualisierung der Engine oben auf „VS Code aktualisieren kann nur Daten auffordern“ klicken, um creator.d.ts neu zu generieren.

Klicken Sie mit der rechten Maustaste in den Ressourcenmanager, um ein neues TS-Skript zu erstellen. Wenn Sie es öffnen, werden Sie viele nutzlose Dinge finden und es wird auch ein prompter Fehler (1.81) angezeigt. . .

// - [Englisch] http://www.cocos2d-x.org/docs/editors_and_tools/creator-chapters/scripting/typescript/index.html
// Attribut lernen:
// - [Chinesisch] http://www.cocos.com/docs/creator/scripting/reference/attributes.html
// - [Englisch] http://www.cocos2d-x.org/docs/editors_and_tools/creator-chapters/scripting/reference/attributes/index.html
// Erfahren Sie mehr über Lebenszyklus-Rückrufe:
// - [Chinesisch] http://www.cocos.com/docs/creator/scripting/life-cycle-callbacks.html
// - [Englisch] http://www.cocos2d-x.org/docs/editors_and_tools/creator-chapters/scripting/life-cycle-callbacks/index.html

const {ccclass, Eigenschaft} = cc._decorator;

@ccklasse
exportiere Standardklasse NewClass erweitert cc.Component {

    @Eigenschaft(cc.Label)
    Bezeichnung: cc.Label = null;

    @Eigentum
    Text: Zeichenfolge = „Hallo“;

    // LEBENSZYKLUS-RÜCKRUFE:

    // beim Laden () {},

    Start () {

    },

    // aktualisieren (dt) {},
}

Klicken Sie oben rechts im Editor auf „Programminstallationspfad öffnen“.

statisch-》Vorlage-》neues-Skript.ts
Dieses Skript ist der Standardstil des neuen TS-Skripts. Lassen Sie es uns noch einmal bearbeiten. Das bearbeitete Skript lautet wie folgt

const {ccclass, Eigenschaft} = cc._decorator;

@ccklasse
Exportklasse NewClass erweitert cc.Component {

}

Erstellen Sie ein neues TS-Skript und Sie werden feststellen, dass es genauso aussieht wie das Standardskript, das Sie gerade bearbeitet haben.

Konfigurieren Sie Ihre eigene Deklarationsdatei

Dateien mit der Endung d.ts werden als Deklarationsdateien erkannt. creator.d.ts ist die Deklarationsdatei der Engine. Wir können auch unsere eigenen Deklarationsdateien definieren. Es ist zu beachten, dass die Deklarationsdatei außerhalb der Assets-Datei abgelegt werden sollte, da die Skripte in der Assets-Datei von der Engine kompiliert werden und der Zweck der Deklarationsdatei darin besteht, beim Schreiben von Code darauf hinzuweisen. Nach der Kompilierung wird sie nicht mehr benötigt.

Fügen Sie beispielsweise eine global.d.ts-Datei zum Stammverzeichnis des Projekts hinzu

Anschließend kann das Skript im Projekt die entsprechende Eingabeaufforderung erhalten

Weitere Typdefinitionen finden Sie unter https://www.tslang.cn/docs/handbook/declaration-files/introduction.html

Attributtypdeklaration

const LEVEL = cc.Enum({EASY:1,HARD:2});

@ccklasse
Exportklasse Game erweitert cc.Component {
    // Ganzzahl @Eigenschaft (cc.Integer)
    intVar: Zahl = 0;
    // Gleitkommatyp @property(cc.Float)
    FloatVar: Zahl = 0;
    // Boolesche @Eigenschaft (cc.Boolean)
    boolVar: boolean = false;
    // Knoten@Eigenschaft(cc.Node)
    KnotenVar: cc.Node = null;
    // Knoten-Array @property([cc.Node])
    nodeArrVar: Array<cc.Node> = [];
    // Etikett
    @Eigenschaft(cc.Label)
    Bezeichnungsvariable: cc.Label = null;
    // Fertighaus @property(cc.Prefab)
    prefabVar: cc.Prefab = null;
    //Punkt @property(cc.Vec2)
    vec2Var: cc.Vec2 = cc.v2();
    // Benutzerdefinierter Knoten @property(Player)
    SpielerVar:Player = null;
    // Hier kommt der Punkt, benutzerdefinierte Aufzählung/**
     * Globale Variablen* const LEVEL = cc.Enum({EASY:1,HARD:2});
     */ 
    @Eigentum({
        Typ: Ebene
    })
    enumVa = LEVEL.EINFACH;
}

Ein Spiel in TypeScript schreiben

Lassen Sie uns abschließend die Sanftheit und Geschmeidigkeit von TypeScript erleben.

Wählen Sie ein bekanntes Spiel aus, über das Sie schreiben möchten. In der offiziellen Dokumentation gibt es ein Spiel zum Auswählen von Sternen. Schreiben wir es mit Ts neu.

Schritt 1: Neues Projekt erstellen

Schritt 2: Schreiben Sie ein paar Skripte

Spiel.ts

importiere { Player } aus "./Player";

const { Eigenschaft, ccclass } = cc._decorator;

@ccklasse
Exportklasse Game erweitert cc.Component {
    // Diese Eigenschaft verweist auf die Prefab-Ressource des Sterns @property(cc.Prefab)
    privates StarPrefab: cc.Prefab = null;
    // Zufälliger Zeitraum, in dem Sterne nach ihrer Generierung verschwinden @property(cc.Integer)
    private maxStarDuration = 0;
    @Eigenschaft(cc.Integer)
    private minStarDuration = 0
    // Bodenknoten, der verwendet wird, um die Höhe der Sternerzeugung zu bestimmen @property(cc.Node)
    privater GroundNode: cc.Node = null;
    // Spielerknoten, der verwendet wird, um die Sprunghöhe des Protagonisten zu ermitteln und den Aktionsschalter des Protagonisten zu steuern @property(cc.Node)
    öffentlicher Spielerknoten: cc.Node = null;
    // Verweis auf Score-Label @property(cc.Label)
    privates ScoreLabel: cc.Label = null;
    // Ressource für die Vertonung von Soundeffekten @property(cc.AudioClip)
    privates ScoreAudio: cc.AudioClip = null;

    // Y-Achsenkoordinate des Bodenknotens private groundY: Zahl;
    //Timeröffentlicher Timer: Zahl;
    // Dauer der Existenz eines Sterns public starDuration: number;
    // Aktueller Spielstand private score: number;

    geschützt beim Laden() {
        // Holen Sie sich die Y-Achsenkoordinate der Bodenebene this.groundY = this.groundNode.y + this.groundNode.height / 2;
        // Timer initialisieren this.timer = 0;
        this.starDuration = 0;
        // Einen neuen Stern generieren this.spawnNewStar();
        // Wertung initialisieren this.score = 0;
    }

    // Einen neuen Stern generieren public spawnNewStar() {
        //Erstellen Sie mit der angegebenen Vorlage einen neuen Knoten in der Szene. let newStar = cc.instantiate(this.starPrefab);
        // Den neu hinzugefügten Knoten zum Canvas-Knoten hinzufügen this.node.addChild(newStar);
        // Eine zufällige Position für den Stern festlegen newStar.setPosition(this.getNewStarPosition());
        // Übergebe die Instanz der Spielkomponente an die Sternkomponente newStar.getComponent('Star').init(this);
        // Timer zurücksetzen this.starDuration = this.minStarDuration + cc.random0To1() * (this.maxStarDuration - this.minStarDuration);
        dieser.timer = 0;
    }

    // Die Position des neuen Sterns public getNewStarPosition() {
        sei randX = 0;
        // Holen Sie sich zufällig die Y-Koordinate eines Sterns basierend auf der Position der Bodenebene und der Sprunghöhe des Protagonisten. let randY = this.groundY + cc.random0To1() * this.playerNode.getComponent('Player').jumpHeight + 50;
        // Die x-Koordinate eines Sterns zufällig basierend auf der Bildschirmbreite abrufen let maxX = this.node.width / 2;
        randX = cc.randomMinus1To1() * maxX;
        //Gib die Sternkoordinaten zurück return cc.p(randX, randY);
    }

    // wird bei jedem Frame aufgerufen
    geschütztes Update(dt: Zahl) {
        // Aktualisiere den Timer bei jedem Frame. Wenn das Limit überschritten wird und keine neuen Sterne generiert werden, wird die Spielfehlerlogik aufgerufen, wenn (this.timer > this.starDuration) {
            dies.gameOver();
            zurückkehren;
        }
        dieser.timer += dt;
    }

    // Punktzahl public gainScore() {
        dieser.score += 1;
        // Text des ScoreDisplay-Labels aktualisieren this.scoreLabel.string = 'Score: ' + this.score.toString();
        // Den Soundeffekt der Partitur abspielen // Wenn Sie nicht as any hinzufügen, erhalten Sie eine Fehlermeldung. Wenn Sie es nicht glauben, versuchen Sie cc.audioEngine.play(this.scoreAudio as any, false, 1);
    }

    //gg
    privates gameOver() {
        this.playerNode.stopAllActions(); //Stoppt die Sprungaktion des Spielerknotens cc.director.loadScene('game');
    }

}

Spieler.ts

const { ccclass, Eigenschaft } = cc._decorator;

@ccklasse
Exportklasse Player erweitert cc.Component {
    // Die Sprunghöhe des Protagonisten @property(cc.Integer)
    private Sprunghöhe: Zahl = 0;
    // Die Dauer des Sprunges des Protagonisten @property(cc.Integer)
    private Sprungdauer: Zahl = 0;
    // Maximale Bewegungsgeschwindigkeit @property(cc.Integer)
    private maxMoveSpeed: Zahl = 0;
    // Beschleunigung@Eigenschaft(cc.Integer)
    private Beschleunigung: Zahl = 0;
    // Ressource für Sprung-Soundeffekte @property(cc.AudioClip)
    privates JumpAudio: cc.AudioClip = null;

    privates xSpeed: Zahl = 0;
    privater accLeft: boolean = false;
    privates accRight: boolean = false;
    private Sprungaktion: cc.Action = null;

    private setJumpAction() {
        // Nach oben springen let jumpUp = cc.moveBy(this.jumpDuration, cc.p(0, this.jumpHeight)).easing(cc.easeCubicActionOut());
        // Fallen lassen Sie jumpDown = cc.moveBy(this.jumpDuration, cc.p(0, -this.jumpHeight)).easing(cc.easeCubicActionIn());
        // Fügen Sie eine Rückruffunktion hinzu, um andere Methoden aufzurufen, die wir definiert haben, wenn die Aktion endet. let callback = cc.callFunc(this.playJumpSound, this);
        // Fortlaufend wiederholen und den Rückruf aufrufen, um den Ton jedes Mal abzuspielen, wenn die Landeaktion abgeschlossen ist. return cc.repeatForever(cc.sequence(jumpUp, jumpDown, callback));
    }

    private playJumpSound() {
        //Rufen Sie die Sound-Engine auf, um den Ton abzuspielen cc.audioEngine.play(this.jumpAudio as any, false, 1);
    }

    private addEventListeners() {
        cc.systemEvent.on(cc.SystemEvent.EventType.KEY_DOWN, dies.onKeyDown, dies);
        cc.systemEvent.on(cc.SystemEvent.EventType.KEY_UP, dies.onKeyUp, dies);
        cc.find("Canvas").on(cc.Node.EventType.TOUCH_START, dies.onScreenTouchStart, dies);
        cc.find("Canvas").on(cc.Node.EventType.TOUCH_CANCEL, dies.onScreenTouchEnd, dies);
        cc.find("Canvas").on(cc.Node.EventType.TOUCH_END, dies.onScreenTouchEnd, dies);
    }

    private moveLeft() {
        dies.accLeft = wahr;
        dies.accRight = falsch;
    }

    private moveRight() {
        dies.accLeft = falsch;
        dies.accRight = wahr;
    }

    private stopMove() {
        dies.accLeft = falsch;
        dies.accRight = falsch;
    }

    private onScreenTouchStart(Ereignis: cc.Event.EventTouch) {
        wenn (event.getLocationX() > cc.winSize.width/2) {
            dies.nachRechts verschieben();
        } anders {
            dies.moveLeft();
        }
    }

    private onScreenTouchEnd() {
        dies.stopMove();
    }

    private onKeyDown(Ereignis: cc.Event.EventKeyboard) {
        Schalter ((Ereignis als beliebig).Schlüsselcode) {
            Fall cc.KEY.a:
            Fall cc.KEY.links:
                dies.moveLeft();
                brechen;
            Fall cc.KEY.d:
            Fall cc.KEY.rechts:
                dies.nachRechts verschieben();
                brechen;
        }
    }

    private onKeyUp(Ereignis: cc.Event.EventKeyboard) {
        Schalter ((Ereignis als beliebig).Schlüsselcode) {
            Fall cc.KEY.a:
            Fall cc.KEY.links:
                dies.stopMove();
                brechen;
            Fall cc.KEY.d:
            Fall cc.KEY.rechts:
                dies.stopMove();
                brechen;
        }
    }

    //verwende dies zur Initialisierung
    geschützt beim Laden() {
        // Initialisieren Sie die Sprungaktion this.jumpAction = this.setJumpAction();
        dies.node.runAction(diese.jumpAction);

        // Beschleunigungsrichtungsschalter this.accLeft = false;
        dies.accRight = falsch;
        // Die aktuelle horizontale Geschwindigkeit des Protagonisten this.xSpeed ​​​​= 0;

        // Initialisiere die abhörende Eingabe this.addEventListeners();
    }

    // wird bei jedem Frame aufgerufen
    geschütztes Update(dt: Zahl) {
        // Aktualisiere die Geschwindigkeit bei jedem Frame entsprechend der aktuellen Beschleunigungsrichtung if (this.accLeft) {
            dies.xSpeed ​​​​-= dies.accel * dt;
        } sonst wenn (dies.accRight) {
            dies.xSpeed ​​​​+= dies.accel * dt;
        }
        // Begrenzen Sie die Geschwindigkeit des Protagonisten, sodass sie den Maximalwert nicht überschreitet, wenn (Math.abs(this.xSpeed) > this.maxMoveSpeed) {
            // wenn die Geschwindigkeit den Grenzwert erreicht, verwende die Höchstgeschwindigkeit in der aktuellen Richtung
            dies.xSpeed ​​​​= dies.maxMoveSpeed ​​​​* dies.xSpeed ​​​​/ Math.abs(diese.xSpeed);
        }

        // Aktualisiere die Position des Protagonisten entsprechend der aktuellen Geschwindigkeit this.node.x += this.xSpeed ​​​​* dt;
        wenn (this.node.x <= -this.node.parent.width / 2) {
            dieser.Knoten.x = dieser.Knoten.übergeordnet.Breite / 2;
        }
        wenn (dieser.Knoten.x > dieser.Knoten.übergeordnete.Breite / 2) {
            dieser.Knoten.x = -this.node.parent.width / 2;
        }
    }

}

Star.ts

importiere { Spiel } aus "./Game";

const {ccclass,property} = cc._decorator;

@ccklasse
Exportklasse Star erweitert cc.Component {

    // Wenn der Abstand zwischen dem Star und dem Protagonisten diesen Wert erreicht, wird die Sammlung vervollständigt @property(cc.Integer)
    privater PickRadius: Zahl = 0;
    privates Spiel:Spiel = null;

    öffentliche init(Spiel:Spiel) {
        dieses.spiel = Spiel;
    }

    getPlayerDistance() {
        // Bestimme die Distanz basierend auf der Position des Spielerknotens let playerPos = this.game.playerNode.getPosition();
        // Berechnen Sie die Entfernung zwischen zwei Punkten basierend auf ihren Positionen. let dist = cc.pDistance(this.node.position, playerPos);
        Rückwegverteiler;
    }

    beiAusgewählt() {
        // Wenn ein Stern gesammelt wurde, rufen Sie die Schnittstelle im Spielskript auf, um einen neuen Stern zu generieren this.game.spawnNewStar();
        //Rufen Sie die Bewertungsmethode des Spielskripts auf: this.game.gainScore();
        // Dann zerstöre den aktuellen Sternknoten this.node.destroy();
    }

    // wird bei jedem Frame aufgerufen
    update(dt:Nummer) {
        // In jedem Frame wird bestimmt, ob die Distanz zwischen Spieler und Hauptfigur kleiner ist als die Sammlungsdistanz if (this.getPlayerDistance() < this.pickRadius) {
            //Rufen Sie das Sammlungsverhalten this.onPicked(); auf.
            zurückkehren;
        }
        // Aktualisiere die Transparenz des Sterns entsprechend dem Timer im Spielskript. let opacityRatio = 1 – this.game.timer/this.game.starDuration;
        sei minOpacity = 50;
        this.node.opacity = minOpacity + Math.floor(opacityRatio * (255 - minOpacity));
    }

}

Oben finden Sie den detaillierten Inhalt des CocosCreator-Einführungstutorials zum Erstellen Ihres ersten Spiels mit TS. Weitere Informationen zum Erstellen von Spielen mit CocosCreator TS finden Sie in den anderen verwandten Artikeln auf 123WORDPRESS.COM!

Das könnte Sie auch interessieren:
  • Unity3D realisiert die Bewegung des Kameraobjektivs und begrenzt den Winkel
  • Detaillierte Erklärung zur Verwendung mehrerer Timer in CocosCreator
  • CocosCreator - modulares Lernskript
  • So verwenden Sie Verbindungen der Physik-Engine in CocosCreator
  • So verwenden Sie die JSZip-Komprimierung in CocosCreator
  • Interpretation des CocosCreator-Quellcodes: Engine-Start und Hauptschleife
  • CocosCreator allgemeines Framework-Design Ressourcenmanagement
  • So erstellen Sie eine Liste in CocosCreator
  • So verwenden Sie http und WebSocket in CocosCreator
  • Analyse des neuen Ressourcenmanagementsystems von CocosCreator
  • So verwenden Sie cc.follow zur Kameraverfolgung in CocosCreator

<<:  Was sind die Verwendungszwecke von Limits in MySQL (empfohlen)

>>:  So erkennen Sie die Ubuntu-Version mithilfe der Befehlszeile

Artikel empfehlen

CSS-Float-Eigenschaftsdiagramm, Details der Float-Eigenschaft

Die korrekte Verwendung der CSS-Float-Eigenschaft...

Was bedeutet das n nach int(n) in MySQL?

Sie wissen vielleicht bereits, dass die Länge 1 v...

Schritte zum Ausführen von ASP.NET Core im Docker-Container

Es gibt in letzter Zeit zu viel Wissen zu lernen,...

Detaillierte Erklärung zur Verwendung von MySQL, wobei

Inhaltsverzeichnis 1. Einleitung 2. Haupttext 2.1...

Analyse der Nutzungsszenarien und Konfigurationsmethoden von Nginx Rewrite

Nginx Rewrite-Nutzungsszenarien 1. Sprung der URL...

Lösen Sie das Problem beim Laden der Vektorkartenquelle in OpenLayers 3

1. Vektorkarte Vektorgrafiken verwenden gerade Li...

Wo werden MySQL-Daten gespeichert?

Speicherort der MySQL-Datenbank: 1. Wenn MySQL di...

jQuery-Plugin zur Implementierung des Minesweeper-Spiels (2)

In diesem Artikel wird der zweite Artikel zur Ver...

MySQL NULL-Datenkonvertierungsmethode (unbedingt lesen)

Wenn Sie MySQL zum Abfragen der Datenbank verwend...

Standardmäßige Stilanordnung für HTML-Tags

html, address,blockquote,body, dd, div,dl, dt, fie...

So erstellen Sie Ihre erste React-Seite

Inhaltsverzeichnis Was ist Rract? Hintergrund Rea...

Perfekte Lösung für das Problem des CSS-Hintergrundbildpfads im Webpack

Innerhalb des Style-Tags der Vue-Komponente befin...

So leeren Sie den Cache nach der Verwendung von Keep-Alive in Vue

Was ist Keepalive? Bei der normalen Entwicklung m...