SzeneneinstellungSpielressourcenTurmdrehungDer Mechanismus ist derselbe wie beim Auto in der vorherigen Handle-Instanz und verwendet Touchmove, um auf Berührungsereignisse zu warten.
beim Laden(){ //Auf 90 Grad initialisieren this.node.angle=90; dies.node.on('touchstart',dieses.onTouchStart,dieses); dies.node.on('touchmove',dies.onTouchMove,dies); dies.node.on('touchend',dieses.onTouchEnd,dieses); dies.node.on('touchconcel',dies.onTouchConcel,dies); } beiBerührenStart(e:cc.Event.EventTouch){ //Startposition abrufen this.starPos=this.node.parent.convertToNodeSpace(e.getLocation()); //Den Anfangswinkel der Mündung abrufen this.starAngle=this.node.angle; } beiBerührenEnde(e:cc.Event.EventTouch){ } beiBerührenBewegung(e:cc.Event.EventTouch){ // Aktuelle Position des Berührungspunkts abrufen let pos:cc.Vec2=this.node.parent.convertToNodeSpace(e.getLocation()); //Winkel ermitteln //Der Winkel ist im Uhrzeigersinn negativ und gegen den Uhrzeigersinn positiv let sweep_radian=pos.signAngle(this.starPos); //Der Winkel von pos relativ zu starPose p ist im Uhrzeigersinn relativ zu s positiv let sweep_angle=sweep_radian*180/Math.PI; //Winkel in Radiant umrechnen //Den Turm auf den endgültigen Winkel zeigen lassen let angle=this.starAngle-sweep_angle; //Begrenzen Sie den Winkel zwischen 45 und 135, wenn (Winkel < 45) Winkel = 45; wenn(Winkel>135)Winkel=135; cc.log("Mündungsschwung: "+sweep_angle+"Endgültige Winkelposition: "+angle); this.node.angle=Winkel; } Dynamisch generierte Aufzählungszeichen
beiBerührenEnde(e:cc.Event.EventTouch){ dies.feuer(); } beiBerührenConcel(e:cc.Event.EventTouch){ } Feuer(){ wenn(dieses.bulleteicon==null)zurückgeben; let bullet:cc.Node=neuer cc.Node(); let sprite:cc.Sprite=bullet.addComponent(cc.Sprite); sprite.spriteFrame=dieses.bulleteicon; //Am Knoten des Aufnahmesystems anbringen bullet.parent=this.node.parent; //Die relative Position des übergeordneten Knotens festlegen let ration=this.node.angle*Math.PI/180; sei Richtung = cc.v2 (Math.cos (Ration), Math.sin (Ration)); bullet.angle=dieser.Knoten.angle; sei r=100; bullet.setPosition(cc.v3(r*direction.x,r*direction.y,0)); //Zusätzliche Skriptkomponente let script=bullet.addComponent(Buletet); script.explodeImg=dieses.explodeImg; script.direction=Richtung; } Start () { dies.Zeitplan(dies.onTimer,0.01); } einTimer(){ wenn(this.node.y>300){ dies.aufheben(dies.aufTimer); dies.explodieren(); zurückkehren; } sei dx = diese.Richtung.x * 5; sei dy=diese.Richtung.y*5; dieser.Knoten.y+=dy; dieser.Knoten.x+=dx; } explodieren() lass sp:cc.Sprite=this.getComponent(cc.Sprite); sp.spriteFrame=dieses.explodeImg; //Aufzählungszeichen verkleinern this.node.scale=0.1; //Beschleunigungssystem für Explosionsanimationseffekte let self=this; cc.tween(dieser.Knoten) .bis(0,5,{Maßstab:1,Deckkraft:0}) .call(Funktion(){ selbst.nachExplode(); }) .Start(); } nachExplode(){ dies.node.destroy(); } Dieser Fehler:
KollisionsberechnungBerechnen Sie die relative Position der Kugel und des Ziels. Wenn sie kleiner als die Reichweite ist, wird das Ziel als getroffen beurteilt und der Treffervorgang wird ausgeführt. Andernfalls wird das Ziel als nicht getroffen beurteilt und der Nichttreffervorgang wird ausgeführt.
@Eigenschaft(cc.SpriteFrame) explodierenBild: cc.SpriteFrame = null; Richtung: cc.Vec2 = null; Ziel: cc.Node = null; beim Laden() { } Start() { dies.schedule(dieses.onTimer, 0,01); } einTimer() { wenn (this.node.y > 350) { wenn (this.isHit()) { //Explosionseffekt abspielen this.explode(); console.log("Triff das Ziel"); } anders { console.log("vom Ziel abgekommen"); dies.disMiss(); } dies.aufheben(dies.aufTimer); zurückkehren; } sei dx = diese.Richtung.x * 5; sei dy = diese.Richtung.y * 5; dieser.Knoten.y += dy; dieser.Knoten.x += dx; } //Beurteilen, ob es trifft isHit(): boolean { lass targetPos: cc.Vec2 = this.geWorldLocation(this.target); lass selfPos: cc.Vec2 = this.geWorldLocation(this.node); sei Abstand = Math.abs(ZielPos.x - SelbstPos.x); console.log("Ziel x=" + ZielPos.x + " , Aufzählungszeichen x=" + SelbstPos.x); wenn (Entfernung < 50) { gibt true zurück; } anders { gibt false zurück; } } explodieren() { let sp: cc.Sprite = this.getComponent(cc.Sprite); sp.spriteFrame = dies.explodeImg; //Aufzählungszeichen verkleinern this.node.scale = 0.1; // Beschleunigungssystem für Explosionsanimationseffekte let self = this; cc.tween(dieser.Knoten) .to(0,5, { Maßstab: 1, Deckkraft: 0 }) .call(Funktion () { selbst.disMiss(); }) .Start(); } geWorldLocation(Knoten: cc.Node): cc.Vec2 { let pos = node.getPosition(); //Beachten Sie, dass dies node.parent ist. Der Aufrufer der Methode sollte das Koordinatensystem des aktuellen Knotens sein. return node.parent.convertToWorldSpaceAR(pos); } zurückweisen() { dies.node.destroy(); } Dieser Fehler:
Erhöhen Sie die WirkungFügen Sie unter dem Zielknoten ein Skript hinzu, um die Bewegung zu steuern, sich nach links und rechts zu bewegen und einen Textaufforderungseffekt hinzuzufügen, wenn die Kugel trifft. Texttipps: jubeln() { //Einen Knoten erstellen und let node mounten: cc.Node = new cc.Node(); node.parent = this.node.parent; //Beide sind auf derselben Ebene, mit demselben übergeordneten Objekt let label: cc.Label = node.addComponent(cc.Label); label.string = "+10 Punkte"; //Position, Transparenz usw. festlegen node.setPosition(cc.v3(0, 250, 0)); Knoten. Opazität = 200; node.color = neue cc.Color(255, 0, 0); //Animation cc.tween(Knoten) .bis(0,5, { Maßstab: 1,5 }) .to(0.2, { Deckkraft: 0 }) .call(Funktion () { node.zerstören(); }) .Start(); } Zielbewegungupdate (dt) { sei Geschwindigkeit=3; wenn(dies.istLinks){ Geschwindigkeit=-Geschwindigkeit; } this.node.x+=Geschwindigkeit; wenn(dies.istLinks&&dieser.knoten.x<-350){ dies.isLeft=false; } wenn(!this.isLeft&&this.node.x>350){ dies.isLeft=true; } } Anzeige des Munitionsdepots hinzugefügt
@Eigenschaft(cc.SpriteFrame) Aufzählungszeichen: cc.SpriteFrame = null; Kapazität: Zahl = 10; Lagernummer: Zahl = 10; beim Laden() { lass Platz: Zahl = diese.Knotenbreite / diese.Kapazität; für (lass i = 0; i < diese.Kapazität; i++) { //Bild generieren let bulleteNode: cc.Node = new cc.Node(); let bulleteSprite: cc.Sprite = bulleteNode.addComponent(cc.Sprite); bulleteSprite.spriteFrame = dieses.bulleteIcon; dies.node.addChild(bulleteNode); //Position festlegen bulleteNode.x += space * i + 10; bulleteNode.y = 0; } } Start() { } verbrauchen(num: Zahl) { diese.stockNumber -= Zahl; wenn (diese.Bestandsnummer < 0) { diese.Bestandsnummer = 0; } dies.anzeige(); } Anzeige() { lass Knoten: cc.Node[] = this.node.children; Konsole.log(Knoten.Länge); für (lass i = 0; i < Knoten. Länge; i++) { wenn(i>=diese.Bestandsnummer){ Knoten[i].aktiv=false; } } } Gemeinsame öffentliche Klasse//Statische Klasse, globale Variable, definiere alle allgemeinen Variablen und Klassen in der allgemeinen Klasse static ammo:Ammo=null; beim Laden() { Common.ammo=cc.find('Leinwand/Munition').getComponent('Munition'); Konsole.log(Common.ammo); } Hier ist der Fehler:
Punktzahl für die Aufzählungserschöpfung
ResultDialog-Skript (steuert das Punkte-Eingabefeld)beim Laden () { let replay:cc.Node=cc.find('Canvas/Eingabeaufforderungsfeld beenden/ein anderes Spiel spielen'); Konsole.log(Wiedergabe); Wiederholung.auf('touchstart',dies.verwerfen,dies); dies.node.on('touchstart',dieses.onTouchdisable,dieses); dies.node.on('touchmove', dies.onTouchdisable, dies); dies.node.on('touchend', dies.onTouchdisable, dies); } //Eingabeaufforderungsfeld anzeigen show(){ dieser.Knoten.aktiv=wahr; lass scoreNode: cc.Node = cc.find('Ergebnisbox/Ergebnis', dieser.Knoten); Lassen Sie scoreLabel: cc.Label = scoreNode.getComponent(cc.Label); scoreLabel.string = Common.score + 'Punkte'; } //Das Eingabeaufforderungsfeld ausblenden exclude(){ dieser.Knoten.aktiv=falsch; } //Shield onTouchdisable wenn Maske angezeigt wird (e: cc.Event.EventTouch) { e.stopPropagation(); } Start () { } Allgemeine Skripte//Statische Klasse, globale Variable, definiere alle allgemeinen Variablen und Klassen in der allgemeinen Klasse static ammo:Ammo=null; statische Punktzahl: Zahl = 0; statischer Ergebnisdialog: Ergebnisdialog = null; beim Laden() { Common.resultdialog=cc.find('Leinwand/Eingabeaufforderungsfeld beenden').getComponent('ResultDialog'); Common.ammo=cc.find('Leinwand/Munition').getComponent('Munition'); } Erhöhen Sie die Punktzahl in der Bullete-Methode wenn (this.isHit()) { //Explosionseffekt abspielen this.explode(); //+10 Punkte anzeigen this.cheer(); //Gesamtpunktzahl +10 Gemeinsamer Score + = 10; console.log("Triff das Ziel"); } SpielneustartDieses Spiel ist relativ einfach. Um es neu zu starten, müssen Sie nur den Munitionsdepotknoten zurücksetzen. Daher wird die Reset-Methode im Ammo-Skript platziert. Erstellen Sie ein Ammo-Objekt in der öffentlichen Klasse, legen Sie eine statische Methode fest, setzen Sie den Punktestand zurück und rufen Sie die Reset-Methode von Ammo auf. Ammo (Munitionsdepot) Skript hinzugefügt zurücksetzen(){ diese.Bestandsnummer=diese.Kapazität; dies.anzeige(); } Ändern des allgemeinen Skripts//Statische Klasse, globale Variable, definiere alle allgemeinen Variablen und Klassen in der allgemeinen Klasse static ammo:Ammo=null; statische Punktzahl: Zahl = 0; statischer Ergebnisdialog: ResultDialog = null; beim Laden() { Common.resultdialog=cc.find('Leinwand/Eingabeaufforderungsfeld beenden').getComponent('ResultDialog'); Common.ammo=cc.find('Leinwand/Munition').getComponent('Munition'); Konsole.log(Common.ammo); } statisches ResetGame() { Gemeinsam.score=0; Common.ammo.reset(); } Fügen Sie einige Details hinzuSpielgeräusche und Änderungen an der Geschützturmaktivierung hinzugefügt1. Eigenschaften zum Turmskript hinzugefügt //Soundeffekt @property(cc.AudioClip) audioFire: cc.AudioClip = null; @Eigenschaft(cc.AudioClip) audioExplode: cc.AudioClip = null; //Turmbild @property(cc.SpriteFrame) SymbolNormal: cc.SpriteFrame = null; @Eigenschaft(cc.SpriteFrame) Symbol Aktiv: cc.SpriteFrame = null; BildschalteronTouchStart(e: cc.Event.EventTouch) {am Ende der Methode hinzufügen //Turmbild aktivieren this.node.getComponent(cc.Sprite).spriteFrame = this.iconActive; onTouchEnd(e: cc.Event.EventTouch) {Methode schließlich hinzugefügt //Bildwiederherstellung this.node.getComponent(cc.Sprite).spriteFrame = this.iconNormal; } Soundeffekt-Wiedergabefire(){ Nach der Methode hinzufügen //Senden Sie den Ton der Bullet-Explosion an das Bullet-Skript script.audioExplode = this.audioExplode; wenn (this.audioFire != null) { cc.audioEngine.play(this.audioFire, false, 1); } }
Bullet-Skript//Attribut hinzufügen @property(cc.SpriteFrame) explodierenBild: cc.SpriteFrame = null; Fügen Sie if(this.audioExplode!=null){ hinzu cc.audioEngine.play(dieses.audioExplode,false,1); } Oben finden Sie eine ausführliche Erklärung, wie Sie mit CocosCreator Schießspiele erstellen. Weitere Informationen zu CocosCreator-Schießspielen finden Sie in den anderen verwandten Artikeln auf 123WORDPRESS.COM! Das könnte Sie auch interessieren:
|
<<: Detaillierte Erklärung zur Verwendung des Grep-Befehls in Linux
>>: MySQL-Hochverfügbarkeitslösung MMM (MySQL Multi-Master-Replikationsmanager)
In diesem Artikelbeispiel wird der spezifische Im...
Verwandte Artikel: Anfänger lernen einige HTML-Ta...
Hintergrund Wenn Sie auf manchen Webseiten von Ei...
Wenn die Serverdaten nicht verschlüsselt und mit ...
1 Frage Der Server des Unternehmens verwendet Apa...
Wenn Sie Ihren Hostnamen ändern möchten, können S...
In diesem Artikelbeispiel wird der spezifische Co...
Senden von E-Mails mit der Mail-Funktion von PHP ...
Inhaltsverzeichnis 1. Einrichtung 1. Der erste Pa...
Beim dynamischen Verketten von Zeichenfolgen verw...
Vorwort Wenn CSS die Grundfertigkeit der Front-En...
DOKTYP Doctype wird verwendet, um dem Browser mit...
Ich bin kürzlich bei der Arbeit auf ein Problem g...
Aufgrund einiger seiner eigenen Merkmale (Sperren...
Bei der Autorisierung geht es darum, einem Benutz...