-----求point绕o点逆时针旋转angle度之后,新点的位置
function getRotatedPos(o,point,angle)
return
{
x=(point.x-o.x)*math.cos(math.rad(angle))-(point.y-o.y)*math.sin(math.rad(angle))+o.x,
y=(point.x-o.x)*math.sin(math.rad(angle))+(point.y-o.y)*math.cos(math.rad(angle))+o.y,
}
end
----node里是否包含点point
function containPoint(node,point)
local size=node:getContentSize()
size={width=size.width*node:getScaleX(),height=size.height*node:getScaleY()}
local pos={x=node:getPositionX(),y=node:getPositionY() }
local anchor=node:getAnchorPoint()
local rotate=node:getRotation()%360
local pointRotated=getRotatedPos(pos,point,rotate)
local rectRotated={x=pos.x-size.width*anchor.x,y=pos.y-size.height*anchor.y,width=size.width,height=size.height}
if pointRotated.x>=rectRotated.x and pointRotated.x<=rectRotated.x+rectRotated.width and
pointRotated.y>=rectRotated.y and pointRotated.y<=rectRotated.y+rectRotated.height then
return true
end
end
function checkNodeHit(node1,node2)
local size1=node1:getContentSize()
size1={width=size1.width*node1:getScaleX(),height=size1.height*node1:getScaleY()}
local size2=node2:getContentSize()
size2={width=size2.width*node2:getScaleX(),height=size2.height*node2:getScaleY()}
local pos1={x=node1:getPositionX(),y=node1:getPositionY()}
local pos2={x=node2:getPositionX(),y=node2:getPositionY()}
local anchor1=node1:getAnchorPoint()
local anchor2=node2:getAnchorPoint()
local rotation1=node1:getRotation()%360
local rotation2=node2:getRotation()%360
local rect1={x=pos1.x-size1.width*anchor1.x,y=pos1.y-size1.height*anchor1.y,width=size1.width,height=size1.height}
local rect2={x=pos2.x-size2.width*anchor2.x,y=pos2.y-size2.height*anchor2.y,width=size2.width,height=size2.height}
local rect1Points={
getRotatedPos(pos1,{x=rect1.x,y=rect1.y},360-rotation1),
getRotatedPos(pos1,{x=rect1.x+rect1.width,y=rect1.y},360-rotation1),
getRotatedPos(pos1,{x=rect1.x,y=rect1.y+rect1.height},360-rotation1),
getRotatedPos(pos1,{x=rect1.x+rect1.width,y=rect1.y+rect1.height},360-rotation1),
}
local rect2Points={
getRotatedPos(pos2,{x=rect2.x,y=rect2.y},360-rotation2),
getRotatedPos(pos2,{x=rect2.x+rect2.width,y=rect2.y},360-rotation2),
getRotatedPos(pos2,{x=rect2.x,y=rect2.y+rect2.height},360-rotation2),
getRotatedPos(pos2,{x=rect2.x+rect2.width,y=rect2.y+rect2.height},360-rotation2),
}
for _,p in pairs(rect1Points) do
if containPoint(node2,p) then
return true
end
end
for _,p in pairs(rect2Points) do
if containPoint(node1,p) then
return true
end
end
end
--[[基本思路:
两个有角度的矩形是否碰撞,只需判断四个顶点是否另一个矩形内部。所以先判断一个点是否在矩形内部。这个可以以rect1的锚点为圆心旋转,摆正,得到新的矩形,同样将要判断的点绕rect1的锚点旋转相同的角度,然后判断这个点是否在rect1内。
优化:比如多次计算了sin和cos的值,这个可以存起来
局限:
不能判断快速运动中的矩形碰撞,如果矩形运动过快,两帧之间形成的空档大于另一个矩形的大小,那就无法得到准确的值,所以优化的话应该计算运动路径形成的轨迹上的碰撞检测。
不能判断切变后的矩形(有skew值的)碰撞
由于我的项目是慢速运动,两个矩形大小相近,也没有切变,所以没做这部分。
]]--