private bool CheckStraightSideAreaInternal(MapArea fromArea,MapAreaTypeDir dir) { MapArea connectArea = this.GetNextMapArea(fromArea.X,fromArea.Y, dir); if( connectArea != null //&& connectArea.Type != MapAreaType.None ){ && connectArea.Type == MapAreaType.Room ){ ConnectArea(fromArea,connectArea, dir); return true; } return false; }
/// 指定方向にまっすぐエリアを検索し、部屋を見つけたらつなげる private bool CheckStraightRoad(MapArea fromArea, MapAreaTypeDir dir) { // 進行方向のサイドのエリアをチェック if( this.CheckStraightSideArea(fromArea, dir) ){ return true; } // その先を検索 MapArea connectArea = GetNextMapArea(fromArea.X,fromArea.Y, dir); if( connectArea == null ){ return false; } if( connectArea.Type == MapAreaType.None ){ // なにもない if( this.CheckStraightRoad(connectArea, dir) ){ ConnectArea(fromArea,connectArea, dir); return true; }else{ return false; } }else{// if( connectArea.Type == MapAreaType.Room || connectArea.Type == MapAreaType.Road ){ // 部屋につながった ConnectArea(fromArea,connectArea, dir); return true; } }
private bool CheckStraightSideArea(MapArea fromArea,MapAreaTypeDir dir) { if( fromArea.Type != MapAreaType.None ){ return false; } // つながるとこがあるならつなげておしまい。 if( dir == MapAreaTypeDir.Upper || dir == MapAreaTypeDir.Bottom ){ // 進行方向が上下 if( CheckStraightSideAreaInternal(fromArea, MapAreaTypeDir.Left) ){ return true; }else if( CheckStraightSideAreaInternal(fromArea, MapAreaTypeDir.Right) ){ return true; } }else{//if( dir == MapAreaTypeDir.Left || dir == MapAreaTypeDir.Right ){ // 進行方向が左右 if( CheckStraightSideAreaInternal(fromArea, MapAreaTypeDir.Upper) ){ return true; }else if( CheckStraightSideAreaInternal(fromArea, MapAreaTypeDir.Bottom) ){ return true; } } return false; }
private bool CalcBlockConnectOne(MapArea from, int x,int y, MapAreaTypeDir dir) { MapArea checkArea = this.AreaList[y,x]; if( checkArea.Type != MapAreaType.None && checkArea.BlockID != from.BlockID ){ // 違うブロックが隣あっているので、連結する。 Debug.Log("Connect Block : " + from.BlockID.ToString() + ", " + checkArea.BlockID.ToString()); ConnectArea(from, checkArea, dir); return true; } return false; }
private bool CalcBlockConnectLine(MapArea from, int x,int y, MapAreaTypeDir dir) { MapArea checkArea = this.AreaList[y,x]; if( checkArea.Type != MapAreaType.None ){ if( checkArea.BlockID == from.BlockID ){ return false;// 同一ブロックにつながった }else{ // 違うブロックが隣あっているので、連結する。 Debug.Log("Connect Block Line : " + string.Format("({0},{1})",from.X,from.Y) + " <=> " + string.Format("({0},{1})",checkArea.X,checkArea.Y)); ConnectArea(from, checkArea, dir); return true; } }else{ // なにもないエリア:次のエリアへ int nextX = x + (dir == MapAreaTypeDir.Right ? 1 : 0); if( nextX >= this.AreaList.GetLength(1) ){ return false; } int nextY = y + (dir == MapAreaTypeDir.Bottom ? 1 : 0); if( nextY >= this.AreaList.GetLength(0) ){ return false; } if( CalcBlockConnectLine(checkArea, nextX,nextY, dir) ){ ConnectArea(from, checkArea, dir); return true; } } return false; }
/// 指定グリッドのエリアの種類を確定 private void CalcAreaType(int x,int y) { var info = new MapArea(); info.X = x; info.Y = y; // まず部屋を確定. info.Type = m_random.Next(6) > 1 ? MapAreaType.None : MapAreaType.Room; this.AreaList[y,x] = info; }
private void CalcAreaBlockID(MapArea info) { if( info.Type == MapAreaType.None || info.BlockID >= 0 ){ // すでにブロック判定済み return; } info.BlockID = m_nowBlockID; MapArea checkArea; for(int i = 0; i < info.ConnectDir.Length; i++){ checkArea = info.ConnectDir[i]; if( checkArea != null ){ this.CalcAreaBlockID(checkArea); } } }
private static void ConnectArea(MapArea from,MapArea to, MapAreaTypeDir dir) { from.ConnectDir[(int)dir] = to; to.ConnectDir[ (int)MapAreaReverseDirList[(int)dir] ] = from; if( from.Type == MapAreaType.None ){ from.Type = MapAreaType.Road; } }