【问题标题】:Move a Graphic object towards the cursor将图形对象移向光标
【发布时间】:2012-02-20 18:48:51
【问题描述】:

当用户单击鼠标按钮时,我想将图形对象移向光标,但我不知道如何...

我有光标和 Graphic 对象的位置,但不知道如何更改它的 X 和 Y 以从起始位置“平滑”移动到新点(用户单击的位置)...

【问题讨论】:

    标签: java graphics


    【解决方案1】:

    一般做法:

    有一个模型支持你的图形,并将模型中每个项目的坐标存储在模型上。

    1. 添加 MouseListener 并实现 mousedown
    2. 在您的侦听器中抓取鼠标事件的 X、Y。
    3. 决定要以多快的速度移动对象(恒定速度?到达光标的恒定时间?加速?减速?)
    4. 写一个方程来描述朝向光标的运动,最好是根据要覆盖的剩余距离。对于一个非常快速的减速方法,它可能是 distanceRemaining/5。 (例如)。其他动作需要一点几何/代数,但那是你的工作:)
    5. 创建一个对象,封装了上述逻辑,并有一个标志来判断动画何时完成。
    6. 使用“动画”线程(或上面提到的计时框架,我没用过)每秒对模型的 X 和 Y 坐标执行 24 次或更多更新在 X 和 Y 方向上剩余的距离并调用 repaint()。线程应该这样做,直到动画完成标志为真,然后停止调用 repaint()。
    7. Java 将以它知道自己可以处理的速率为您调用绘制函数(如果调用速度过快,它会为您合并额外的调用,并防止您因积压的绘制调用而锁定程序) .每当 java 选择调用它时,您的绘制函数应该简单地根据模型的当前状态绘制模型。

    在同一个线程中更新 x 和 y 很重要,而不是独立的线程。这听起来很酷,但它失败了,因为线程调度程序有时会滞后一个线程,并且您可以在一个维度上获得 2 或 3 次更新而在另一个维度上没有相应的更新,这将导致对象在一行中移动不光滑。在大多数情况下,您应该在同一个线程中对模型(针对此动作和任何其他动作)进行所有更新。

    请注意,您的模型中的 x 和 y 可能需要为浮点数或双精度数,因为您不想丢失像素的一部分,尤其是在运动速度较慢的情况下。用剩余距离表示方程避免了必须计算轨迹的角度和使用正弦/余弦函数来执行更新。但是,在某些情况下,如果您想要一个不容易转换为以剩余距离表示的复杂运动,您可能会发现计算该角度并使用正弦/余弦更容易。做一些让你的代码清晰的事情,如果需要,以后再优化。

    每秒 24 次更新是电影摄影机的标准帧速率,这个数字是与人眼的flicker fusion 相关的最小值,如果您更新得慢于该值,人们会认为运动不流畅。为了获得最大的平滑度,您需要每秒超过 60 次,但这可能只对视频游戏是必需的,并且会产生更大的性能成本。选择您认为视觉上令人满意的最低更新率。

    在更新线程上设置一个标志也是一个好主意,当有要更新的东西时它会打开和关闭它,这样它就不会在没有动画的时候无缘无故地请求重绘。确保标志标有 volatile 关键字,因为它将由其他线程更新。如果您同时有多个动画,您可以根据列表中动画对象的存在来打开和关闭线程(完成后将其删除)

    【讨论】:

      【解决方案2】:

      Swing timing framework 可以帮助您完成大部分繁重的工作。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-10-03
        • 2018-09-13
        • 2013-06-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-08-26
        • 2011-03-14
        相关资源
        最近更新 更多