基于平铺的平台中的水物理学

时间:2012-05-01 23:24:40

标签: c# .net xna physics

我将水物理添加到我的XNA C#游戏中,它是基于Tile的(网格系统)。

之前我问过这个问题。但我实际上尝试了它,它似乎比我想象的更容易,我已经有一些水流动。但我的问题是,当它碰到墙壁时,我需要它上升。我需要一种方法来获取列/行上最后一个图块的位置所以我可以检查它是空的还是已填充

      [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);

                    }
                }
            }
        }
    }

我仍然可能被认为是“新手”编码器,任何帮助表示赞赏! 如果您需要更多信息或说明,请告诉我们!

编辑:也许我需要Water tile的Pressure参数?或者不......现在试图解决这个问题..堆叠仍然有点麻烦。

2 个答案:

答案 0 :(得分:2)

您是在尝试模拟类似真实物理的东西,还是更像“Boulderdash”物理的东西?如果是后者,我建议您可以尝试不同的方法来看看“感觉”是否合适;我建议不要考虑“压力”,而是考虑音量,为每个单元格分配一个值,例如: 1/8满到完全满。然后在每个移动框架上执行以下两个操作:

  1. 从底部到顶部,如果含有水的细胞位于可能含有水但未充满的细胞上,则移动从上部细胞移动到下部细胞的水量。
  2. 从下到上,对于每个含有水的细胞,如果下面的细胞不能容纳更多的水,如果有空间,将“起始量”水的1/4转移到每一侧。

我猜想每帧执行这两个步骤应该会产生一些看似合理的水效果。它们不代表任何与真实物理相似的东西,但对于很多平台游戏来说,可玩性比现实主义更重要。

答案 1 :(得分:1)

这是我编写的一些示例代码的链接。

http://youtu.be/ZXPdI0WIvw0