2D游戏碰撞响应

时间:2011-09-20 02:56:32

标签: vector physics trigonometry game-physics

所以我正在写一个游戏,但是我已经到了需要做一些碰撞响应的部分,而且我被困住了。我有一个算法可以找到物体的碰撞角度,碰撞深度意味着两个物体在一圈的重量。我明白我想做什么,那就是找到碰撞角度的垂直向量,并推回碰撞深度的碰撞对象,但我似乎无法正确写入。    这是我正在使用的代码。

var collision:Object = collisions[i];

    var angle:Number = collision.angle;

    var overlap:Number = collision.overlapping.length;

    trace(overlap);
    trace(angle);
    var moveX = Math.cos(angle) * overlap; 
    var moveY = Math.sin(angle) * overlap;

    obj2.x -= moveX;
    obj2.y += moveY;

基本上我只是希望与墙碰撞的物体在碰到它时停止。

任何帮助将不胜感激。

2 个答案:

答案 0 :(得分:0)

我曾经使用flash as3进行弹性碰撞。我试图修复重叠很多。但是我无法完全解决它们。它们没有正常重叠但是如果你强制使用它们会重叠。

如果你想查看我的作品,我上传了我的代码。你可以下载并查看我的代码。

如果你完全解决了这个问题,请告诉我解决方案。

swf(有摩擦,更问题):http://nafiz.in/collision/carpisma.swf

swf(没有摩擦,这比第一次没问题。):http://nafiz.in/collision/carpisma_surtunmesiz.swf

q:在鼠标位置添加一个球。 w,a,s,d:controll#1 ball。

单击鼠标而不重新移动并移动鼠标并重新启动。你选择了球。 按空格键时,选定的球将进入鼠标位置。

Cods:http://nafiz.in/collision/collision.rar

我希望你解决。

答案 1 :(得分:-1)

因此,经过几个小时的调整代码后,我想出了一个运行良好的解决方案。这是我的新代码:

public function Colisions(obj1,obj2) {
        var collisions:Array=MyCollision.checkCollisions();
        for (var i = 0; i  < collisions.length; i++) {
            var collision:Object=collisions[i];
            var angle:Number=collision.angle;
            var overlap:Number=collision.overlapping.length;
            // finds the amount in x and y coordinates to move the ball back, and it devides overlap by 20 so that the ball does not jump as much. 
            var moveX=Math.cos(angle)*(overlap/20);
            var moveY=Math.sin(angle)*(overlap/20);
            // sets the ball to it's original location before the colision.
            obj2.x=obj2.x-moveX;
            obj2.y=obj2.y-moveY;


        }
    }

作为附注,我正在使用CDK代表碰撞检测工具包作为查找碰撞和与碰撞相关的信息的算法。