球反射角 Xna c#

ball reflection angles Xna c#

我正在尝试找到一种方法来处理突破克隆的反射。

我会上传一张图片到 post 而不是下面的段落,但是我还没有获得那个权限。

如果球与左侧相交,我希望它弹回左侧。 如果球与右侧相交,我希望它向右反弹。如果球与中间部分相交,我希望它弹起。我想学习如何根据左、右或中间部分相交的哪一侧使它在不同的方向弹跳

我不想为此使用三个单独的矩形,我想学习如何使用一个。

我使用 Vector2 作为球速度,projVel.

它的位置是projPos.

桨的矩形lightRect.

我在 if 开头使用 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。

我真的不知道从哪里开始,如果有另一种方法我可以做一个例子会很棒。

我建议您根据位置计算反射角,然后根据撞击前的角度和速度推导出速度,而不是单独操纵 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);
}