C# 基于瓷砖的平台中的水物理

C# 基于瓷砖的平台中的水物理,c#,.net,xna,physics,C#,.net,Xna,Physics,我在我的XNA C#游戏中加入了水物理,它是基于瓷砖的(网格系统) 我以前问过一个问题。但我确实尝试过,而且似乎比我想象的要容易,我已经有一些水可以流了。但我的问题是,当它撞到墙上时,我需要它往上爬。我需要一种方法来获取列/行上最后一个磁贴的位置,以便检查它是空的还是满的 [W] [W][W][W][B] [B][B][B][B][B] Should be... [W][W][W][W][B] [B][B][B][B][B] 等等,我需要得到一列的结尾,以便添加到其中,例如

我在我的XNA C#游戏中加入了水物理,它是基于瓷砖的(网格系统)

我以前问过一个问题。但我确实尝试过,而且似乎比我想象的要容易,我已经有一些水可以流了。但我的问题是,当它撞到墙上时,我需要它往上爬。我需要一种方法来获取列/行上最后一个磁贴的位置,以便检查它是空的还是满的

      [W]
   [W][W][W][B]
[B][B][B][B][B]
Should be...

[W][W][W][W][B]
[B][B][B][B][B]
等等,我需要得到一列的结尾,以便添加到其中,例如:

   [W]
   [W]
   [W]

[B]   [B]
[B]   [B]
[B][W][B]
[B][W][B]
[B][B][B]
Should be

   [W]
[B][W][B]
[B][W][B]
[B][W][B]
[B][W][B]
[B][B][B]
现在我的方法不能像那样叠加它们

到目前为止我所做的是

 private void UpdateWater()
    { // Calculate the visible range of tiles.
        int left = (int)Math.Floor(cameraPosition / 16);
        int right = left + 1024 / 16;
        right = Math.Min(right, Width - 1);

        int top = (int)Math.Floor(cameraPositionYAxis / 16);
        int bottom = top + 768 / 16;
        bottom = Math.Min(bottom, Height - 1);



        //For Each tile on screen ///WATER CODE IS BELOW///
        for (int y = top; y < bottom; ++y)
        {
            for (int x = left; x < right; ++x)
            {
                if (tiles[x, y].blockType.Name == "Water")
                {
                    if (tiles[x, y + 1].blockType.Name == "Blank")
                    {  
                        tiles[x, y ] = new Tile(BlockType.Blank, null, x,y );

                        tiles[x, y + 1] = new Tile(BlockType.Water, null, x, y + 1);
                    }
                    else if ((tiles[x + 1, y].blockType.Name != "Blank") && (tiles[x + 1, y].blockType.Name != "Water"))
                    {


                    }
                    else if ((tiles[x - 1, y].blockType.Name != "Blank") && (tiles[x - 1, y].blockType.Name != "Water"))
                    {

                    }

                    else
                    { 


                           tiles[x, y] = new Tile(BlockType.Blank, null, x, y);
                           tiles[x - 1, y] = new Tile(BlockType.Water, null, x - 1, y);

                    }
                }
            }
        }
    }
private void UpdateWater()
{//计算瓷砖的可见范围。
int left=(int)数学楼层(摄像机位置/16);
int right=left+1024/16;
右=数学最小值(右,宽度-1);
int top=(int)数学楼层(cameraPositionYAxis/16);
内部底部=顶部+768/16;
底部=数学最小值(底部,高度-1);
//对于屏幕上的每个瓷砖///水代码如下///
对于(int y=顶部;y<底部;++y)
{
对于(int x=左;x<右;++x)
{
if(tiles[x,y].blockType.Name==“Water”)
{
如果(平铺[x,y+1].blockType.Name==“空白”)
{  
tiles[x,y]=新的Tile(BlockType.Blank,null,x,y);
tiles[x,y+1]=新的Tile(BlockType.Water,null,x,y+1);
}
else if((tiles[x+1,y].blockType.Name!=“空白”)和&(tiles[x+1,y].blockType.Name!=“水”))
{
}
else if((tiles[x-1,y].blockType.Name!=“Blank”)和&(tiles[x-1,y].blockType.Name!=“Water”))
{
}
其他的
{ 
tiles[x,y]=新的Tile(BlockType.Blank,null,x,y);
tiles[x-1,y]=新的Tile(BlockType.Water,null,x-1,y);
}
}
}
}
}
我仍然可能被认为是一个“新手”程序员,任何帮助都是感激的! 如果您需要更多信息或澄清,请告诉我


编辑:也许我需要一个水砖的压力参数?或者不。。。现在就想办法解决这个问题。。在堆叠方面仍然有一些问题。

您是在尝试模拟类似真实物理的东西,还是更像“Boulderdash”物理的东西?如果是后者,我建议你可以尝试不同的方法,看看什么是“感觉”正确的;我建议不要用“压力”来思考,而是用体积来思考,给每个单元格分配一个值,例如从1/8满到完全满。然后在每个移动帧上执行以下两个操作:

  • 从下到上,如果一个含水单元位于一个可能含水但未满的单元上方,则尽可能多地将水从上单元移动到下单元。
  • 从下到上,对于每个含水的单元,如果下面的单元不能容纳更多的水,则将“起始水量”的1/4转移到每侧(如果有空间)。
    我猜每帧执行这两个步骤可能会产生一些合理的水效果。它们不会表现出任何与真实物理有几分相似的东西,但对于许多平台游戏来说,可玩性比真实性更重要。

    我在想类似的事情,我想了很多,并且弄明白了!只是一些小虫子fix@Cyral:有趣的视频剪辑。我倾向于让与瓷砖相关的图形包括从底部填充的可变水量,而不是蓝色阴影(至少达到100%的标称容量)。如果你想要深度均衡,深蓝色可能会对更高的压力起作用,但我认为这可能会使事情变得复杂,我不知道这对游戏性是好是坏。