void GenerateRoom(Utils.Rect rect, Dictionary <int, Room> rooms) { Utils.Rect roomRect = new Utils.Rect(); roomRect.start.x = random.Next(rect.start.x, rect.end.x - minRoomSize + 1); roomRect.start.z = random.Next(rect.start.z, rect.end.z - minRoomSize + 1); roomRect.end.x = random.Next(roomRect.start.x + minRoomSize - 1, (rect.end.x <= roomRect.start.x + maxRoomSize - 1 ? rect.end.x : roomRect.start.x + maxRoomSize - 1)); roomRect.end.z = random.Next(roomRect.start.z + minRoomSize - 1, (rect.end.z <= roomRect.start.z + maxRoomSize - 1 ? rect.end.z : roomRect.start.z + maxRoomSize - 1)); for (var hi = roomRect.start.z; hi <= roomRect.end.z; ++hi) { for (var wi = roomRect.start.x; wi <= roomRect.end.x; ++wi) { if (wi == roomRect.start.x || wi == roomRect.end.x || hi == roomRect.start.z || hi == roomRect.end.z) { map[hi, wi] = TerrainType.InsideWall; } else { map[hi, wi] = TerrainType.Room; } } } rooms[roomNowItr] = new Room() { rect = roomRect, entrances = new List <Coordinate>() }; if (rect.end.x - rect.start.x == mainMap.end.x - mainMap.start.x) { if (rect.start.z != mainMap.start.z) { while (GenerateEntrance(rooms[roomNowItr], Direction.North) == false) { } } if (rect.end.z != mainMap.end.z) { while (GenerateEntrance(rooms[roomNowItr], Direction.South) == false) { } } } else if (rect.end.z - rect.start.z == mainMap.end.z - mainMap.start.x) { if (rect.start.x != mainMap.start.x) { while (GenerateEntrance(rooms[roomNowItr], Direction.West) == false) { } } if (rect.end.x != mainMap.end.x) { while (GenerateEntrance(rooms[roomNowItr], Direction.East) == false) { } } } roomNowItr += 1; }
public void SetClipRect() { IVwGraphicsWin32 vwGraphics = VwGraphicsWin32Class.Create(); Assert.IsNotNull(vwGraphics); using (var gr = new GraphicsObjectFromImage()) { vwGraphics.Initialize(gr.Graphics.GetHdc()); int left, top, right, bottom; var rect = new Utils.Rect(50, 25, 1000, 1000); vwGraphics.SetClipRect(ref rect); vwGraphics.GetClipRect(out left, out top, out right, out bottom); Assert.AreEqual(50, left, "Left doesn't match"); Assert.AreEqual(25, top, "Top doesn't match"); Assert.AreEqual(1000, right, "Right doesn't match"); Assert.AreEqual(1000, bottom, "Bottom doesn't match"); } }
public void GetClipRect() { IVwGraphicsWin32 vwGraphics = VwGraphicsWin32Class.Create(); Assert.IsNotNull(vwGraphics); using (var gr = new GraphicsObjectFromImage()) { vwGraphics.Initialize(gr.Graphics.GetHdc()); var rect1 = new Utils.Rect(0, 0, 1000, 1000); var rect2 = new Utils.Rect(500, 500, 700, 700); vwGraphics.PushClipRect(rect1); int left, top, right, bottom; vwGraphics.GetClipRect(out left, out top, out right, out bottom); Assert.IsTrue(left == rect1.left, "First push failed: left"); Assert.IsTrue(right == rect1.right, "First push failed: right"); Assert.IsTrue(top == rect1.top, "First push failed: top"); Assert.IsTrue(bottom == rect1.bottom, "First push failed: bottom"); // try a second rectangle vwGraphics.PushClipRect(rect2); vwGraphics.GetClipRect(out left, out top, out right, out bottom); Assert.IsTrue(left == rect2.left, "Second push failed: left"); Assert.IsTrue(right == rect2.right, "Second push failed: right"); Assert.IsTrue(top == rect2.top, "Second push failed: top"); Assert.IsTrue(bottom == rect2.bottom, "Second push failed: bottom"); vwGraphics.PopClipRect(); vwGraphics.PopClipRect(); vwGraphics.ReleaseDC(); gr.Graphics.ReleaseHdc(); } }
public void SetClipRect() { IVwGraphicsWin32 vwGraphics = VwGraphicsWin32Class.Create(); Assert.IsNotNull(vwGraphics); using (var gr = new GraphicsObjectFromImage()) { vwGraphics.Initialize(gr.Graphics.GetHdc()); int left, top, right, bottom; var rect = new Utils.Rect(50,25,1000,1000); vwGraphics.SetClipRect(ref rect); vwGraphics.GetClipRect(out left, out top, out right, out bottom); Assert.AreEqual(50, left, "Left doesn't match"); Assert.AreEqual(25, top, "Top doesn't match"); Assert.AreEqual(1000, right, "Right doesn't match"); Assert.AreEqual(1000, bottom, "Bottom doesn't match"); } }
public TerrainType[,] GenerateMap(Dictionary <int, Room> rooms) { map = new TerrainType[this.dungeonZSize, this.dungeonXSsize]; for (var zi = 0; zi < this.dungeonZSize; zi++) { for (var xi = 0; xi < dungeonXSsize; xi++) { this.map[zi, xi] = TerrainType.Wall; } } // frameを除いた実際に使用できる範囲のmapを定義する mainMap = new Utils.Rect() { start = new Coordinate() { x = frameBreadth, z = frameBreadth }, end = new Coordinate() { x = this.dungeonXSsize - 1 - frameBreadth, z = this.dungeonZSize - 1 - frameBreadth } }; splittableRects = new List <Utils.Rect>(); indivisibleRects = new List <Utils.Rect>(); nodes = new Queue <Node>(); random = new System.Random(); splittableRects.Add(mainMap); //分割する回数 splitFrequency = random.Next(minRoomNum, maxRoomNum); splitFrequency -= 1; // 分割できるだけ分割する while (splitFrequency > 0 && splittableRects.Count != 0) { if (DivideMap()) { splitFrequency--; } } indivisibleRects.AddRange(splittableRects); while (indivisibleRects.Count > 0) { bool isGenerating = random.Next(0, 2) > 0; // if (isGenerating) GenerateRoom(indivisibleRects[0], rooms); indivisibleRects.RemoveAt(0); } foreach (var room in rooms) { var thisEntranceNum = random.Next(minEntranceNum, maxEntranceNum + 1); while (thisEntranceNum-- > 0) { var limit = 20; while (GenerateEntrance(room.Value, Utils.Random.RandomFourDirection()) == false && limit-- > 0) { } } } while (nodes.Count != 0) { GenerateWay(nodes.Dequeue(), true, false, TerrainType.Way, TerrainType.InsideWall, TerrainType.Wall); } // splitterを壁で埋める for (var hi = 0; hi < map.GetLength(0); hi++) { for (var wi = 0; wi < map.GetLength(1); ++wi) { if (map[hi, wi] == TerrainType.Splitter) { map[hi, wi] = TerrainType.Wall; } } } // 内壁を埋める for (var hi = 0; hi < map.GetLength(0); ++hi) { for (var wi = 0; wi < map.GetLength(1); ++wi) { if (map[hi, wi] == TerrainType.Way) { for (int dy = -1; dy <= 1; ++dy) { for (int dx = -1; dx <= 1; ++dx) { if (map[hi + dy, wi + dx] == TerrainType.Wall) { map[hi + dy, wi + dx] = TerrainType.InsideWall; } } } } } } return(map); }
bool DivideMap() { int itr = random.Next(0, splittableRects.Count); Utils.Rect rect = splittableRects[itr]; splittableRects.RemoveAt(itr); bool isHorizontally = random.Next(0, 2) > 0; if (rect.end.x - rect.start.x < minRoomSize * 2 + 1 && rect.end.z - rect.start.z < minRoomSize * 2 + 1) { indivisibleRects.Add(rect); return(false); } else if (rect.end.x - rect.start.x < minRoomSize * 2 + 1) { isHorizontally = true; } else if (rect.end.z - rect.start.z < minRoomSize * 2 + 1) { isHorizontally = false; } if (isHorizontally) //split horizon { int xAxis = random.Next(rect.start.z + minRoomSize, rect.end.z - minRoomSize); for (var i = rect.start.x; i <= rect.end.x; ++i) { map[xAxis, i] = TerrainType.Splitter; } Utils.Rect top = new Utils.Rect() { start = rect.start, end = new Coordinate() { x = rect.end.x, z = xAxis - 1 } }; Utils.Rect bottom = new Utils.Rect() { start = new Coordinate() { x = rect.start.x, z = xAxis + 1 }, end = rect.end }; splittableRects.Add(top); splittableRects.Add(bottom); return(true); } else //split vertical { int zAxis = random.Next(rect.start.x + minRoomSize, rect.end.x - minRoomSize); for (var i = rect.start.z; i <= rect.end.z; ++i) { map[i, zAxis] = TerrainType.Splitter; } Utils.Rect left = new Utils.Rect() { start = rect.start, end = new Coordinate() { x = zAxis - 1, z = rect.end.z } }; Utils.Rect right = new Utils.Rect() { start = new Coordinate() { x = zAxis + 1, z = rect.start.z }, end = rect.end }; splittableRects.Add(left); splittableRects.Add(right); return(true); } }