首页 > 代码库 > 【COCOS2DX-游戏开发之三六】圆与未旋转矩形的碰撞检测(上篇)

【COCOS2DX-游戏开发之三六】圆与未旋转矩形的碰撞检测(上篇)

我们以cocos2dx lua脚本来说明,原理才是重点

检测圆和矩形碰撞,首先要找到矩形上离圆的中心点最近的点

if circle.x < box.x then
   cx = box.x
end

如果圆在矩形的左边,离着圆中心点最近的矩形上的点在矩形的左边边界上

elseif circle.x > box.x + box.width then
   cx = box.x + box.width
如果圆的中心点在矩形的右边,离着圆中心点最近的矩形上的点在矩形的右边边界上

else
   cx = circle.x
如果圆心x既不在矩形的左边也不在右边, 那么cx就在矩形内



同理,找到Y方向上离着圆中心点最近的y偏移cy

    if circle_pt.y < rect.y then
        cy = rect.y
    elseif circle_pt.y > rect.y + rect.height then
        cy = rect.y + rect.height
    else
        cy = circle_pt.y
    end


最后附上lua版的圆与矩形的碰撞,圆与圆的碰撞检测

--[[--

检测圆和未旋转的矩形之间的碰撞
参考:http://lazyfoo.net/SDL_tutorials/lesson19/index.php

~~~ lua

local intersects = circleIntersectRect(cc.p(10, 10), 50, cc.rect(20, 20, 100, 100))

~~~

param: circle_pt 圆心
param: radius 半径
param: rect 矩形 {x=0,y=0,width=100,height=100}

@see 

]]
function circleIntersectRect(circle_pt, radius, rect)
    local cx = nil
    local cy = nil

    -- Find the point on the collision box closest to the center of the circle
    if circle_pt.x < rect.x then
        cx = rect.x
    elseif circle_pt.x > rect.x + rect.width then
        cx = rect.x + rect.width
    else
        cx = circle_pt.x
    end

    if circle_pt.y < rect.y then
        cy = rect.y
    elseif circle_pt.y > rect.y + rect.height then
        cy = rect.y + rect.height
    else
        cy = circle_pt.y
    end

    if cc.pGetDistance(circle_pt, cc.p(cx, cy)) < radius then
        return true
    end

    return false
end


--[[--

检测圆之间的碰撞

~~~ lua

local intersects = circleIntersects(cc.p(10, 10), 10, cc.p(20,20), 20)

~~~

@param: circle_pt_a 圆A中心
@param: radius_a 圆A半径
@param: circle_pt_b 圆B中心
@param: radius_b 圆B半径

@return 是否碰撞

@see 

]]
function circleIntersects(circle_pt_a, radius_a, circle_pt_b, radius_b)
    -- If the distance between the centers of the circles is less than the sum of their radius
    if cc.pGetDistance(circle_pt_a, circle_pt_b) < (radius_a + radius_b) then
        return true
    end
    return false
end


参考:http://lazyfoo.net/SDL_tutorials/lesson19/index.php


下一篇 【COCOS2DX-游戏开发之三七】圆与旋转矩形的碰撞检测(下篇)