Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/283.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用相交开关的椭圆反弹_C#_Wpf_Collision Detection - Fatal编程技术网

C# 使用相交开关的椭圆反弹

C# 使用相交开关的椭圆反弹,c#,wpf,collision-detection,C#,Wpf,Collision Detection,我有一个应用程序,其中是球(椭圆)和4个矩形(每个矩形代表窗口的边缘)。我试着写一个应用程序,让球从边缘移动和反弹。我不知道如何制作一种方法,当碰撞为真时,球改变方向 XAML: 所以我在InitMove()中尝试了类似的smth。这只是一个测试代码,向您展示什么是问题 private void InitMove() { ....... if (CollisionDetection()) { if (isMovingLeft) {

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

XAML:

所以我在InitMove()中尝试了类似的smth。这只是一个测试代码,向您展示什么是问题

private void InitMove()
{
    .......
    if (CollisionDetection())
    {
        if (isMovingLeft)
        {
            isMovingLeft = false;
            isMovingRight = true;
        }
    }
所以球从左到右改变了方向。现在还可以

现在,当我想输入下一个“如果”时,问题就开始了

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

如何使它正确

//编辑

当我添加其他

if (isMovingLeft)
{
    isMovingLeft = false;
    isMovingRight = true;
}
else if (isMovingRight)
{
    isMovingRight = false;
    isMovingLeft = true;
}
球刚停在窗户边上

//编辑2

好吧,我想我知道怎么对你做这个

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

所以我增加了一些动作来把球推出墙外。我现在看不到其他方法。

您应该添加一个
否则
语句:

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

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


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

现在球只是停在边缘。当我添加你的陈述时,球只是停在边缘。单if if(isMovingLeft){…}在没有其他ofc的情况下工作。可能你总是反转
isMovingLeft
IsMovingRight
,因为球总是在碰撞中,请尝试在碰撞检查后放置使球移动的代码。在主柱中张贴结果。问题是如何将它们推回墙外:D
if (isMovingLeft)
{
    isMovingLeft = false;
    isMovingRight = true;
}
else if (isMovingRight)
{
    isMovingRight = false;
    isMovingLeft = true;
}
if (isMovingLeft)
{
    isMovingLeft = false;
    isMovingRight = true;
    ballDirectionX += 2;
}
else if (isMovingRight)
{
    isMovingRight = false;
    isMovingLeft = true;
    ballDirectionX -= 2;
}
    if (isMovingLeft)
    {
        isMovingLeft = false;
        isMovingRight = true;
    }
    else if (isMovingRight)
    {
        isMovingRight = false;
        isMovingLeft = true;
    }