碰撞检测不考虑矩形的高度 wpf 画布



我正在尝试为具有高度的矩形创建碰撞检测。以下是我在画布上绘制矩形的方式。

public void DrawVerticalWalls()
{
for (int i = 0; i < 3; i++) { heightMultiplier.Add(rnd.Next(3, 15)); }
var verticalYValues = heightPoints.OrderBy(x => rnd.Next()).Take(3).ToList();
verticalWall = new Rectangle()
{
Width = SnakeSquareSize,
Height = SnakeSquareSize * heightMultiplier[0],
Fill = wallBrush
};
GamePanel.Children.Add(verticalWall);
Canvas.SetTop(verticalWall, verticalYValues[0]);
Canvas.SetLeft(verticalWall, widthPoints[0]);
}

因此,我首先生成一个随机高度乘数,并将每个乘数存储在一个列表中以用于所有矩形。然后,我还从预先编写的列表中为矩形的所有可能的 y 值生成随机数。 然后我使用这些随机生成的数字绘制矩形并将其添加到画布中。

这是我如何进行碰撞检测

if ((snakeHead.Position.X == Canvas.GetLeft(verticalWall)) && (snakeHead.Position.Y == Canvas.GetTop(verticalWall)))
{
EndGame();
}

这样做的问题是它没有考虑矩形的高度,相反,碰撞只发生在矩形的尖端,即矩形的初始 x 和 y 坐标。那么我怎样才能让它在碰撞中也包括随机高度呢?

我设法通过使用添加 20x20 个正方形而不是长矩形的 for 循环来找到解决方案。然后将每个方块的 x 和 y 坐标保存在列表中。

例如,如果高度乘数为 15,我会在彼此之上添加 15 个正方形(每个正方形具有固定且相等的高度(,而不是添加一个正方形,然后通过赋予它 15 的高度来拉伸它。

这是用于存储正方形位置的类

public class StoreWalls
{ 
public Point position { get; set; }
}

然后我只是使用这个类做了一个列表

private List<StoreWalls> listWalls = new List<StoreWalls>();

然后我制作了 for 循环,该循环根据循环之前显示的高度乘数生成的 int 重复。

int heightMultiplier = rnd.Next(3, 40);
for (int i = 0; i < heightMultiplier; i++)
{
Wall = new Rectangle() { Width = SnakeSquareSize, Height = SnakeSquareSize, Fill = wallBrush };
GamePanel.Children.Add(Wall);
Canvas.SetTop(Wall, YValues[0]);
Canvas.SetLeft(Wall, XValues[0]);
listWalls.Add(new StoreWalls()
{
position = new Point(XValues[0], YValues[0])
});
YValues[0] = YValues[0] + SnakeSquareSize;
}

最后,我通过使用foreach来获取每面墙的位置,并使用if语句将其与蛇头的位置进行比较。

foreach (StoreWalls wall in listWalls.Take(listWalls.Count))
{
if ((wall.position.X == snakeHead.Position.X) && (wall.position.Y == snakeHead.Position.Y))
{
EndGame();
}
}

最新更新