椭圆反弹使用IntersectsWith

本文关键字:IntersectsWith | 更新日期: 2023-09-27 18:12:47

我有一个应用程序,其中是球(椭圆)和4个矩形(每个窗口的边缘)。我试着写一个应用程序,其中球从边缘移动和反弹。我不知道如何使一个方法,球改变一个方向时,碰撞是真的。

XAML:

<Window x:Class="naszybkodlatestu.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="MainWindow" Height="320" Width="640">
<Canvas>
    <Rectangle Name="boardTop"
               Height="2"
               Fill="Black"
               Width="609" Canvas.Left="7" Canvas.Top="10"/>
    <Rectangle Name="boardLeft"
               Height="270"
               Fill="Black"
               Width="2" Canvas.Left="614" Canvas.Top="10"/>
    <Rectangle Name="boardRight"
               Height="269"
               Fill="Black"
               Width="2" Canvas.Left="7" Canvas.Top="12"/>
    <Rectangle Name="boardBot"
               Height="2"
               Fill="Black"
               Width="609" Canvas.Left="7" Canvas.Top="278" />
    <Ellipse Name="ball"
             Width="15"
             Height="15"
             Fill="Red" 
             Canvas.Left="303" 
             Canvas.Top="107"/>
</Canvas>
</Window>
c#:

DispatcherTimer dTimer;
private void InitTimer()
{
    dTimer = new DispatcherTimer();
    dTimer.Tick += new EventHandler(TickdTimer);
    dTimer.Interval = new TimeSpan(0, 0, 0, 0, 1);
    dTimer.Start();
}
public MainWindow()
{
    InitializeComponent();
    InitTimer();
    InitMove();
}
private bool isMovingUp = false;
private bool isMovingDown = false;
private bool isMovingLeft = true;
private bool isMovingRight = false;
private double ballDirectionX = 0;
private double ballDirectionY = 0;
private double ballSpeed = 1;
private bool CollisionDetection()
{
    if (CheckCollision(ball, boardBot) || CheckCollision(ball, boardRight) ||
        CheckCollision(ball, boardTop) || CheckCollision(ball, boardLeft))
    {
        return true;
    }
    else return false;
}
public static bool CheckCollision(FrameworkElement a, FrameworkElement b)
{
    Rect rect1 = new Rect((double)a.GetValue(Canvas.LeftProperty), (double)a.GetValue(Canvas.TopProperty), a.Width, a.Height);
    Rect rect2 = new Rect((double)b.GetValue(Canvas.LeftProperty), (double)b.GetValue(Canvas.TopProperty), b.Width, b.Height);
    if (rect1.IntersectsWith(rect2))
    {
        return true;
    }
        else return false;
}
private void InitMove()
{
    if (isMovingDown)
    {
        ballDirectionY += ballSpeed;
    }
    if (isMovingUp)
    {
        ballDirectionY -= ballSpeed;
    }
    if (isMovingLeft)
    {
        ballDirectionX -= ballSpeed;
    }
    if (isMovingRight)
    {
        ballDirectionX += ballSpeed;
    }
    ball.SetValue(Canvas.TopProperty, ballDirectionY);
    ball.SetValue(Canvas.LeftProperty, ballDirectionX);
}

所以我在InitMove()中尝试了类似的方法。这只是一个测试代码,告诉你哪里出了问题。

private void InitMove()
{
    .......
    if (CollisionDetection())
    {
        if (isMovingLeft)
        {
            isMovingLeft = false;
            isMovingRight = true;
        }
    }

所以球从左向右改变了方向。

现在问题开始了,当我想把下一个"if"。

private void InitMove()
{
    .......
    if (CollisionDetection())
    {
        if (isMovingLeft)
        {
            isMovingLeft = false;
            isMovingRight = true;
        }
        if (isMovingRight)
        {
            isMovingRight = false;
            isMovingLeft = true;
        }
    }

现在球经过矩形的边缘,没有反弹。这就是我的问题。

如何让它正确?

//编辑

当我添加else

if (isMovingLeft)
{
    isMovingLeft = false;
    isMovingRight = true;
}
else if (isMovingRight)
{
    isMovingRight = false;
    isMovingLeft = true;
}

球刚停在窗边。

//EDIT2

好了,我想我知道怎么做了谢谢你

if (isMovingLeft)
{
    isMovingLeft = false;
    isMovingRight = true;
    ballDirectionX += 2;
}
else if (isMovingRight)
{
    isMovingRight = false;
    isMovingLeft = true;
    ballDirectionX -= 2;
}

所以我增加了一些动作来推动这个球出墙碰撞。

椭圆反弹使用IntersectsWith

您应该添加一个else语句:

    if (isMovingLeft)
    {
        isMovingLeft = false;
        isMovingRight = true;
    }
    else if (isMovingRight)
    {
        isMovingRight = false;
        isMovingLeft = true;
    }

当球向左移动时,您的两个if语句相互抵消。首先检查它是否向左移动,并设置为向右移动。然后立即计算下一个if语句,将其更改为再次向左移动。每次代码运行时都会发生这种情况。

您需要将第二个if语句更改为else if,因此它不会在同一帧中执行这两个操作。此外,弹跳可能会看起来有点奇怪,除非你将它们从墙上推出相同的量,但这是另一个问题。