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); }
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); * } */ }