【问题标题】:MouseJointDef libgdx - draw a trajectory line like Angry BirdsMouseJointDef libgdx - 像愤怒的小鸟一样画一条轨迹线
【发布时间】:2012-05-01 17:30:10
【问题描述】:

在 libgdx 游戏中

我想 touchDown 然后拖动某处,然后在释放 (touchUp) 时根据与目标主体的距离和方向应用方向力。当您触地时,目标身体保持静止,然后在触地时沿所需轨迹施加力。

(非常类似于愤怒的小鸟——当你拿着弹弓时,你可以看到目标身体的虚线轨迹——我也想这样做)

所以我想这可能不是最难做的事情,但考虑到一些选项,我倾向于使用 MouseJointDef,但它会立即施加力(即目标立即移动 - 我希望它保持静止,然后一旦touchup 事件发生然后施加力)

绘制轨迹最简单的方法是什么?我也在使用 Box2D。

【问题讨论】:

    标签: java libgdx box2d


    【解决方案1】:

    创建一个继承InputAdapter类的类,然后创建它的一个实例并注册它来监听触摸输入。

        Gdx.input.setInputProcessor(inputAdapter);
    

    有 3 种方法可以处理您必须覆盖的触摸事件 touch_down、touch_dragged 和 touch_up。

    在touch_down中,检查触摸位置是否在鸟区。如果是,则将布尔标志设为 true。

    在touch_dragged中,检查上面的标志,如果是真的,计算触摸位置相对于小鸟射击中心的距离和射击角度。

    在touch_up,您可以通过调用来订购计算数量的拍摄

        body2shoot.applyLinearImpulse(impulse, body2shoot.getWorldCenter());
    

    无需MouseJointDef 即可移动body2shoot。只需将body2shoot的变换设置在触摸位置,以便在每个渲染周期中拖动即可。

    为了计算轨迹,我写了一个这样的类:

    public class ProjectileEquation
    {
    public float gravity;
    public Vector2 startVelocity = new Vector2();
    public Vector2 startPoint = new Vector2();
    
    public ProjectileEquation()
    {   }
    
    public float getX(float t)
    {
        return startVelocity.x*t + startPoint.x;
    }
    
    public float getY(float t)
    {
        return 0.5f*gravity*t*t + startVelocity.y*t + startPoint.y;
    }
    }
    

    为了绘制它,我设置了startPoint 和startVelocity,然后在循环中我逐步给出t(时间)并调用getX(t) 和getY(t)。

    【讨论】:

    • @Aliaaa 虽然这个话题很老了,但我想问一下你如何计算你想要施加到身体上的冲动,因为身体有不同的质量......等等。一个例子会很棒!
    • @george 这个公式不是我发明的,它是受重力影响移动物体的物理基本公式:x = v0 * t + x0; y = 0.5 * a * t^2 + v0 * t + x0;
    • 我知道它是一个公式。我已经尝试从这里blog.gemserk.com/2012/07/03/… 遵循相同的示例,但它适用于绘制精灵,但在移动球时它并不完全有效。这就是为什么我想问你在你说 applyLinearImpulse 的冲动中传递了什么。一个完整的例子会很棒!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多