制作游戏中,各种形状的区域判定

记录使用到的区域限制:使用公式计算,可以减少的模板图片和一些耗性能的技术(如:刚体)

凸多边形的区域判定:向量法(还知道一个,射线法,原理很简单,,就是从点延伸一条射线,奇数是在内部的,偶数是在外部的,,,当然有切线的可能需要判断一下,,暂时没空写)
函数先写在这里,下次找机会解释
– 点是否在多边形内
– posList:多边形顶点坐标(逆时针排序), posTarget:要判断点的坐标

function M:bPointInPolygon(posList, posTarget) 
    local polygenSides = #posList -- 多边形边数
    local bIn = true -- 是否在多边形内
    for i = 1, polygenSides do 
        local Xa, Ya = posList[i].x, posList[i].y -- 首坐标 a
        local Xb, Yb = posList[i].x, posList[i].y -- 尾坐标 b
        local Xp, Yp = posTarget.x, posTarget.y -- 目标坐标 p
        if posList[i + 1] then 
            Xb, Yb = posList[i + 1].x, posList[i + 1].y
        else 
            Xb, Yb = posList[1].x, posList[1].y -- 最后一个点 需要与第一个点连成线段
        end 

        
            -- 向量ab = (Xb, Yb) - (Xa, Ya)
            local pointAB = {x = Xb - Xa, y = Yb - Ya}
            local pointAP = {x = Xp - Xa,  y = Yp - Ya}

            -- 向量ab、向量ap叉积
            local flag = pointAB.x * pointAP.y - pointAP.x * pointAB.y

            -- 这种情况 点不在多边形内
            if flag <= 0 then 
                bIn = false
                break
            end 

        end 

        return bIn
    end


椭圆的区域限制:
    -- 点是否在椭圆内
    function M:ellipseRestriction()
        
        local aValue = 160
        local bValue = 70
        -- 圆心
        local center = cc.p(482 + X_OFFSET, 244) 
        -- 判定公式
        local judge = (self:point().x - center.x) * (self:point().x - center.x)/(aValue * aValue) 
                    + (self:point().y - center.y) * (self:point().y - center.y)/(bValue * bValue)

        if judge <= 1 then
            return true
        else
            return false
        end

    end
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值