球反射角 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);
}
我正在尝试找到一种方法来处理突破克隆的反射。
我会上传一张图片到 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);
}