C# 如何在基于瓷砖的游戏中处理液体流动?

C# 如何在基于瓷砖的游戏中处理液体流动?,c#,xna,tile,C#,Xna,Tile,正如标题所说,我需要在基于瓷砖的游戏中处理液体 信息:每个磁贴为16x像素,并且有一个水位(字节)。 因为每一块瓷砖都有一个水位,所以水应该与附近的其他瓷砖平均。但我似乎做不到 我希望这段视频是这样的: 但我就是做不到。帮忙 if (WaterLevel > 0) { //Bottom if (Program.Game.CurrentMap.Tiles[(int)TileLocation.X, (int)TileLocati

正如标题所说,我需要在基于瓷砖的游戏中处理液体

信息:每个磁贴为16x像素,并且有一个水位(字节)。 因为每一块瓷砖都有一个水位,所以水应该与附近的其他瓷砖平均。但我似乎做不到

我希望这段视频是这样的:

但我就是做不到。帮忙

if (WaterLevel > 0)
        {
            //Bottom
            if (Program.Game.CurrentMap.Tiles[(int)TileLocation.X, (int)TileLocation.Y + 1].Collide == false && Program.Game.CurrentMap.Tiles[(int)TileLocation.X, (int)TileLocation.Y + 1].WaterLevel != 255)
            {
                if ((int)Program.Game.CurrentMap.Tiles[(int)TileLocation.X, (int)TileLocation.Y + 1].WaterLevel + (int)WaterLevel > 255)
                {
                    WaterLevel -= (byte)(255 - Program.Game.CurrentMap.Tiles[(int)TileLocation.X, (int)TileLocation.Y + 1].WaterLevel);
                    Program.Game.CurrentMap.Tiles[(int)TileLocation.X, (int)TileLocation.Y + 1].WaterLevel = 255;
                }
                else
                {
                    Program.Game.CurrentMap.Tiles[(int)TileLocation.X, (int)TileLocation.Y + 1].WaterLevel += WaterLevel;
                    this.WaterLevel = 0;
                }
            }
            //Left or Right
            else
            {
                bool Left = Program.Game.CurrentMap.Tiles[(int)TileLocation.X - 1, (int)TileLocation.Y].Collide;
                bool Right = Program.Game.CurrentMap.Tiles[(int)TileLocation.X + 1, (int)TileLocation.Y].Collide;
                byte Divider = 1;
                int Average = WaterLevel;
                if (Left)
                {
                    Divider += 1;
                    Average += Program.Game.CurrentMap.Tiles[(int)TileLocation.X - 1, (int)TileLocation.Y].WaterLevel;
                }
                if (Right)
                {
                    Divider += 1;
                    Average += Program.Game.CurrentMap.Tiles[(int)TileLocation.X + 1, (int)TileLocation.Y].WaterLevel;
                }
                WaterLevel = (byte)(Average / Divider);
                Average /= Divider;
                Divider -= 1;
                if (Left)
                {
                    Program.Game.CurrentMap.Tiles[(int)TileLocation.X - 1, (int)TileLocation.Y].WaterLevel = (byte)(Average / Divider);
                    Average /= Divider;
                    Divider -= 1;
                }
                if (Right)
                {
                    Program.Game.CurrentMap.Tiles[(int)TileLocation.X + 1, (int)TileLocation.Y].WaterLevel = (byte)(Average / Divider);
                    Average /= Divider;
                    Divider -= 1;
                }
            }
        }

你目前遇到的问题是什么?我建议你去看看Terria是如何做到这一点的。有一些基本的算法,应该不难理解。这里没有实际的例外,只是水没有像我希望的那样流到最低点。我检查了Terraria,但来源太乱了,我不想进入那里。我想让游戏尽可能真实。我尽了最大的努力,尽了最大的努力,但这还不够好。