Ostacolo di gioco
- Pagina precedente Controllore di gioco
- Pagina successiva Punti di gioco
按下按钮可移动红色方块:
添加一些障碍
现在我们想为游戏添加一些障碍。
将新组件添加到游戏区域。将其设为绿色,宽 10 像素,高 200 像素,然后将其放置在右侧 300 像素、向下 120 像素的位置。
还需要更新每一帧中的障碍物组件:
esempio
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(); }
Colpire l'ostacolo = fine del gioco
Nell'esempio sopra, quando colpisci un ostacolo non succede nulla. Nel gioco, questo non è soddisfacentemente.
Come possiamo sapere se il nostro quadrato rosso ha colpito un ostacolo?
In costruttore del componente creare un nuovo metodo per controllare se il componente colpisce un altro componente. Questo metodo deve essere chiamato ogni frame update, 50 volte al secondo.
dovremmo aggiungere myGameArea
aggiunta dell'oggetto stop()
metodo, che rimuove l'intervallo di 20 millisecondi.
esempio
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(); } }
Muovi l'ostacolo
Gli ostacoli in stato statico non sono pericolosi, quindi vogliamo che si muovano.
cambia ogni volta che viene aggiornato myObstacle.x
valore dell'attributo:
esempio
function updateGameArea() { if (myGamePiece.crashWith(myObstacle)) { myGameArea.stop(); } else { myGameArea.clear(); myObstacle.x += -1; myObstacle.update(); myGamePiece.newPos(); myGamePiece.update(); } }
Ostacoli multipli
Aggiungere più ostacoli come?
Per questo, ci serve un attributo per calcolare il numero di frame e un metodo per eseguire alcune operazioni a una frequenza di frame data.
esempio
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; }
Se il numero di frame corrente corrisponde all'intervallo dato, la funzione everyinterval restituisce true.
Prima di tutto, per definire più ostacoli, dichiara la variabile degli ostacoli come un array.
Inoltre, dobbiamo apportare alcune modifiche alla funzione updateGameArea.
esempio
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
All'interno della funzione, dobbiamo iterare attraverso ogni ostacolo per verificare se è avvenuto un urto. Se è così, la funzione updateGameArea si fermerà e non verrà più disegnata.
updateGameArea
La funzione conta i fotogrammi e aggiunge un ostacolo ogni 150 fotogrammi.
Ostacoli di dimensioni casuali
Per aumentare la difficoltà e l'intrigo del gioco, invieremo ostacoli di dimensioni casuali in modo che il quadrato rosso debba muoversi verso l'alto e verso il basso per evitare di colpire.
esempio
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(); }
- Pagina precedente Controllore di gioco
- Pagina successiva Punti di gioco