--[[--by hgc
功能:将一个节点坐标设置到相对于另外一个节点的上下左右显示。
坐标都是世界坐标,适用于tips自动吸附到需要说明的那个节点周围。
这两个节点都是在不同的layer中。
如果上下左右都显示不下就显示在中间。
@param parent
@param child
]]
function g_adsorptionInParentNode(parent,child)
if not parent or not child then
return
end
local dw = display.width
local dh = display.height
local anchor = cc.p(parent:getAnchorPoint())
local parentPos = cc.p(parent:getPosition())
local parSize = parent:getContentSize()
local exceedX = anchor.x*parSize.width
local exceedY = anchor.y*parSize.height
local childSize = child:getContentSize()
childSize = cc.size(childSize.width+100,childSize.height)
--当前道具图标的位置
local relativePos = parent:getParent():convertToWorldSpace(parentPos)
local realPos = cc.pSub(relativePos,cc.p(exceedX,exceedY)) -- 将坐标统一成(0,0)的锚点
local rightX = realPos.x + parSize.width
local centerX = realPos.x + parSize.width/2
local centerY = realPos.y + parSize.height/2
local upY = realPos.y + parSize.height
if upY + childSize.height < dh then -- 上方 (左右的位置要足够)
if centerX + childSize.width/2 < dw and centerX - childSize.width/2 > 0 then
g_setNodePosition(child,cc.p(0.5,0),cc.p(centerX,upY))
return
end
end
if realPos.y - childSize.height > 0 then -- 下方(左右的位置要足够)
if centerX + childSize.width/2 < dw and centerX - childSize.width/2 > 0 then
g_setNodePosition(child,cc.p(0.5,1),cc.p(centerX,realPos.y))
return
end
end
if dw - (rightX + childSize.width) > 0 then -- 右边(要判断上下足够)
if centerY - (childSize.height/2) > 0 and centerY + (childSize.height/2) < dh then
g_setNodePosition(child,cc.p(0,0.5),cc.p(rightX,centerY))
return
else
g_setNodePosition(child,cc.p(0,0.5),cc.p(rightX,dh/2))
return
end
end
if realPos.x - childSize.width > 0 then --左边
if centerY - childSize.height/2 > 0 and centerY + childSize.height/2 < dh then -- 上下要有足够的位置
g_setNodePosition(child,cc.p(1,0.5),cc.p(realPos.x,centerY))
return
else
g_setNodePosition(child,cc.p(1,0.5),cc.p(realPos.x,dh/2)) --显示不了就显示中间
return
end
end
end
效果