/// <summary>
    /// 接触判定命令
    /// </summary>
    /// <param name="tcol">判定コリジョン</param>
    /// <returns>-1:中断, 0:未接触, 1:接触</returns>
    private int ScanOrder(Collision tcol)
    {
        if (!tcol.enable)
        {
            return(0);
        }

        if (!ccol.enable)
        {
            return(-1);
        }

        bool hit = false;

        switch (ccol.form)
        {
        // 自分:円
        case COL_FORM.CIRCLE:
            // 対象:円
            if (tcol.form == COL_FORM.CIRCLE)
            {
                hit = Vector2.Distance(ccol.point, tcol.point) <= (ccol.range + tcol.range);
                break;
            }

            // 対象:矩形
            hit = CollisionPool.IsOverlapCircleToRect(ccol, tcol);
            break;

        // 自分:矩形
        case COL_FORM.RECTANGLE:
            // 対象:円
            if (tcol.form == COL_FORM.CIRCLE)
            {
                hit = CollisionPool.IsOverlapCircleToRect(tcol, ccol);
                break;
            }

            // 対象:矩形
            hit = CollisionPool.HitRectangles(ccol, tcol);
            break;
        }

#if DEBUG
        ccol.hit |= hit;
        tcol.hit |= hit;
#endif

        return(hit ? 1 : 0);
    }
 void Awake()
 {
     GameManager.collision = new CollisionPool();
     GameManager.collision.Initialize();
     Application.targetFrameRate = 60;
 }
    /// <summary>
    /// 矩形同士の接触判定
    /// </summary>
    /// <param name="ccol">自分</param>
    /// <param name="tcol">対象</param>
    private static bool HitRectangles(Collision ccol, Collision tcol)
    {
        Vector2 cpos = ccol.point;
        Vector2 tpos = tcol.point;

        // 絶対に接触しない距離なら判定回避
        float dist = Vector2.Distance(cpos, tpos);

        if (dist > (ccol.range + tcol.range))
        {
            return(false);
        }

        float cRad    = ccol.angle * Mathf.Deg2Rad;
        float cCos    = (float)System.Math.Cos(cRad);
        float cSin    = (float)System.Math.Sin(cRad);
        float tRad    = tcol.angle * Mathf.Deg2Rad;
        float tCos    = (float)System.Math.Cos(tRad);
        float tSin    = (float)System.Math.Sin(tRad);
        float cRangeX = ccol.size.x * 0.5f;
        float cRangeY = ccol.size.y * 0.5f;
        float tRangeX = tcol.size.x * 0.5f;
        float tRangeY = tcol.size.y * 0.5f;

        // 自分の4頂点を取得
        cPt[0].x = -cRangeX * cCos - cRangeY * cSin + cpos.x;
        cPt[0].y = -cRangeX * cSin + cRangeY * cCos + cpos.y;
        cPt[1].x = cRangeX * cCos - cRangeY * cSin + cpos.x;
        cPt[1].y = cRangeX * cSin + cRangeY * cCos + cpos.y;
        cPt[2].x = cRangeX * cCos - -cRangeY * cSin + cpos.x;
        cPt[2].y = cRangeX * cSin + -cRangeY * cCos + cpos.y;
        cPt[3].x = -cRangeX * cCos - -cRangeY * cSin + cpos.x;
        cPt[3].y = -cRangeX * cSin + -cRangeY * cCos + cpos.y;
        // 対象の4頂点を取得
        tPt[0].x = -tRangeX * tCos - tRangeY * tSin + tpos.x;
        tPt[0].y = -tRangeX * tSin + tRangeY * tCos + tpos.y;
        tPt[1].x = tRangeX * tCos - tRangeY * tSin + tpos.x;
        tPt[1].y = tRangeX * tSin + tRangeY * tCos + tpos.y;
        tPt[2].x = tRangeX * tCos - -tRangeY * tSin + tpos.x;
        tPt[2].y = tRangeX * tSin + -tRangeY * tCos + tpos.y;
        tPt[3].x = -tRangeX * tCos - -tRangeY * tSin + tpos.x;
        tPt[3].y = -tRangeX * tSin + -tRangeY * tCos + tpos.y;

        // 線分交差処理はもっと上手く出来るハズ
        // 上辺
        if (CrossLine(ref cPt[0], ref cPt[1], ref tPt[0], ref tPt[1]))
        {
            return(true);
        }
        if (CrossLine(ref cPt[0], ref cPt[1], ref tPt[1], ref tPt[2]))
        {
            return(true);
        }
        if (CrossLine(ref cPt[0], ref cPt[1], ref tPt[2], ref tPt[3]))
        {
            return(true);
        }
        if (CrossLine(ref cPt[0], ref cPt[1], ref tPt[3], ref tPt[0]))
        {
            return(true);
        }
        // 右辺
        if (CrossLine(ref cPt[1], ref cPt[2], ref tPt[0], ref tPt[1]))
        {
            return(true);
        }
        if (CrossLine(ref cPt[1], ref cPt[2], ref tPt[1], ref tPt[2]))
        {
            return(true);
        }
        if (CrossLine(ref cPt[1], ref cPt[2], ref tPt[2], ref tPt[3]))
        {
            return(true);
        }
        if (CrossLine(ref cPt[1], ref cPt[2], ref tPt[3], ref tPt[0]))
        {
            return(true);
        }
        // 下辺
        if (CrossLine(ref cPt[2], ref cPt[3], ref tPt[0], ref tPt[1]))
        {
            return(true);
        }
        if (CrossLine(ref cPt[2], ref cPt[3], ref tPt[1], ref tPt[2]))
        {
            return(true);
        }
        if (CrossLine(ref cPt[2], ref cPt[3], ref tPt[2], ref tPt[3]))
        {
            return(true);
        }
        if (CrossLine(ref cPt[2], ref cPt[3], ref tPt[3], ref tPt[0]))
        {
            return(true);
        }
        // 左辺
        if (CrossLine(ref cPt[3], ref cPt[0], ref tPt[0], ref tPt[1]))
        {
            return(true);
        }
        if (CrossLine(ref cPt[3], ref cPt[0], ref tPt[1], ref tPt[2]))
        {
            return(true);
        }
        if (CrossLine(ref cPt[3], ref cPt[0], ref tPt[2], ref tPt[3]))
        {
            return(true);
        }
        if (CrossLine(ref cPt[3], ref cPt[0], ref tPt[3], ref tPt[0]))
        {
            return(true);
        }

        // 対象が自分に内包されているか
        cPt[0] = new Vector2(-cRangeX, cRangeY);
        cPt[1] = new Vector2(cRangeX, cRangeY);
        cPt[2] = new Vector2(cRangeX, -cRangeY);
        cPt[3] = new Vector2(-cRangeX, -cRangeY);
        Vector2 point = tpos - cpos;
        Vector2 checkPt;

        checkPt.x = point.x * cCos - point.y * -cSin;
        checkPt.y = point.x * -cSin + point.y * cCos;
        if (CollisionPool.PointInRect(ref checkPt, cPt))
        {
            return(true);
        }
        // 自分が対象に内包されているか
        tPt[0]    = new Vector2(-tRangeX, tRangeY);
        tPt[1]    = new Vector2(tRangeX, tRangeY);
        tPt[2]    = new Vector2(tRangeX, -tRangeY);
        tPt[3]    = new Vector2(-tRangeX, -tRangeY);
        point     = cpos - tpos;
        checkPt.x = point.x * tCos - point.y * -tSin;
        checkPt.y = point.x * -tSin + point.y * tCos;
        if (CollisionPool.PointInRect(ref checkPt, tPt))
        {
            return(true);
        }

        return(false);
    }
Exemple #4
0
 void Awake()
 {
     GameManager.collision = new CollisionPool();
     GameManager.collision.Initialize();
 }