C # XNA Точные коллизии?

Эй, парень, я играю в Paddle / Pong, и сейчас я пытаюсь выяснить, как сделать точное столкновение между моим веслом и моим мячом. В настоящее время это базовое столкновение, если мяч попадает в левую сторону с заданной скоростью x и скоростью y ... и т. д., но я хочу выяснить, как сделать так, чтобы это отражалось на направлении, как показано ниже:

введите описание изображения здесь

Есть какой-либо способ сделать это? любая помощь будет наиболее ценной.

c#,xna,collision-detection,

1

Ответов: 4


"за" 2 "за" принято

Ваши примеры могут быть обработаны, отрицая yскорость и сохраняя xскорость.

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


Остерегайтесь призраков тоже. И под этим я подразумеваю, что скорость мяча может быть достаточно большой, чтобы не было никакого кадра (или обновления рутинного вызова), в котором мяч фактически пересекается с битой, поэтому вы не сможете обнаружить столкновение. Смотрите мою иллюстрацию. В нем мяч в двух разных кадрах пересекался с битой, хотя прямого пересечения не было. Результатом этого будет то, что мяч прошел «через» летучую мышь и волшебным образом появился на другой стороне.

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

Самый простой способ решить эту проблему - рассмотреть летучую мышь как горизонтальную линию, тогда вы можете выполнить простую проверку пересечения линии с линией. Если они пересекаются, произошло столкновение. Более сложным способом было бы сделать пересечение линии / вектора-прямоугольника. Преимущество этого состоит в том, что вы также сможете обнаруживать столкновения с углами, которые являются важной частью игры в понг / прорыв.


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


protected override void Update(GameTime gameTime)
{
    ballrect = new Rectangle((int)ballpos.X, (int)ballpos.Y,
                             ball.Width, ball.Height);

    paddlerect = new Rectangle((int)paddlepos.X, (int)paddlepos.Y,
                               paddle.Width, paddle.Height);

    ms = Mouse.GetState();
    paddlepos.X = ms.X;

    if (ballrect.Intersects(paddlerect))
    {
        bhpaddle();
    }

    ballpos += ballvel;

    if (ballrect.Y>= paddlerect.Y)
    {
        ballpos = new Vector2(400, 480);
        bhpaddle();
        ballpos += ballvel;
        l--;
    }

    base.Update(gameTime);
}



public void bhpaddle()
{
    ballvel.Y *= -1;
}
C #, XNA, столкновение обнаружения,
Похожие вопросы