示例#1
0
    bool cast(TankMotor.Ray r, Vector2 pos, float rad, Arena.Obstacle obs)
    {
        Vector2 tan = new Vector2(r.Dir.y, -r.Dir.x);


        Vector2 intersection; float t1, t2;

        FindIntersection(Motor.Pos, r.Dir, pos, tan,
                         out intersection,
                         out t1, out t2);


        if (t1 < 0 || Mathf.Abs(t2) > rad)
        {
            return(false);
        }
        if (t1 - rad > r.RangeMod * Motor.BaseRange * r.Out_Dis)
        {
            return(true);
        }

        float pen = Mathf.Sqrt(rad * rad - t2 * t2);

        if (t1 - pen > r.RangeMod * Motor.BaseRange * r.Out_Dis)
        {
            return(true);
        }


        if (obs != null)
        {
            obs.cast(Motor, r);
        }
        else
        {
            r.Out_Opponent = 1;
            r.Out_Dis      = (t1 - pen) / (r.RangeMod * Motor.BaseRange);
        }
        return(true);
    }
示例#2
0
    void sub(Vector2 dir, Vector2 pos, float mag, ref int oRi, float rad, Arena.Obstacle obs)
    {
        //int oldRi = oRi;
        fixRi(dir, ref oRi);


        /*if(obs == null) {
         *  Debug.Log("mag " + mag + "  dir " + dir + "  oldRi " + oldRi + "  oRi " + oRi);
         *  return;
         * }*/
        if (mag < rad && obs != null)
        {
            Motor.Scanner[oRi].Out_Dis = 0;
            for (int ri = oRi, maxIter = Motor.Scanner.Count; ;)
            {
                ri = (ri + 1) % Motor.Scanner.Count;
                var   r  = Motor.Scanner[ri];
                float dt = Vector2.Dot(r.Dir, dir);
                if (dt > 0.0f)
                {
                    obs.cast(Motor, r);
                }
                else
                {
                    break;
                }

                if (maxIter-- < 0)
                {
                    Debug.LogError("stuck");
                    return;
                }
            }
            for (int ri = oRi, maxIter = Motor.Scanner.Count; ;)
            {
                ri = (ri + Motor.Scanner.Count - 1) % Motor.Scanner.Count;
                var   r  = Motor.Scanner[ri];
                float dt = Vector2.Dot(r.Dir, dir);
                if (dt > 0.0f)
                {
                    obs.cast(Motor, r);
                }
                else
                {
                    break;
                }
                if (maxIter-- < 0)
                {
                    Debug.LogError("stuck");
                    return;
                }
            }

            return;
        }

        // Gizmos.DrawLine(Motor.Pos, Motor.Pos + dir);
        //Gizmos.color = Color.black;
        //Gizmos.DrawLine(Motor.Pos, Motor.Pos + Motor.Scanner[o.Ri].Dir *4.0f );


        cast(Motor.Scanner[oRi], pos, rad, obs);
        for (int ri = oRi, maxIter = Motor.Scanner.Count; ;)
        {
            ri = (ri + 1) % Motor.Scanner.Count;
            if (!cast(Motor.Scanner[ri], pos, rad, obs))
            {
                break;
            }
            if (maxIter-- < 0)
            {
                Debug.LogError("stuck");
                return;
            }
        }
        for (int ri = oRi, maxIter = Motor.Scanner.Count; ;)
        {
            ri = (ri + Motor.Scanner.Count - 1) % Motor.Scanner.Count;
            if (!cast(Motor.Scanner[ri], pos, rad, obs))
            {
                break;
            }

            if (maxIter-- < 0)
            {
                Debug.LogError("stuck");
                return;
            }
        }



        /* foreach( var r in Motor.Scanner) {
         *   Vector2 tan = new Vector2(r.Dir.y, -r.Dir.x);
         *
         *
         *   Vector2 intersection; float t1, t2;
         *   FindIntersection(Motor.Pos, r.Dir, obs.Pos, tan,
         *       out  intersection,
         *       out  t1, out  t2);
         *   if( t1 < 0 || Mathf.Abs(t2) > obs.Rad || t1-obs.Rad > r.RangeMod * Motor.BaseRange) continue;
         *
         *   float pen = Mathf.Sqrt(obs.Rad * obs.Rad - t2 * t2);
         *   if(t1 - pen > r.RangeMod * Motor.BaseRange) continue;
         *   //|| t1 > r.RangeMod * Motor.BaseRange
         * //                Debug.Log("t1 " + t1 + "  t2 " + t2 + "   obs.Rad " + obs.Rad + "  r.RangeMod * Motor.BaseRange " + (r.RangeMod * Motor.BaseRange));
         *   Gizmos.color = Color.blue;
         *   Gizmos.DrawLine(obs.Pos, intersection);
         *
         *   intersection = Motor.Pos + r.Dir * (t1 - pen);
         *   Gizmos.color = Color.red;
         *   Gizmos.DrawLine(Motor.Pos, intersection);
         *
         *   Gizmos.color = Color.black;
         *   Gizmos.DrawLine(Motor.Pos, Motor.Pos + r.Dir*4);
         * } */
    }