Я создаю игру в Javascript, используя canvas, который требует обнаружения столкновений, в этом случае, если спрайт игрока попадает в поле, игрок не должен быть пропущен через поле.
У меня есть глобальный массив с именем blockList
, в котором хранятся все поля, отображаемые на холсте. Это выглядит так:
var blockList = [[50, 400, 100, 100]];
И они рисуются на холсте так:
c.fillRect(blockList[0][0], blockList[0][1], blockList[0][2], blockList[0][3]);
У меня также есть объект player, у которого есть метод update и метод draw. Обновление устанавливает положение игрока на основе ввода с клавиатуры и т. Д., А рисование используется основным игровым циклом для рисования игрока на холсте. Игрок рисуется так:
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; }
}
}
}
Теперь у игрока есть определенные свойства: player.xpos
, player.ypos
, player.width
, player.height
. Те же свойства существуют для блоков. Таким образом, у меня есть все, что мне нужно для обнаружения столкновений, я просто не знаю, как это сделать. Я пытался делать такие вещи, как:
if(player.x > blockList[0][0] && player.y > blockList[0][1])
но это далеко от идеального или играбельного.
Кто-нибудь знает простой метод или функцию, позволяющую возвращать истину или ложь в зависимости от столкновения двух объектов?