Изменение направления движения объекта после столкновения - PullRequest
0 голосов
/ 03 мая 2011

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 ]

2 голосов
/ 03 мая 2011

Вы не отрицаете значение Y, вы просто вычитаете его значение из себя. Возможно, вы хотели написать:

Y = -Y;

Или я что-то упустил?

1 голос
/ 03 мая 2011

Вы не меняете направление движения пузыря. наиболее подходящим решением для изменения в этот момент направления будет:

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

Эта часть кода будет перемещаться назад по пузырю только для следующего кадра, чтобы пузырь изменил абсолютно направление его движения, вам придется пересчитать радианы, чтобы получить точку, где пузырь обнаруживает столкновение и старое касание. точек.

В резюме, в каждой точке столкновения вам нужно будет пересчитать направление, в котором движется ваш пузырь, если вы достигнете цели, вы можете решить всю проблему, отразить направление в случае столкновения.

Я искал какой-то код, который у меня был, но обнаружил, что потерял его, но я надеюсь, что мои объяснения могут помочь.

Увидимся

0 голосов
/ 03 мая 2011

Сделайте это (предполагая, что 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))

Вы должны хранить либо вектор скорости, либо вектор направления между кадрами, чтобы при отражении пузырька он продолжал двигаться в этом направлении доэто отражается снова.

0 голосов
/ 03 мая 2011

Вы должны изменить местоположение и скорость.

Если у вас есть позиция (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
...