Herní překážky
Stisknutím tlačítek přesunete červený čtverec:
Přidejte nějaké překážky
Nyní chceme do naší hry přidat nějaké překážky.
Přidejte do herní oblasti novou součást. Udělejte to zelené, 10px na šířku, 200px na výšku a umístěte ho 300px doprava a 120px dolů.
Aktualizujte také překážkovou komponentu v každém snímku:
Příklad
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();
}
Hit The Obstacle = Game Over
Ve výše uvedeném příkladu se při nárazu na překážku nic nestane. Ve hře to není příliš uspokojivé.
Jak poznáme, že náš červený čtverec narazí na překážku?
Vytvořte novou metodu v konstruktoru komponenty, která zkontroluje, zda komponenta nepadne s jinou komponentou. Tato metoda by měla být volána pokaždé, když se snímky aktualizují, 50krát za sekundu.
Do objektu také přidejte stop()
metodu myGameArea
, která vymaže interval 20 milisekund.
Příklad
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();
}
}
Pohybující se překážka
Překážka nepředstavuje žádné nebezpečí, když je statická, takže chceme, aby se pohybovala.
Změňte hodnotu vlastnosti myObstacle.x
při každé aktualizaci:
Příklad
function updateGameArea() {
if (myGamePiece.crashWith(myObstacle)) {
myGameArea.stop();
} else {
myGameArea.clear();
myObstacle.x += -1;
myObstacle.update();
myGamePiece.newPos();
myGamePiece.update();
}
}
Více překážek
Co takhle přidat více překážek?
K tomu potřebujeme vlastnost pro počítání snímků a metodu pro provádění něčeho při dané snímkové frekvenci.
Příklad
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;
}
Funkce everyinterval vrátí hodnotu true, pokud aktuální číslo snímku odpovídá danému intervalu.
Chcete-li definovat více překážek, nejprve deklarujte proměnnou překážka jako pole.
Za druhé, musíme provést nějaké změny ve funkci updateGameArea.
Příklad
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();
}
Ve updateGameArea
funkci musíme projít každou překážkou, abychom zjistili, zda nedošlo k havárii. Pokud dojde k havárii, updateGameArea
funkce se zastaví a žádné další kreslení se neprovádí.
Funkce updateGameArea
počítá snímky a přidává překážku za každý 150. snímek.
Překážky náhodné velikosti
Aby byla hra o něco obtížnější a zábavnější, budeme do ní posílat překážky náhodných velikostí, takže červený čtverec se musí pohybovat nahoru a dolů, aby nespadl.
Příklad
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();
}