gpt4 book ai didi

flash - 如何在 AS3 中使用抛物线公式来发射始终拦截给定点的箭头

转载 作者:行者123 更新时间:2023-12-04 17:57:16 25 4
gpt4 key购买 nike

第一个注意事项:从数学上讲,我一点也不熟练。

不久前我在 iPhone 上玩了一个游戏,你按下一个点,然后从你的城堡射出一支箭,它总是与你按下的点相交。我想做一个类似的游戏,认为这会是一个简单的快速制作;然后我意识到这方面的数学实际上超出了我的技能水平。

我假设他们使用抛物线公式或其他东西来确定箭头发射时所需的速度和角度,以便箭头始终与单击的点相交。

我只依稀记得抛物线是如何在学校工作的,并且没有机会计算出任何公式。

任何可能更容易实现的数学帮助或想法都会很棒。

我想在我的城堡中结束一个函数,如下所示:

package
{
import avian.framework.objects.AvElement;

public class Castle extends AvElement
{
/**
* Fires an arrow from this
* @param ix The x intersection point
* @param iy The y intersection point
*/
public function fire(ix:Number, iy:Number):void
{
var ar:Arrow = new Arrow();

ar.x = x;
ar.y = y;

// define angle and velocity based on ix, iy
// ar.fireAngle = ??
// ar.fireVelocity = ??

parent.addChild(ar);
}
}
}

更新 根据评论中的问题:

不会有风、摩擦力等作用力施加在箭上。此外,箭的起点在整个游戏中都是固定的(在城堡)。

这是一个示例图像,以提高清晰度:
Arrow path

尽可能清楚:
  • Arrow 总是从一个固定点开始它的旅程(比如:40、120)。
  • 箭头必须始终拦截给定的坐标。
  • 一条尽可能现实的路径是我想要实现的(显然我可以直接发射一个箭头来拦截任何点,但 目标 是让箭头先上升,然后下降;穿过在其旅程中最现实的点所需的坐标)。

  • 注:为了避免出现无限可能的抛物线的问题——箭头的速度可以固定——只需看看定义箭头可以离开的角度。

    最佳答案

    可以描述弹丸通过引力场的飞行路径
    通过应用 equations of motion

    我将使用的方程是

    1. v = u + at
    2. s = ut + (at^2)/2

    在哪里

    s = 初始位置和最终位置之间的距离
    u = 初始速度
    v = 最终速度
    a = 恒定加速度
    t = 从初始状态移动到最终状态所需的时间

    好的。为了动画这个箭头,我们将计算它的新速度和位置
    基于其先前速度、位置和
    加速度。在这种情况下,加速度完全是由于重力。

    让我们简化和测量以帧而不是秒为单位的时间间隔。
    这给了我们 t = 1 上面的方程,允许我们将它们重写为
    1. v = u + a*1           => v = u + a
    2. s = u*1 + (a*1^2)/2 => s = u + a/2

    现在在 x 方向上的加速度 a = 0(我们不考虑阻力
    帐户)。在 y 方向 a = g,重力加速度。如果我们重写
    这些方程用于解决我们得到的每个轴

    对于 x:
    1. vx = ux + 0        => vx = ux (no change so we'll ignore this)
    2. sx = ux + 0/2 => sx = ux (convenient eh?)

    对于 y:
    1. vy = uy + g
    2. sy = uy + g/2

    因此,让我们将它们插入示例脚本中
    public class Arrow extends Sprite
    {
    //g is constant
    //it's actually closer to 10 but this is our world
    public static const g:Number = 2;

    //our arrow
    private var arrow:Shape;

    //start velocities
    private var ux:Number;
    private var uy:Number;

    public function Arrow()
    {
    arrow = new Shape();
    arrow.graphics.lineStyle( 1, 0 );
    arrow.graphics.lineTo( 30, 0 );
    }

    public function fire( vx:Number, vy:Number ):void
    {
    ux = vx;
    uy = vy;
    addChild( arrow );
    addEventListener( Event.ENTER_FRAME, fly );
    }

    private function fly( e:Event ):void
    {
    //lets use our equations
    var sx:Number = ux; //distance moved in x dir

    var vy:Number = uy + g //new velocity in y dir
    var sy:Number = uy + g/2 //distance moved in y dir

    //apply to arrow
    arrow.x += sx;
    arrow.y += sy;

    //save new y velocity
    uy = vy;

    //extra bonus rotation of arrow to point in the right direction
    arrow.rotation = Math.atan2( uy, ux ) * 180 / Math.PI;

    }

    }

    关于flash - 如何在 AS3 中使用抛物线公式来发射始终拦截给定点的箭头,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5958164/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com