private void AutoAddInvisibounds() { for (int i = 0; i < MyRoomData.Openings.Count; i++) { // No room here?? Protect me with an InvisiBounds! RoomOpening rod = MyRoomData.Openings[i]; if (!rod.IsRoomTo) { BoxCollider2D col = new GameObject().AddComponent <BoxCollider2D>(); col.transform.SetParent(this.transform); col.transform.localScale = Vector3.one; col.transform.localEulerAngles = Vector3.zero; col.gameObject.layer = LayerMask.NameToLayer("Ground"); // so our feet stop on it, yanno. col.name = "Invisibounds" + rod.side; // Determine the collider's rect, ok? Promise? float thickness = 10f; Rect rect = new Rect { size = GetInvisiboundSize(rod, thickness), center = rod.posCenter + MathUtils.GetDir(rod.side) * thickness * 0.5f, }; // Make it happen! col.transform.localPosition = rect.center; col.size = rect.size; } } }
private Vector2 GetInvisiboundSize(RoomOpening lo, float thickness) { if (lo.side == Sides.L || lo.side == Sides.R) { return(new Vector2(thickness, lo.length)); } return(new Vector2(lo.length, thickness)); }
private Vector2 GetOpeningSpriteSize(RoomOpening lo) { float thickness = 1f; if (lo.side == Sides.L || lo.side == Sides.R) { return(new Vector2(thickness, lo.length)); } return(new Vector2(lo.length, thickness)); }
private void AddOpeningsSprite(RoomOpening ro) { string _name = "Opening" + ro.side; Vector2 _pos = ro.posCenter; Vector2 _size = GetOpeningSpriteSize(ro); Sprite _sprite = ResourcesHandler.Instance.s_whiteSquare; SpriteRenderer newSprite = AddSpriteRenderer(_name, _sprite, go_openings, _pos, _size, 120, GetOpeningColor(ro)); srs_openings.Add(newSprite); }
///** Creates and returns a rect that's JUST made up of these rooms. */ //public Rect GetBoundsOfRooms (string[] _roomKeys) { // Rect returnRect = new Rect (0,0, 0,0); // for (int i=0; i<_roomKeys.Length; i++) { // RoomData rd = GetRoomData (_roomKeys [i]); // if (rd == null) { Debug.LogError ("Oops! This room doesn't exist in this world! " + _roomKeys[i] + ", world " + worldIndex); continue; } // returnRect = MathUtils.GetCompoundRect (returnRect, rd.BoundsGlobalBL); // } // return returnRect; //} public RoomData GetRoomNeighbor(RoomData originLD, RoomOpening opening) { // Get the neighbor, ignoring ITS openings. RoomData neighbor = GetRoomAtSide(originLD, opening.posCenter, opening.side); if (neighbor == null) { return(null); } // NOTHing there? Return null! // Ok, if this neighbor HAS a corresponding opening, return it!! Rect opRect = opening.GetCollRectGlobal(originLD.PosGlobal); for (int i = 0; i < neighbor.Openings.Count; i++) { Rect otherOpRect = neighbor.Openings[i].GetCollRectGlobal(neighbor.PosGlobal); if (opRect.Overlaps(otherOpRect)) { return(neighbor); } } // Ah, NO corresponding opening. Return null. return(null); }
private void AddRoomOpening(int side, Vector2 startPos, Vector2 endPos) { RoomOpening newObj = new RoomOpening(this, side, startPos, endPos); Openings.Add(newObj); }
private List <Room> GenerateLevel() { // Initialize with starting room. List <Room> rooms = new List <Room>(), roomTypes = new List <Room>(roomPrefabs); Room lastRoom = InstantiateRoom(RandomRoomPrefab(), Vector3.zero, Quaternion.identity); RoomOpening lastOpening = lastRoom.RandomOpening(); rooms.Add(lastRoom); // Loop to generate rest of the level. while (lastOpening != null && rooms.Count < roomAmount) { // Check if we have more rooms to check. if (roomTypes.Count > 0) { // Next room type. Room roomPrefab = roomTypes[Random.Range(0, roomTypes.Count)]; roomTypes.Remove(roomPrefab); // Instantiate Room nextRoom = InstantiateRoom(roomPrefab, Vector3.zero, Quaternion.identity); RoomOpening nextOpening = nextRoom.RandomOpening(); // Position and Orientation. Vector3 target = -lastOpening.transform.forward; Quaternion rotation = Quaternion.FromToRotation(nextOpening.transform.forward, target); nextRoom.transform.rotation = rotation; Vector3 position = lastOpening.transform.position + (nextRoom.transform.position - nextOpening.transform.position); nextRoom.transform.position = position; // Check bool valid = true; foreach (Room room in rooms) { if (!room.Equals(lastRoom) && room.CollisionCheck(nextRoom)) { valid = false; } } // Loop if (valid) { rooms.Add(nextRoom); nextRoom.RemoveOpening(nextOpening); lastRoom = nextRoom; lastOpening = nextRoom.RandomOpening(); roomTypes = new List <Room>(roomPrefabs); } else { Destroy(nextRoom.gameObject); lastOpening = lastRoom.RandomOpening(); } } else { // Pick a new opening. lastRoom.RemoveOpening(lastOpening); lastOpening = lastRoom.RandomOpening(); roomTypes = new List <Room>(roomPrefabs); } } return(rooms); }
public Color GetOpeningColor(RoomOpening ro) { return(ro.IsRoomTo ? Color.clear : new Color(1, 0.3f, 0.7f, 0.94f));//new Color(0.4f,1,0, 0.3f) }
public void RemoveOpening(RoomOpening roomOpening) { SideOpenings.Remove(roomOpening); }