bekovski

sg04_cpy

May 30th, 2018
147
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 9.45 KB | None | 0 0
  1. using System.Collections;
  2. using System.Collections.Generic;
  3. using UnityEngine;
  4.  
  5. using System.Text.RegularExpressions;
  6.  
  7. public class LevelManager : MonoBehaviour {
  8.  
  9.     // singleton
  10.     public static LevelManager instance;
  11.  
  12.     // file prefix
  13.     private readonly string prefix = "Assets/Levels/";
  14.  
  15.     // player prefab
  16.     public Transform pacman;
  17.  
  18.     // enemy prefabs
  19.     public Transform blinky;
  20.     public Transform pinky;
  21.     public Transform inky;
  22.     public Transform clyde;
  23.  
  24.     // walls
  25.     public Transform corridor;
  26.     public Transform corner;
  27.     public Transform cross;
  28.     public Transform tCross;
  29.     public Transform deadEnd;
  30.  
  31.     // corresponding strings
  32.     readonly char sCorridorHorizontal = '-';
  33.     readonly char sCorridorVertical = '|';
  34.     readonly char sCross = '+';             // could be cross or tCross or corner
  35.  
  36.     // the level as a string
  37.     private List<string> level = new List<string> ();
  38.     private bool isReady;
  39.  
  40.     // the waypoints
  41.     private List<WayPoint> wayPoints = new List<WayPoint>();
  42.  
  43.     // a struct that helps setting the wayPoints
  44.     struct AuxStruct {
  45.         public Transform tile;
  46.         public bool goUp;
  47.         public bool goDown;
  48.         public bool goLeft;
  49.         public bool goRight;
  50.     };
  51.     List<AuxStruct> auxList = new List<AuxStruct>();
  52.     AuxStruct[,] auxArray;
  53.     int rows = 0;
  54.     int cols = -1;
  55.     int r = 0;
  56.     int c = 0;
  57.  
  58.     void Awake() {
  59.         instance = this;
  60.     }
  61.  
  62.  
  63.     void Update() {
  64.         if(isReady) {
  65.             auxArray = new AuxStruct[rows, cols];
  66.             CreateLevel ();
  67.             isReady = false;
  68.         }
  69.     }
  70.  
  71.  
  72.     public void ReadFile(string fileName) {
  73.         string text = System.IO.File.ReadAllText (prefix + fileName);
  74.         level.Clear ();
  75.         List<string> lines = new List<string>(Regex.Split (text, "\n"));
  76.  
  77.         for(int i=0; i < lines.Count; ++i) {
  78.             string currentLine = lines[i].Trim();
  79.             string[] currentLineSplit = Regex.Split (currentLine, " ");
  80.  
  81.             switch(currentLineSplit[0]) {
  82.             case "Pacman":
  83.                 pacman.transform.position = StringCoordsToVec (
  84.                     currentLineSplit [1],
  85.                     pacman.transform.position.y.ToString (),
  86.                     currentLineSplit [2]);
  87.                 break;
  88.             case "Blinky":
  89.                 blinky.transform.position = StringCoordsToVec (
  90.                     currentLineSplit [1],
  91.                     blinky.transform.position.y.ToString (),
  92.                     currentLineSplit [2]);
  93.                 break;
  94.             case "Pinky":
  95.                 pinky.transform.position = StringCoordsToVec (
  96.                     currentLineSplit [1],
  97.                     pinky.transform.position.y.ToString (),
  98.                     currentLineSplit [2]);
  99.                 break;
  100.             case "Inky":
  101.                 inky.transform.position = StringCoordsToVec (
  102.                     currentLineSplit [1],
  103.                     inky.transform.position.y.ToString (),
  104.                     currentLineSplit [2]);
  105.                 break;
  106.             case "Clyde":
  107.                 clyde.transform.position = StringCoordsToVec (
  108.                     currentLineSplit [1],
  109.                     clyde.transform.position.y.ToString (),
  110.                     currentLineSplit [2]);
  111.                 break;
  112.             default:
  113.                 // else it must be some level object
  114.                 level.Add (currentLine);
  115.                 rows++;
  116.                 if(cols == -1) {
  117.                     cols = currentLine.Length;
  118.                 }
  119.                 break;
  120.             } // switch()
  121.         } // for()
  122.  
  123.         isReady = true;
  124.     } // ReadFile()
  125.        
  126.  
  127.  
  128.     Vector3 StringCoordsToVec(string x, string y, string z) {
  129.         float newX = float.Parse (x);
  130.         Debug.Log (y);
  131.         float newY = float.Parse (y);
  132.         float newZ = float.Parse (z);
  133.  
  134.         return new Vector3 (newX, newY, newZ);
  135.     }
  136.  
  137.  
  138.     void CreateLevel() {
  139.         float startX = 0f;
  140.  
  141.         float x = startX;
  142.         float y = 0f;
  143.         float z = 0f;
  144.  
  145.         for(int i=0; i < level.Count; ++i) {
  146.             for(int j=0; j < level[i].Length; ++j) {
  147.                 Vector3 vec = new Vector3 (x, y, z);
  148.  
  149.  
  150.                 if(level[i][j] == sCorridorHorizontal) {
  151.                     bool isDeadEndLeft  = (j == 0);
  152.                     bool isDeadEndRight = (j == level[i].Length-1);
  153.  
  154.                     if(isDeadEndLeft) {
  155.                         // InstantiateWithRotation (deadEnd, vec, -90f);
  156.                         InstantiateWithRotationAndCreateWayPoint(deadEnd, vec, -90f, false, false, false, true);
  157.                     }
  158.                     else if(isDeadEndRight) {
  159.                         // InstantiateWithRotation (deadEnd, vec, 90f);
  160.                         InstantiateWithRotationAndCreateWayPoint(deadEnd, vec, 90f, false, false, true, false);
  161.                     }
  162.                     else {
  163.                         // InstantiateWithRotation (corridor, vec, 90f);
  164.                         InstantiateWithRotationAndCreateWayPoint(corridor, vec, 90f, false, false, true, true);
  165.                     }
  166.  
  167.                 }
  168.                 else if(level[i][j] == sCorridorVertical) {
  169.                     bool isDeadEndUp    = (i == 0);
  170.                     bool isDeadEndDown  = (i == level.Count-1);
  171.  
  172.                     if(isDeadEndUp) {
  173.                         // InstantiateWithRotation (deadEnd, vec, 0f);
  174.                         InstantiateWithRotationAndCreateWayPoint(deadEnd, vec, 0f, false, true, false, false);
  175.                     }
  176.                     else if(isDeadEndDown) {
  177.                         // InstantiateWithRotation (deadEnd, vec, 180f);
  178.                         InstantiateWithRotationAndCreateWayPoint(deadEnd, vec, 180f, true, false, false, false);
  179.                     }
  180.                     else {
  181.                         // InstantiateWithRotation (corridor, vec, 0f);
  182.                         InstantiateWithRotationAndCreateWayPoint(corridor, vec, 0f, true, true, false, false);
  183.                     }
  184.                 }
  185.  
  186.                 char empty = ' ';
  187.                 if(level[i][j] == sCross) {
  188.                     Debug.Log (level [i][level[i].Length-1]);
  189.                     char up     = ((i - 1) >= 0)                ? level [i - 1] [j] : empty;
  190.                     char down   = ((i + 1) < level.Count)       ? level [i + 1] [j] : empty;
  191.                     char left   = ((j - 1) >= 0)                ? level [i] [j - 1] : empty;
  192.                     char right  = ((j + 1) < level [i].Length)  ? level [i] [j + 1] : empty;
  193.  
  194.                     // important: assumes that loaded level is syntactically correct! (@see SyntaxChecker)
  195.  
  196.                     bool isLeftTopCorner        = (up == empty && left == empty && right != empty && down != empty);
  197.                     bool isLeftBottomCorner     = (up != empty && left == empty && right != empty && down == empty);
  198.                     bool isRightTopCorner       = (up == empty && left != empty && right == empty && down != empty);
  199.                     bool isRightBottomCorner    = (up != empty && left != empty && right == empty && down == empty);
  200.  
  201.                     bool isLeftTCross           = (up != empty && left == empty && right != empty && down != empty);
  202.                     bool isRightTCross          = (up != empty && left != empty && right == empty && down != empty);
  203.                     bool isTopTCross            = (up == empty && left != empty && right != empty && down != empty);
  204.                     bool isBottomTCross         = (up != empty && left != empty && right != empty && down == empty);
  205.  
  206.                     bool isCenterCross          = (up != empty && left != empty && right != empty && down != empty);
  207.  
  208.                     if(isLeftTopCorner) {
  209.                         // InstantiateWithRotation (corner, vec, -90f);
  210.                         InstantiateWithRotationAndCreateWayPoint(corner, vec, -90f, false, true, false, true);
  211.                     }
  212.                     else if(isLeftBottomCorner) {
  213.                         // InstantiateWithRotation (corner, vec, 180f);
  214.                         InstantiateWithRotationAndCreateWayPoint(corner, vec, 180f, true, false, false, true);
  215.                     }
  216.                     else if(isRightTopCorner) {
  217.                         // InstantiateWithRotation (corner, vec, 0f);
  218.                         InstantiateWithRotationAndCreateWayPoint(corner, vec, 0f, false, true, true, false);
  219.                     }
  220.                     else if(isRightBottomCorner) {
  221.                         // InstantiateWithRotation (corner, vec, 90f);
  222.                         InstantiateWithRotationAndCreateWayPoint(corner, vec, 90f, true, false, true, false);
  223.                     }
  224.                     else if(isLeftTCross) {
  225.                         // InstantiateWithRotation (tCross, vec, 0f);
  226.                         InstantiateWithRotationAndCreateWayPoint(tCross, vec, 0f, true, true, false, false);
  227.                     }
  228.                     else if(isRightTCross) {
  229.                         // InstantiateWithRotation (tCross, vec, 180f);
  230.                         InstantiateWithRotationAndCreateWayPoint(tCross, vec, 180f, true, true, false, false);
  231.                     }
  232.                     else if(isTopTCross) {
  233.                         // InstantiateWithRotation (tCross, vec, 90f);
  234.                         InstantiateWithRotationAndCreateWayPoint(tCross, vec, 90f, false, false, true, true);
  235.                     }
  236.                     else if(isBottomTCross) {
  237.                         // InstantiateWithRotation (tCross, vec, -90f);
  238.                         InstantiateWithRotationAndCreateWayPoint(tCross, vec, -90f, false, false, true, true);
  239.                     }
  240.                     else if(isCenterCross) {
  241.                         // InstantiateWithRotation (cross, vec, 0f);
  242.                         InstantiateWithRotationAndCreateWayPoint(cross, vec, 0f, true, true, true, true);
  243.                     }
  244.                 }
  245.  
  246.                 x += 1f;    // advance to the right
  247.             } // for(j)
  248.             z -= 1f;        // advance down
  249.             x = startX;     // start from the left
  250.         } // for(i)
  251.     } // CreateLevel()
  252.  
  253.     Transform InstantiateWithRotation(Transform obj, Vector3 vec, float deg) {
  254.         Vector3 rot = obj.transform.eulerAngles;
  255.         rot = new Vector3 (rot.x, rot.y + deg, rot.z);
  256.         Transform result = Instantiate (obj, vec, Quaternion.Euler (rot));
  257.         wayPoints.Add (result.GetComponent<WayPoint> ());
  258.         return result;
  259.     }
  260.  
  261.  
  262.     void InstantiateWithRotationAndCreateWayPoint(Transform obj, Vector3 vec, float deg, bool goUp, bool goDown, bool goLeft, bool goRight) {
  263.         Vector3 rot = obj.transform.eulerAngles;
  264.         rot = new Vector3 (rot.x, rot.y + deg, rot.z);
  265.         Transform result = Instantiate (obj, vec, Quaternion.Euler (rot));
  266.  
  267.         AuxStruct temp;
  268.         temp.tile = result;
  269.         temp.goUp = goUp;
  270.         temp.goDown = goDown;
  271.         temp.goLeft = goLeft;
  272.         temp.goRight = goRight;
  273.  
  274.         auxArray [r, c++] = temp;;
  275.         if(c == cols) {
  276.             r++;
  277.             c = 0;
  278.         }
  279.     }
  280.  
  281.     void SetWayPoints() {
  282.         for(int i=0; i < rows; ++i) {
  283.             for(int j=0; j < cols; ++j) {
  284.                 AuxStruct temp = auxArray [i, j];
  285.                 Transform obj = temp.tile;
  286.                 Debug.Log (obj.position);
  287.  
  288.                 WayPoint wp = obj.GetComponent<WayPoint> ();
  289.                 if(temp.goUp) {
  290.                     wp.upWaypoint = auxArray [i - 1, j].tile.GetComponent<WayPoint> ();
  291.                 }
  292.                 if(temp.goDown) {
  293.                     wp.downWaypoint = auxArray [i + 1, j].tile.GetComponent<WayPoint> ();
  294.                 }
  295.                 if(temp.goLeft) {
  296.                     wp.leftWaypoint = auxArray [i, j - 1].tile.GetComponent<WayPoint> ();
  297.                 }
  298.                 if(temp.goRight) {
  299.                     wp.rightWaypoint = auxArray [i, j + 1].tile.GetComponent<WayPoint> ();
  300.                 }
  301.             }
  302.         }
  303.     } // SetWayPoints()
  304. }
Advertisement
Add Comment
Please, Sign In to add comment