Углы отражения шара 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);
}