cocos2d-lua 将一个节点坐标设置到相对于另外一个节点的上下左右显示 具体判断规则自适应父节点基于屏幕的坐标位置

--[[--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

效果


cocos2d-lua 将一个节点坐标设置到相对于另外一个节点的上下左右显示 具体判断规则自适应父节点基于屏幕的坐标位置_第1张图片
image.png
cocos2d-lua 将一个节点坐标设置到相对于另外一个节点的上下左右显示 具体判断规则自适应父节点基于屏幕的坐标位置_第2张图片
image.png
cocos2d-lua 将一个节点坐标设置到相对于另外一个节点的上下左右显示 具体判断规则自适应父节点基于屏幕的坐标位置_第3张图片
image.png

你可能感兴趣的:(cocos2d-lua 将一个节点坐标设置到相对于另外一个节点的上下左右显示 具体判断规则自适应父节点基于屏幕的坐标位置)