友方棋子碰撞的Unity国际象棋游戏问题
Unity chess game problem with friendly piece collision
嗨,我正在 Unity 中构建一个国际象棋游戏,我的问题是女王可以移动到友方棋子上方。
选择棋子后,会生成棋盘上的合法走法数组
legalMoves = piece.Move();
我在这里选择使用向量,因此列表中的任何移动都是二维向量。
然后在一个循环中,我检查是否有任何移动在棋盘的边界内,以及移动是否会将棋子放在另一个友好的棋子上。如果是,则丢弃该移动,但我的问题是它应该丢弃该方向内的所有移动。
例如:如果皇后在(3,3)上,(3,5)上有兵,那么所有的走法(3,6),(3,7)...都应该是丢弃但不丢弃 (3,4)。
类似地,如果黑皇后在 (7,7) 上,兵在 (7,5) 上,则所有移动 (7,4)、(7,3)、(7,2) ..应该丢弃而不是 (7,6).
我的直觉是,当一个矢量上有友方棋子时,检查我对它的所有合法移动的方向和长度:
if (dir.normalized.Equals(temp[j].normalized) && dir.SqrMagnitude() < temp[j].SqrMagnitude())
我们的想法是从 legalmoves 中删除所有方向相同但长度更长的向量,但这似乎并没有真正起作用,因为归一化向量将不相等。
这里是相关代码
foreach (var dir in legalMoves)
{
if (0 <= dir.x && dir.x <= 7 && 0 <= dir.y && dir.y <= 7)
{
//TODO shrink this to 1d array search
if (board[(int) dir.x, (int) dir.y].getPiece() == null)
{
Instantiate(trail, dir, Quaternion.identity);
}
else
{
List<Vector2> temp = legalMoves.ToList();
GameObject[] trails = GameObject.FindGameObjectsWithTag("bullet");
for (int j = 0; j< temp.Count; j++)
{
if ( dir.normalized.Equals(temp[j].normalized) && dir.SqrMagnitude() < temp[j].SqrMagnitude())
{
foreach(var t in trails)
{
// remove trail
if (t.transform.position.Equals(temp[j])) Destroy(t);
}
// remove the move with the same direction
temp.Remove(temp[j]);
}
}
temp.Remove(dir);
legalMoves = temp.ToArray();
}
}
}
这是我的问题可视化chess collision issue
好的,也许有更好的解决方案,但是,我设法做到的方法如下:
我们的皇后 = q 在 (3,0) ,被阻挡的棋子 = k 在 (3,6),
如果我们计算从 k 到 q 的偏移量,我们总是得到一个轴,它是 0(x 或 y),在这种情况下它是 x。
因为我们知道轴是 0,所以我们可以使用布尔值检查哪个轴是 0,在本例中是 x,并且简单地丢弃所有在 x 上且高于 6 或低于 6 的黑色棋子的合法移动.
我还没有想过如果一个棋子在水平方向上有障碍物怎么办,但是我确定这只是一个像上面那样添加/减去正确坐标的问题。
嗨,我正在 Unity 中构建一个国际象棋游戏,我的问题是女王可以移动到友方棋子上方。
选择棋子后,会生成棋盘上的合法走法数组
legalMoves = piece.Move();
我在这里选择使用向量,因此列表中的任何移动都是二维向量。
然后在一个循环中,我检查是否有任何移动在棋盘的边界内,以及移动是否会将棋子放在另一个友好的棋子上。如果是,则丢弃该移动,但我的问题是它应该丢弃该方向内的所有移动。
例如:如果皇后在(3,3)上,(3,5)上有兵,那么所有的走法(3,6),(3,7)...都应该是丢弃但不丢弃 (3,4)。
类似地,如果黑皇后在 (7,7) 上,兵在 (7,5) 上,则所有移动 (7,4)、(7,3)、(7,2) ..应该丢弃而不是 (7,6).
我的直觉是,当一个矢量上有友方棋子时,检查我对它的所有合法移动的方向和长度:
if (dir.normalized.Equals(temp[j].normalized) && dir.SqrMagnitude() < temp[j].SqrMagnitude())
我们的想法是从 legalmoves 中删除所有方向相同但长度更长的向量,但这似乎并没有真正起作用,因为归一化向量将不相等。
这里是相关代码
foreach (var dir in legalMoves)
{
if (0 <= dir.x && dir.x <= 7 && 0 <= dir.y && dir.y <= 7)
{
//TODO shrink this to 1d array search
if (board[(int) dir.x, (int) dir.y].getPiece() == null)
{
Instantiate(trail, dir, Quaternion.identity);
}
else
{
List<Vector2> temp = legalMoves.ToList();
GameObject[] trails = GameObject.FindGameObjectsWithTag("bullet");
for (int j = 0; j< temp.Count; j++)
{
if ( dir.normalized.Equals(temp[j].normalized) && dir.SqrMagnitude() < temp[j].SqrMagnitude())
{
foreach(var t in trails)
{
// remove trail
if (t.transform.position.Equals(temp[j])) Destroy(t);
}
// remove the move with the same direction
temp.Remove(temp[j]);
}
}
temp.Remove(dir);
legalMoves = temp.ToArray();
}
}
}
这是我的问题可视化chess collision issue
好的,也许有更好的解决方案,但是,我设法做到的方法如下:
我们的皇后 = q 在 (3,0) ,被阻挡的棋子 = k 在 (3,6),
如果我们计算从 k 到 q 的偏移量,我们总是得到一个轴,它是 0(x 或 y),在这种情况下它是 x。
因为我们知道轴是 0,所以我们可以使用布尔值检查哪个轴是 0,在本例中是 x,并且简单地丢弃所有在 x 上且高于 6 或低于 6 的黑色棋子的合法移动.
我还没有想过如果一个棋子在水平方向上有障碍物怎么办,但是我确定这只是一个像上面那样添加/减去正确坐标的问题。