【问题标题】:Collision detection doesn't take the height of the rectangle into consideration wpf canvas碰撞检测不考虑矩形的高度 wpf canvas
【发布时间】:2020-02-17 17:28:30
【问题描述】:

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

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 坐标。那么如何让它在碰撞中也包含随机高度呢?

【问题讨论】:

  • 请不要将代码发布为图片
  • 我很抱歉,我是新手,我已经相应地编辑了我的问题!

标签: c# wpf xaml canvas


【解决方案1】:

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

例如,如果高度乘数为 15,我将在彼此顶部添加 15 个正方形(每个正方形具有固定且相等的高度),而不是添加单个正方形,然后通过给它一个高度为 15。

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

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

然后我就用这个类做了一个列表

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

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

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();
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-12
    • 2016-08-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多