Example #1
0
 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;
 }
Example #2
0
        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");
            }
        }
Example #3
0
        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();
            }
        }
Example #4
0
		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");
			}
		}
Example #5
0
		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();
			}

		}
Example #6
0
        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);
        }
Example #7
0
        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);
            }
        }