Tôi đang tạo trò chơi bằng Javascript sử dụng canvas yêu cầu phát hiện va chạm, trong trường hợp này nếu trình phát của người chơi chạm vào một ô, người chơi không được phép thông qua hộp.Phát hiện va chạm canvas Javascript
Tôi có một mảng toàn cầu được gọi là blockList
chứa tất cả các hộp được vẽ vào canvas. Nó trông giống như thế này:
var blockList = [[50, 400, 100, 100]];
Và họ đang bị lôi kéo vào khung như thế này:
c.fillRect(blockList[0][0], blockList[0][1], blockList[0][2], blockList[0][3]);
Tôi cũng có một đối tượng người chơi, trong đó có một phương pháp cập nhật và một phương pháp bốc thăm. Cập nhật đặt vị trí của trình phát dựa trên đầu vào bàn phím v.v. và vẽ được sử dụng bởi vòng lặp trò chơi chính để vẽ trình phát đến canvas. Người chơi đang được rút ra như thế này:
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; }
}
}
}
Bây giờ, người chơi có tính chất nhất định là player.xpos
, player.ypos
, player.width
, player.height
. Các thuộc tính giống nhau tồn tại cho các khối. Vì vậy, tôi có tất cả mọi thứ tôi cần để cấy ghép phát hiện va chạm, tôi chỉ không có ý tưởng làm thế nào để làm điều đó. Tôi đã thử thực hiện những việc như:
if(player.x > blockList[0][0] && player.y > blockList[0][1])
nhưng không hoàn hảo hoặc có thể chơi được.
Có ai biết phương pháp hoặc chức năng đơn giản để có thể trả lại giá trị đúng hoặc sai dựa trên hai đối tượng có va chạm không?