【问题标题】:Water Physics In a Tile Based Platformer基于瓷砖的平台游戏中的水物理
【发布时间】:2012-05-01 23:24:39
【问题描述】:

我正在为我的 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);

                    }
                }
            }
        }
    }

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

编辑:也许我需要水砖的压力参数?或者不...现在正在尝试解决这个问题..堆叠仍然有点麻烦。

【问题讨论】:

    标签: c# .net xna physics


    【解决方案1】:

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

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

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

    【讨论】:

    • 我在想这样的事情youtube.com/…
    • 我想了想又想通了!只需修复一些小错误
    • @Cyral:有趣的视频剪辑。我的倾向是让与瓷砖相关的图形包括可变数量的水,从底部填充,而不是蓝色阴影(至少达到 100% 标称容量)。如果您想要深度均衡,较深的蓝色阴影可能适用于更高的压力,但我认为这可能会使事情复杂化,我不知道它对可玩性是好是坏。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-29
    • 2012-01-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多