2D碰撞问题

时间:2011-03-21 23:14:13

标签: 2d collision-detection

我有以下代码:

function collisionDetect(left1,right1,top1,bottom1,left2,right2,top2,bottom2,dir)
    local left,right,top,bottom=false,false,false,false
    if left1<right2 then left=true end
    if right1>left2 then right=true end
    if top1>bottom2 then top=true end
    if bottom1<top2 then bottom=true end
    if dir.x>0 and (top or bottom) then
        if right then return 1 end
    elseif dir.x<0 and (top or bottom) then
        if left then return 2 end
    elseif dir.y>0 and (left or right) then
        if bottom then return 3 end
    elseif dir.y<0 and (left or right) then
        if top then return 4 end
    end
    return 0
end

left1,right1等是包含相应边界框位置的参数(方框1或2)。

dir是“Vector2”(包含x和y属性)。

出于某种原因,我的代码返回的对象没有附近的碰撞。有什么想法吗?

编辑:

我已经解决了我的问题,这是搜索主题的任何人的代码。

(这是Lua,一种非常简单易懂的语言)

function collisionDetect(left1,right1,top1,bottom1,left2,right2,top2,bottom2,dir)
    local insideHorizontal=false
    local insideVertical=false
    if left1<right2 then insideHorizontal=true end
    if right1>left2 then insideHorizontal=true end
    if top1>bottom2 then insideVertical=true end
    if bottom1<top2 then insideVertical=true end
    if insideHorizontal and insideVertical then
        return true
    end
    return false
end

1 个答案:

答案 0 :(得分:2)

查看this for a nice collision detection tutorial/algorithm

本质:

bool check_collision( SDL_Rect A, SDL_Rect B )
{
   //...
   //Work out sides
   //...

   //If any of the sides from A are outside of B
    if( bottomA <= topB )
    {
        return false;
    }

    if( topA >= bottomB )
    {
        return false;
    }

    if( rightA <= leftB )
    {
        return false;
    }

    if( leftA >= rightB )
    {
        return false;
    }

    //If none of the sides from A are outside B
    return true;
}

或者,就您的代码而言:

function collisionDetect(left1,right1,top1,bottom1,left2,right2,top2,bottom2,dir)
    if bottom1<=top2 then return true end
    if top1>=bottom2 then return true end
    if right1<=left2 then return true end
    if left1<=right2 then return true end
    return false
end

(这不是我所知的语言,所以我猜了一下)