private Robot Process(string instructions) { foreach (char instruction in instructions) { switch (instruction) { case '<': { _robot.DirectionOfMovement = _directionChanger.GetDirection(_robot.DirectionOfMovement, Rotation.Anticlockwise); break; } case '>': { _robot.DirectionOfMovement = _directionChanger.GetDirection(_robot.DirectionOfMovement, Rotation.Clockwise); break; } case '^': { switch (_robot.DirectionOfMovement) { case Direction.North: { _robot.y = _robot.y + 1; break; } case Direction.South: { _robot.y = _robot.y - 1; break; } case Direction.East: { _robot.x = _robot.x + 1; break; } case Direction.West: { _robot.x = _robot.x - 1; break; } } break; } } } return(_robot); }
public void ChangeDirection(IDirectionChanger directionChanger) { Vector2 directionVector = (Vector2)transform.position - directionChanger.GetPosition(); float angle = Vector2.SignedAngle(directionVector, Vector2.up); float roundedAngle = Mathf.Round(angle / 90f) * 90f; //older solution for only one DirectionChanger // float directionalAngle = Vector2.SignedAngle(-direction, positionVector); // float orthogonalAngle = (directionalAngle > 0 ? 1 : -1) * 90f; float orthogonalAngle = (directionChanger.GetDirection() == Direction.Right ? 1 : -1) * 90f; if (Vector2.SignedAngle(direction, Vector2.up) % 180f == roundedAngle % 180f) { direction = Quaternion.AngleAxis(orthogonalAngle, Vector3.back) * direction; } else { direction = Quaternion.AngleAxis(roundedAngle, Vector3.back) * Vector2.up; } directionChanged = true; }