Углы отражения шара Xna C#

Я пытаюсь найти способ справиться с отражениями для клона прорыва.

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

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

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

Я использую Vector2 для скорости мяча, projVel.

Это позиция projPos.

Прямоугольник для весла lightRect.

Причина я использую proj.collRect для начала, потому что я не могу использовать метод пересечения с Vector2.

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

    if (proj.collRect.Intersects(lightSaber.lightRect))
    {
                proj.projPos.Y = lightSaber.lightRect.Y - proj.projTxr.Height;
                proj.projVel.Y *= -1;

        proj.projVel.X = 10 * (proj.projPos.X - lightSaber.lightRect.Center.X) / (lightSaber.lightRect.Center.X);
    }

            proj.projVel.X = Math.Max(-4, Math.Min(proj.projVel.X, 4));
            proj.projVel.Y = Math.Max(-4, Math.Min(proj.projVel.Y, 4));

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

Я действительно не уверен, с чего начать, если есть другой способ сделать это, пример был бы великолепен.

1 ответ

Решение

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

Пример:

// NOTE: this code assumes that positive Y is down
if (proj.collRect.Intersects(lightSaber.lightRect) && projPos.projVel.Y > 0.0f) // only bounce if projectile is moving downward
{
    // remember current speed for when we calculate new velocity
    var projSpeed = projVel.Length(); 

    // make sure the projectile no longer intersects the bar
    proj.projPos = lightRect.Y - proj.projTxr.Height;

    // interpolate reflection angle
    var t = (proj.projPos.X - lightSaber.lightRect.X) / lightSaber.lightRect.Width;
    var reflectDegrees = 150.0f - t * 120f; // straight up +/- 60 degrees
    var reflectRadians = reflectDegrees * (float)Math.PI / 180.0f;

    // final velocity determined by angle and original projectile speed
    proj.projVel = new Vector2((float)Math.Cos(reflectRadians) * projSpeed, -(float)Math.Sin(reflectRadians) * projSpeed);
}
Другие вопросы по тегам