//////////////////////////////////////////////////////////////////////////////////////////////////////////Check for valid direction bool CanGo(wpt waypoint, wpt.direction direction) { foreach (var dir in waypoint.ValidDiriections) { if (dir == direction) { return(true); } } return(false); }
// Update is called once per frame void Update() { //Doing the change of direction according to the pressed key if (Input.GetKey(KeyCode.W)) { this.SetDirection(wpt.direction.U); if (direction == wpt.direction.U) { transform.localScale = new Vector2(0.05f, 0.05f); transform.localRotation = Quaternion.Euler(0, 0, 90); } } if (Input.GetKey(KeyCode.S)) { this.SetDirection(wpt.direction.D); if (direction == wpt.direction.D) { transform.localScale = new Vector2(0.05f, 0.05f); transform.localRotation = Quaternion.Euler(0, 0, 270); } } if (Input.GetKey(KeyCode.A)) { this.SetDirection(wpt.direction.L); if (direction == wpt.direction.L) { transform.localScale = new Vector2(-0.05f, 0.05f); transform.localRotation = Quaternion.Euler(0, 0, 0); } } if (Input.GetKey(KeyCode.D)) { this.SetDirection(wpt.direction.R); if (direction == wpt.direction.R) { transform.localScale = new Vector2(0.05f, 0.05f); transform.localRotation = Quaternion.Euler(0, 0, 0); } } //Doing the movement if (!CheckForDestination()) { switch (direction) { case wpt.direction.L: transform.position = new Vector3(transform.position.x - (Time.deltaTime * speed), transform.position.y, transform.position.z); break; case wpt.direction.R: transform.position = new Vector3(transform.position.x + (Time.deltaTime * speed), transform.position.y, transform.position.z); break; case wpt.direction.D: transform.position = new Vector3(transform.position.x, transform.position.y - (Time.deltaTime * speed), transform.position.z); break; case wpt.direction.U: transform.position = new Vector3(transform.position.x, transform.position.y + (Time.deltaTime * speed), transform.position.z); break; } } //Doing the changing of next waypoints else { var nextwaypoint = NextWaypoint(CurrentWaypoint, direction); // Teleportation if at the portal if (CurrentWaypoint.transform.position == Rt.transform.position && direction == wpt.direction.R) { this.transform.position = Lt.transform.position; CurrentWaypoint = Lt; return; } else if (CurrentWaypoint.transform.position == Lt.transform.position && direction == wpt.direction.L) { this.transform.position = Rt.transform.position; CurrentWaypoint = Lt; return; } //becoming next waypoint if (nextwaypoint != null) { CurrentWaypoint = nextwaypoint; } else { transform.position = CurrentWaypoint.transform.position; } } }
//////////////////////////////////////////////////////////////////////////////////////////////////////////Deciding the next waypoint associate to the possible direction public wpt NextWaypoint(wpt CurrentPoint, wpt.direction dir) { var CurrentPosition = CurrentPoint.transform.position; wpt Target = null; foreach (var NextWaypoint in waypoints) { var NextPosition = NextWaypoint.transform.position; switch (dir) { case wpt.direction.L: //if the next waypoint is too the left, current x > next x, current y = next y. if (NextPosition.x < CurrentPosition.x && NextPosition.y == CurrentPosition.y && NextWaypoint != CurrentPoint) { if (Target != null) { if (distance(CurrentPosition, NextPosition, wpt.direction.L) < distance(CurrentPosition, Target.transform.position, wpt.direction.L)) { if (CanGo(CurrentPoint, wpt.direction.L) && CanGo(NextWaypoint, wpt.direction.R)) { Target = NextWaypoint; } } } else { if (CanGo(CurrentPoint, wpt.direction.L) && CanGo(NextWaypoint, wpt.direction.R)) { Target = NextWaypoint; } } } break; case wpt.direction.R: //if the next waypoint is to the right, current x < next x, current y = next y. if (NextPosition.x > CurrentPosition.x && NextPosition.y == CurrentPosition.y && NextWaypoint != CurrentPoint) { if (Target != null) { if (distance(CurrentPosition, NextPosition, wpt.direction.R) < distance(CurrentPosition, Target.transform.position, wpt.direction.R)) { if (CanGo(CurrentPoint, wpt.direction.R) && CanGo(NextWaypoint, wpt.direction.L)) { Target = NextWaypoint; } } } else { if (CanGo(CurrentPoint, wpt.direction.R) && CanGo(NextWaypoint, wpt.direction.L)) { Target = NextWaypoint; } } } break; case wpt.direction.U: //if the next waypoint is up, current y < next y, current x = next x. if (NextPosition.y > CurrentPosition.y && NextPosition.x == CurrentPosition.x && NextWaypoint != CurrentPoint) { if (Target != null) { if (distance(CurrentPosition, NextPosition, wpt.direction.U) < distance(CurrentPosition, Target.transform.position, wpt.direction.U)) { if (CanGo(CurrentPoint, wpt.direction.U) && CanGo(NextWaypoint, wpt.direction.D)) { Target = NextWaypoint; } } } else { if (CanGo(CurrentPoint, wpt.direction.U) && CanGo(NextWaypoint, wpt.direction.D)) { Target = NextWaypoint; } } } break; case wpt.direction.D: //if the next waypoint is down, current y > next y, current x = next x. if (NextPosition.y < CurrentPosition.y && NextPosition.x == CurrentPosition.x && NextWaypoint != CurrentPoint) { if (Target != null) { if (distance(CurrentPosition, NextPosition, wpt.direction.D) < distance(CurrentPosition, Target.transform.position, wpt.direction.D)) { if (CanGo(CurrentPoint, wpt.direction.D) && CanGo(NextWaypoint, wpt.direction.U)) { Target = NextWaypoint; } } } else { if (CanGo(CurrentPoint, wpt.direction.D) && CanGo(NextWaypoint, wpt.direction.U)) { Target = NextWaypoint; } } } break; } } return(Target); }
public GPXClass(string XML) { if (!XML.Equals("")) { _GPX.LoadXml(XML); if ((_GPX.DocumentElement).Name.Equals("gpx")) { XmlNodeList GPXNodes = ((_GPX.GetElementsByTagName("gpx"))[0]).ChildNodes; foreach (XmlNode Node in GPXNodes) { switch (Node.Name) { case "name": Name = Node.InnerText; break; case "desc": Description = Node.InnerText; break; case "author": Author = Node.InnerText; break; case "email": EMail = Node.InnerText; break; case "time": Time = Node.InnerText; break; case "keywords": KeyWords = Node.InnerText; break; case "bounds": Bounds = new GPSBoundary(); foreach (XmlAttribute Att in (Node).Attributes) { switch (Att.Name) { case "minlat": Bounds.Min.lat = Att.Value; break; case "minlon": Bounds.Min.lon = Att.Value; break; case "maxlat": Bounds.Max.lat = Att.Value; break; case "maxlon": Bounds.Max.lon = Att.Value; break; } } break; case "wpt": wpt NewWayPoint = new wpt(Node); WayPoints.Add(NewWayPoint); break; case "rte": rte NewRoute = new rte(Node); Routes.Add(NewRoute); break; case "trk": trk Track = new trk(Node); Tracks.Add(Track); break; case "url": URL = Node.InnerText; break; case "urlname": URLName = Node.InnerText; break; case "topografix:active_point": case "topografix:map": break; //default: ///throw new Exception("Unhandled for Child Object: " + Node.Name); } } } } }