在 XNA 游戏中将重力应用于二维数组
Applying gravity to a 2D array in XNA game
我正在开发一款有点类似于俄罗斯方块的游戏。在处理重力逻辑时,我遇到了障碍。 (如果相关的话,我在 XNA 工作)
为了不浪费您的时间,我基本上有一个二维数组。有4种棋子:空(0)、蓝(1)、绿(2)、红(3)、黄(4)。
在这个游戏中,可以拼出 NxM 个相同颜色的实心方块。这是使逻辑混乱的部分。我希望它现在听起来不会太模糊,但我会展示一个例子并展示我目前的进展。
int[,] example = new int[5,5]
{
{ 0,0,1,0,4 },
{ 0,2,2,0,0 },
{ 0,2,2,2,0 },
{ 0,0,0,3,0 },
{ 1,2,2,0,0 }
};
假设这是现在的棋盘状态。如您所见,有一个 2x2 的 2(绿色)和一些漂浮在半空中的棋子。我的计划是播放那些碎片掉落的动画,直到下面的位置被占用,更新所有实体。我试图解决这个问题,如果我只是查看单个 1x1 部件的重力,它就可以正常工作。当涉及到处理 2x2 和更大的块时,它变得一团糟,我被卡住了。
我的尝试是用一个列表来跟踪游戏板上的所有块,每次调用重力更新方法时都会更新。
int[,] board = new int[6, 6];
bool[,] isBlock = new bool[board.GetLength(0), board.GetLength(1)];
List<int[]> blocks = new List<int[]>();
List<int[]> toplayAnimation = new List<int[]>();
for (int x = 0; x < board.GetLength(0); x++)
{
for (int y = 0; y < board.GetLength(1) - 1; y++)
{
if ((isBlock[x, y] == false) && (board[x, y + 1] == 0) && (board[x, y] != 0))
{
}
}
}
如果我们看一下这个例子,结果应该是棋盘被更新并且播放棋子掉落的动画它应该是这样的:
int[,] example = new int[5,5]
{
{ 0,0,0,0,0 },
{ 0,0,1,0,0 },
{ 0,2,2,0,0 },
{ 0,2,2,2,0 },
{ 1,2,2,3,4 }
};
所以我基本上有一个问题,你建议我在解决这个问题时采取什么方法?我正在考虑为块和单件设置两个单独的二维数组,并在循环中将它们进行比较。我已经坚持了两个多星期了,我似乎无法在现有线程中找到任何帮助。希望我解释得很好,提前致谢!
我想你应该看看这里:
http://farseerphysics.codeplex.com/
这样你就不会痛苦地从头开始重建整个引擎:)
还有很多:
https://gamedev.stackexchange.com/questions/318/what-are-some-known-2d-3d-physics-engines-for-xna
我正在开发一款有点类似于俄罗斯方块的游戏。在处理重力逻辑时,我遇到了障碍。 (如果相关的话,我在 XNA 工作)
为了不浪费您的时间,我基本上有一个二维数组。有4种棋子:空(0)、蓝(1)、绿(2)、红(3)、黄(4)。
在这个游戏中,可以拼出 NxM 个相同颜色的实心方块。这是使逻辑混乱的部分。我希望它现在听起来不会太模糊,但我会展示一个例子并展示我目前的进展。
int[,] example = new int[5,5]
{
{ 0,0,1,0,4 },
{ 0,2,2,0,0 },
{ 0,2,2,2,0 },
{ 0,0,0,3,0 },
{ 1,2,2,0,0 }
};
假设这是现在的棋盘状态。如您所见,有一个 2x2 的 2(绿色)和一些漂浮在半空中的棋子。我的计划是播放那些碎片掉落的动画,直到下面的位置被占用,更新所有实体。我试图解决这个问题,如果我只是查看单个 1x1 部件的重力,它就可以正常工作。当涉及到处理 2x2 和更大的块时,它变得一团糟,我被卡住了。
我的尝试是用一个列表来跟踪游戏板上的所有块,每次调用重力更新方法时都会更新。
int[,] board = new int[6, 6];
bool[,] isBlock = new bool[board.GetLength(0), board.GetLength(1)];
List<int[]> blocks = new List<int[]>();
List<int[]> toplayAnimation = new List<int[]>();
for (int x = 0; x < board.GetLength(0); x++)
{
for (int y = 0; y < board.GetLength(1) - 1; y++)
{
if ((isBlock[x, y] == false) && (board[x, y + 1] == 0) && (board[x, y] != 0))
{
}
}
}
如果我们看一下这个例子,结果应该是棋盘被更新并且播放棋子掉落的动画它应该是这样的:
int[,] example = new int[5,5]
{
{ 0,0,0,0,0 },
{ 0,0,1,0,0 },
{ 0,2,2,0,0 },
{ 0,2,2,2,0 },
{ 1,2,2,3,4 }
};
所以我基本上有一个问题,你建议我在解决这个问题时采取什么方法?我正在考虑为块和单件设置两个单独的二维数组,并在循环中将它们进行比较。我已经坚持了两个多星期了,我似乎无法在现有线程中找到任何帮助。希望我解释得很好,提前致谢!
我想你应该看看这里:
http://farseerphysics.codeplex.com/ 这样你就不会痛苦地从头开始重建整个引擎:)
还有很多:
https://gamedev.stackexchange.com/questions/318/what-are-some-known-2d-3d-physics-engines-for-xna