Sto costruendo un gioco in Javascript usando la tela che richiede il rilevamento delle collisioni, in questo caso se il giocatore sprite colpisce una scatola, il giocatore non deve essere autorizzato a entrare nella scatola.Rilevazione collisione canvas JavaScript
Ho un array globale chiamato blockList
che contiene tutte le caselle che vengono disegnate nell'area di disegno. Ecco come si presenta:
var blockList = [[50, 400, 100, 100]];
e sono in fase di elaborazione sulla tela come questo:
c.fillRect(blockList[0][0], blockList[0][1], blockList[0][2], blockList[0][3]);
Ho anche un oggetto giocatore, che ha un metodo di aggiornamento e un metodo draw. L'aggiornamento imposta la posizione del giocatore in base all'input della tastiera, ecc. E draw viene utilizzato dal ciclo di gioco principale per disegnare il giocatore sulla tela. Il giocatore è in corso di elaborazione in questo modo:
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; }
}
}
}
Ora, il giocatore ha alcune proprietà che sono player.xpos
, player.ypos
, player.width
, player.height
. Le stesse proprietà esistono per i blocchi. Quindi ho tutto ciò di cui ho bisogno per impiantare il rilevamento delle collisioni, non ho proprio idea di come farlo. Ho provato a fare cose del tipo:
if(player.x > blockList[0][0] && player.y > blockList[0][1])
ma è tutt'altro che perfetto o giocabile.
Qualcuno sa di un semplice metodo o funzione per essere in grado di restituire vero o falso in base a se due oggetti sono in collisione?