磁盘和垂直矩形之间的碰撞检测

时间:2014-01-28 11:17:32

标签: javascript jquery html5 canvas

这是我的jsfiddle:http://jsfiddle.net/whZ44/8/

我要做的是检测球何时击中一个支架的顶部边框。如果它确实比球的新坐标应该是支架的坐标,就像涂鸦跳跃游戏一样。但似乎我的碰撞检测功能不起作用

if (Collision(ball, std4)) {
                            console.log("collision");
                            ball.y = std2.x;
                        }

我正在使用的碰撞功能,我真的不知道它是否在我的条件下工作:

 function Collision(circle, rect) {
            var distX = Math.abs(circle.x - rect.x - rect.w / 2);
            var distY = Math.abs(circle.y - rect.y - rect.h / 2);

            if (distX > (rect.w / 2 + circle.r)) { return false; }
            if (distY > (rect.h / 2 + circle.r)) { return false; }

            if (distX <= (rect.w / 2)) { return true; }
            if (distY <= (rect.h / 2)) { return true; }

            var dx = distX - rect.w / 2;
            var dy = distY - rect.h / 2;
            return (dx * dx + dy * dy <= (circle.r * circle.r));
        }

2 个答案:

答案 0 :(得分:0)

如果您不太担心事后圈子会如何反应,那么您是否考虑过为圈子使用边界矩形?

这篇文章还讨论了圈子变通:

2d collision response between circles

这篇文章是对2d物理学的一个很好的解释:

http://devmag.org.za/2009/04/13/basic-collision-detection-in-2d-part-1/

答案 1 :(得分:0)

碰撞功能还可以,你刚才有一些变量名称错误:

 if (Collision(ball, std4)) {
                        console.log("collision");
                        ball.y = std2.x;
 }

 if (Collision(ball, std2)) {
                        console.log("collision");
                        ball.y = std2.y;
 }

演示:http://jsfiddle.net/whZ44/9/

为了进一步开发,您应该将所有障碍物存储在一个数组中,因为您必须检查所有障碍物,而不仅仅是一个。