Spiel-Hindernisse
- Vorherige Seite Spiel-Controller
- Nächste Seite Spiel-Score
按下按钮可移动红色方块:
添加一些障碍
现在我们想为游戏添加一些障碍。
将新组件添加到游戏区域。将其设为绿色,宽 10 像素,高 200 像素,然后将其放置在右侧 300 像素、向下 120 像素的位置。
还要更新每一帧中的障碍物组件:
Beispiel
var myGamePiece; var myObstacle; function startGame() { myGamePiece = new component(30, 30, "red", 10, 120); myObstacle = new component(10, 200, "green", 300, 120); myGameArea.start(); } function updateGameArea() { myGameArea.clear(); myObstacle.update(); myGamePiece.newPos(); myGamePiece.update(); }
Kollision = Spielende
Im obigen Beispiel passiert nichts, wenn Sie auf den Hindernis stoßen. Im Spiel ist das nicht zufriedenstellend.
Wie wissen wir, ob unser roter Block auf den Hindernis trifft?
In der Konstruktorfunktion des Komponentenobjekts wird eine neue Methode erstellt, um zu überprüfen, ob diese Komponente mit einer anderen Komponente kollidiert. Diese Methode sollte bei jedem Frame-Update aufgerufen werden, 50 Mal pro Sekunde.
müssen wir hinzufügen myGameArea
Objekt hinzufügen stop()
Methode, die einen 20-Millisekunden-Intervall löscht.
Beispiel
var myGameArea = { canvas : document.createElement("canvas"), start : function() { this.canvas.width = 480; this.canvas.height = 270; this.context = this.canvas.getContext("2d"); document.body.insertBefore(this.canvas, document.body.childNodes[0]); this.interval = setInterval(updateGameArea, 20); }, clear : function() { this.context.clearRect(0, 0, this.canvas.width, this.canvas.height); }, stop : function() { clearInterval(this.interval); } } function component(width, height, color, x, y) { this.width = width; this.height = height; this.speedX = 0; this.speedY = 0; this.x = x; this.y = y; this.update = function() { ctx = myGameArea.context; ctx.fillStyle = color; ctx.fillRect(this.x, this.y, this.width, this.height); } this.newPos = function() { this.x += this.speedX; this.y += this.speedY; } this.crashWith = function(otherobj) { var myleft = this.x; var myright = this.x + (this.width); var mytop = this.y; var mybottom = this.y + (this.height); var otherleft = otherobj.x; var otherright = otherobj.x + (otherobj.width); var othertop = otherobj.y; var otherbottom = otherobj.y + (otherobj.height); var crash = true; if ((mybottom < othertop) || (mytop > otherbottom) || (myright < otherleft) || (myleft > otherright)) { crash = false;} } return crash; } } function updateGameArea() { if (myGamePiece.crashWith(myObstacle)) { myGameArea.stop(); } else { myGameArea.clear(); myObstacle.update(); myGamePiece.newPos(); myGamePiece.update(); } }
Bewegung des Hindernisses
Ein Hindernis ist in Ruhe unschädlich, daher möchten wir, dass es sich bewegt.
wird bei jedem Update geändert myObstacle.x
Wert der Eigenschaft:
Beispiel
function updateGameArea() { if (myGamePiece.crashWith(myObstacle)) { myGameArea.stop(); } else { myGameArea.clear(); myObstacle.x += -1; myObstacle.update(); myGamePiece.newPos(); myGamePiece.update(); } }
Mehrfache Hindernisse
Wie wäre es mit mehreren Hindernissen?
Daher benötigen wir ein Attribut zur Berechnung der Bildfrequenz sowie eine Methode, um bestimmte Aktionen mit der angegebenen Bildrate auszuführen.
Beispiel
var myGameArea = { canvas : document.createElement("canvas"), start : function() { this.canvas.width = 480; this.canvas.height = 270; this.context = this.canvas.getContext("2d"); document.body.insertBefore(this.canvas, document.body.childNodes[0]); this.frameNo = 0; this.interval = setInterval(updateGameArea, 20); }, clear : function() { this.context.clearRect(0, 0, this.canvas.width, this.canvas.height); }, stop : function() { clearInterval(this.interval); } } function everyinterval(n) { if ((myGameArea.frameNo / n) % 1 == 0) {return true;} return false; }
Wenn die Nummer des aktuellen Frames mit der angegebenen Zeitspanne übereinstimmt, gibt die Funktion everyinterval true zurück.
Um mehrere Hindernisse zu definieren, erklären Sie das Hindernis-Variable als Array.
Zunächst müssen wir einige Änderungen an der Funktion updateGameArea vornehmen.
Beispiel
var myGamePiece; var myObstacles = []; function updateGameArea() { var x, y; for (i = 0; i < myObstacles.length; i += 1) { if (myGamePiece.crashWith(myObstacles[i])) { myGameArea.stop(); return; } } myGameArea.clear(); myGameArea.frameNo += 1; if (myGameArea.frameNo == 1 || everyinterval(150)) { x = myGameArea.canvas.width; y = myGameArea.canvas.height - 200 myObstacles.push(new component(10, 200, "green", x, y)); } for (i = 0; i < myObstacles.length; i += 1) { myObstacles[i].x += -1; myObstacles[i].update(); } myGamePiece.newPos(); myGamePiece.update(); }
In updateGameArea
In der Funktion müssen wir durch jedes Hindernis iterieren, um zu überprüfen, ob eine Kollision aufgetreten ist. Treten Kollisionen auf, wird die Funktion updateGameArea gestoppt und wird nicht mehr gezeichnet.
updateGameArea
Die Funktion zählt die Frames und fügt alle 150 Frames ein Hindernis hinzu.
Zufällige Hindernisgröße
Um die Schwierigkeit und das Vergnügen des Spiels zu erhöhen, senden wir zufällig große Hindernisse, damit der rote Quadrat auf- und abwärts bewegt werden muss, um Kollisionen zu vermeiden.
Beispiel
function updateGameArea() { var x, height, gap, minHeight, maxHeight, minGap, maxGap; for (i = 0; i < myObstacles.length; i += 1) { if (myGamePiece.crashWith(myObstacles[i])) { myGameArea.stop(); return; } } myGameArea.clear(); myGameArea.frameNo += 1; if (myGameArea.frameNo == 1 || everyinterval(150)) { x = myGameArea.canvas.width; minHeight = 20; maxHeight = 200; height = Math.floor(Math.random()*(maxHeight-minHeight+1)+minHeight); minGap = 50; maxGap = 200; gap = Math.floor(Math.random()*(maxGap-minGap+1)+minGap); myObstacles.push(new component(10, height, "green", x, 0)); myObstacles.push(new component(10, x - height - gap, "green", x, height + gap)); } for (i = 0; i < myObstacles.length; i += 1) { myObstacles[i].x += -1; myObstacles[i].update(); } myGamePiece.newPos(); myGamePiece.update(); }
- Vorherige Seite Spiel-Controller
- Nächste Seite Spiel-Score