Buduję grę w Javascript przy użyciu kanwy, która wymaga wykrycia kolizji, w tym przypadku, jeśli gracz sprite trafi w pudło, gracz nie może wejść przez to pole.Wykrywanie kolizji JavaScriptu na płótnie
Mam globalną tablicę o nazwie blockList
, która przechowuje wszystkie pola, które są rysowane na płótnie. Wygląda to tak:
var blockList = [[50, 400, 100, 100]];
A oni są rysowane na płótnie tak:
c.fillRect(blockList[0][0], blockList[0][1], blockList[0][2], blockList[0][3]);
Mam też przedmiot gracz, który posiada metodę aktualizacji oraz sposób rysowania. Aktualizacja ustala pozycję gracza na podstawie wejścia klawiatury itp., A rysowanie jest używane przez główną pętlę gry, aby narysować gracza na płótnie. Odtwarzacz jest przygotowywana tak:
this.draw = function(timestamp) {
if(this.state == "idle") {
c.drawImage(this.idleSprite, this.idleSprite.frameWidth * this.idleSprite.frameCount, 0, this.idleSprite.frameWidth, this.idleSprite.frameHeight, this.xpos, this.ypos, this.idleSprite.frameWidth, this.idleSprite.frameHeight);
if(timestamp - this.lastDraw > this.idleSprite.updateInterval) {
this.lastDraw = timestamp;
if(this.idleSprite.frameCount < this.idleSprite.frames - 1) { this.idleSprite.frameCount++; } else { this.idleSprite.frameCount = 0; }
}
} else if(this.state == "running") {
var height = 0;
if(this.facing == "left") { height = 37; }
c.drawImage(this.runningSprite, this.runningSprite.frameWidth * this.runningSprite.frameCount, height, this.runningSprite.frameWidth, this.runningSprite.frameHeight, this.xpos, this.ypos, this.runningSprite.frameWidth, this.runningSprite.frameHeight);
if(timestamp - this.lastDraw > this.runningSprite.updateInterval) {
this.lastDraw = timestamp;
if(this.runningSprite.frameCount < this.runningSprite.frames - 1) { this.runningSprite.frameCount++; } else { this.runningSprite.frameCount = 0; }
}
}
}
Teraz, gracz ma pewne właściwości, będące player.xpos
player.ypos
, player.width
, player.height
. Te same właściwości istnieją dla bloków. Więc mam wszystko, czego potrzebuję, aby wprowadzić wykrywanie kolizji, po prostu nie mam pojęcia, jak to zrobić. Próbowałem robić takie rzeczy jak:
if(player.x > blockList[0][0] && player.y > blockList[0][1])
, ale daleki od ideału lub grywalnej.
Czy ktoś zna prostą metodę lub funkcję, aby móc zwrócić wartość true lub false na podstawie tego, czy dwa obiekty kolidują ze sobą?