我将水物理添加到我的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参数?或者不......现在试图解决这个问题..堆叠仍然有点麻烦。
答案 0 :(得分:2)
您是在尝试模拟类似真实物理的东西,还是更像“Boulderdash”物理的东西?如果是后者,我建议您可以尝试不同的方法来看看“感觉”是否合适;我建议不要考虑“压力”,而是考虑音量,为每个单元格分配一个值,例如: 1/8满到完全满。然后在每个移动框架上执行以下两个操作:
我猜想每帧执行这两个步骤应该会产生一些看似合理的水效果。它们不代表任何与真实物理相似的东西,但对于很多平台游戏来说,可玩性比现实主义更重要。
答案 1 :(得分:1)
这是我编写的一些示例代码的链接。