碰撞后反转物体的方向

时间:2011-05-03 06:14:45

标签: c# visual-studio-2010 windows-phone-7 xna

Edit2:请参阅下面的新问题。

我正在创建一个Windows Phone 7游戏并遇到了一些困难。我要做的是使用转换为弧度的触摸屏坐标以一定角度向上发射物体。那部分工作正常。

然而,我无法弄清楚如何使物体从侧壁反弹。我让它在早期的实现中工作,这只是在与墙碰撞时否定Y值的问题。不幸的是,这次并不容易。当物体撞击墙壁时,它会从墙壁反弹一小段距离,然后再向墙壁改变方向。

我如何构建我的代码,以便它不再被推到墙上?

谢谢。

//Move bubble
public void MoveBubble(Bubble b, double radians)
{
    if (b.stop == false)
    {
        {
            //Move bubble 'up'
            Y = (float)(speed * Math.Cos(radians));
            X = (float)(speed * Math.Sin(radians));
    }

    b.bubblePosX += X;
    b.bubblePosY += Y;

    //Problem area
    if(b.bubblePosY <= 0)
        Y-=Y;

    if(b.bubblePosY >= 350)
        Y-=Y;
}


//Calculate Angle
private void CalculateAngle(int touchX, int touchY)
{
    radians = (Math.Atan2(touchX - bubbleStart.X, touchY - bubbleStart.Y));
}

Edit2:只想添加最新代码。现在球完全从墙上反弹了,但我有一个方向bool被初始化为真的问题。有时,在射击物体时,角度会反转。如何将初始bool设置为适当的true / false值?

    //Move bubble
    public void MoveBubble(Bubble bubble, Vector2 distance)
    {
        if (bubble.stop == false)
        {
            float velocityX = speed * distance.X;
            float velocityY = speed * distance.Y;

            bubble.X += velocityX;

            if (direction == true)
                bubble.Y += velocityY;

            if (direction == false)
                bubble.Y -= velocityY;

            if (bubble.Y <= 0)
                direction = !direction;

            if (bubble.Y >= 350)
                direction = !direction;
        }
    }

4 个答案:

答案 0 :(得分:2)

你不是否定Y值,你只是从它自身中减去它的价值。也许你打算写:

Y = -Y;

或者我错过了什么?

答案 1 :(得分:1)

你没有扭转泡沫运动的方向。最合适的解决方案是在那一刻改变方向:

public void MoveBubble(Bubble b, double radians)
{
    if (b.stop == false)
    {
        {
           //Move bubble 'up'
            Y = (float)(speed * Math.Cos(radians));
            X = (float)(speed * Math.Sin(radians));
        }

        b.bubblePosX += X;

        //Problem area
        if(b.bubblePosY <= 0 || b.bubblePosY >= 350)
            b.bubblePosY -= Y;
        else
            b.bubblePosY += Y;
    }
}

这部分代码会向下移动泡泡仅用于下一帧,为了让泡沫完全改变其运动方向,你将不得不重新计算弧度,以获得泡沫发现碰撞的点和旧触摸分。

在简历中,在每个碰撞点,你必须重新计算你的泡泡的方向,如果你的目标,你可以解决整个问题,反映碰撞的方向。

我正在寻找一些代码,但我发现我已经失去了它,但我希望mi的解释能有所帮助。

见到你

答案 2 :(得分:0)

您必须更改位置速度。

如果你的位置为(0,-1)且速度为(1,-1)并且你不能有负值,你必须切换y值(以弥补速度) )到(0,1)并将速度改为负值(1,1)。

所以,loc(ation)和vel(ocity)必须改变,例如:

loc(0, 1), vel(0, -1)  // OK

loc(0, 0), vel(0, -1)  // switch vel to y=-y; (so -1 becomes 1)

loc(0, -2), vel(1, -3) // switch loc to it's positive value, loc(0, 2)
                       // and the vel to it's opposite (1, 3)

loc(-1, -3), vel(-2, -4) // loc is set to (1, 3) an vel to (2, 4)
                         // since both X and Y have been breached

答案 3 :(得分:0)

这样做(假设X和Y是速度):

if(b.bubblePosY <= 0 && Y < 0)
    Y = -Y;

if(b.bubblePosY >= 350 && Y > 0)
    Y = -Y;

您的代码中发生的事情是您的气泡卡在墙上。上面的代码只反映了气泡移动到墙上的方向。一旦它移出墙壁,就会忽略那堵墙。

此外,不是根据位置差异计算角度然后将其转换回方向向量,而是尝试简单地将位置差异归一化以获得方向向量(单位向量;长度= 1):

Vector2.Normalize(new Vector2(touchX - bubbleStart.X, touchY - bubbleStart.Y))

你应该在帧之间存储速度矢量或方向矢量,这样当你反映你的气泡时它就会朝着那个方向前进,直到它再次被反射。