我正在使用 JavaScript 构建一个简单的吃豆人游戏。该游戏的特色是吃豆人在迷宫中导航、收集点(点)并躲避幽灵。吃豆人使用箭头键移动,游戏会在收集点时更新分数。
我在实施碰撞检测时遇到困难:
const pacmanRect = pacman.getBoundingClientRect();
const dotRect = document.getElementById('dot1').getBoundingClientRect();
if (
pacmanRect.left < dotRect.right &&
pacmanRect.right > dotRect.left &&
pacmanRect.top < dotRect.bottom &&
pacmanRect.bottom > dotRect.top
) {
console.log('Dot collected!');
}
但是,这仅有时有效,并且当吃豆人快速移动时并不一致。
使用
setInterval
定期检查是否有碰撞。
减小边界框的大小以获得更好的准确性。
如果所有吃豆人都在点的右侧,则不能重叠。
这可以通过以下方式测试:pacmanRect.left > dotRect.right
同样,如果所有吃豆人都位于点的左侧、点的上方或点的下方,则不能有重叠。
因此,您想要测试它是在右侧还是在左侧或在上方还是在下方。
如果是,则不存在重叠。
const pacmanRect = pacman.getBoundingClientRect();
const dotRect = document.getElementById('dot1').getBoundingClientRect();
if !(
pacmanRect.left > dotRect.right ||
pacmanRect.right < dotRect.left ||
pacmanRect.top > dotRect.bottom ||
pacmanRect.bottom < dotRect.top
) {
console.log('Dot collected!');
}
为了让你的代码正常工作,pacman 必须小于点 然后准确地排列在它上面。
如果更改测试逻辑以确保 pacman 位于点的矩形之外, 然后否定比较,然后两个对象之间有任意数量的重叠 将被视为碰撞。
if (
!(pacmanRect.left > dotRect.right &&
pacmanRect.right < dotRect.left &&
pacmanRect.top > dotRect.bottom &&
pacmanRect.bottom < dotRect.top)
) {
console.log('Dot collected!');
}