【发布时间】:2012-02-20 18:48:51
【问题描述】:
当用户单击鼠标按钮时,我想将图形对象移向光标,但我不知道如何...
我有光标和 Graphic 对象的位置,但不知道如何更改它的 X 和 Y 以从起始位置“平滑”移动到新点(用户单击的位置)...
【问题讨论】:
当用户单击鼠标按钮时,我想将图形对象移向光标,但我不知道如何...
我有光标和 Graphic 对象的位置,但不知道如何更改它的 X 和 Y 以从起始位置“平滑”移动到新点(用户单击的位置)...
【问题讨论】:
一般做法:
有一个模型支持你的图形,并将模型中每个项目的坐标存储在模型上。
在同一个线程中更新 x 和 y 很重要,而不是独立的线程。这听起来很酷,但它失败了,因为线程调度程序有时会滞后一个线程,并且您可以在一个维度上获得 2 或 3 次更新而在另一个维度上没有相应的更新,这将导致对象在一行中移动不光滑。在大多数情况下,您应该在同一个线程中对模型(针对此动作和任何其他动作)进行所有更新。
请注意,您的模型中的 x 和 y 可能需要为浮点数或双精度数,因为您不想丢失像素的一部分,尤其是在运动速度较慢的情况下。用剩余距离表示方程避免了必须计算轨迹的角度和使用正弦/余弦函数来执行更新。但是,在某些情况下,如果您想要一个不容易转换为以剩余距离表示的复杂运动,您可能会发现计算该角度并使用正弦/余弦更容易。做一些让你的代码清晰的事情,如果需要,以后再优化。
每秒 24 次更新是电影摄影机的标准帧速率,这个数字是与人眼的flicker fusion 相关的最小值,如果您更新得慢于该值,人们会认为运动不流畅。为了获得最大的平滑度,您需要每秒超过 60 次,但这可能只对视频游戏是必需的,并且会产生更大的性能成本。选择您认为视觉上令人满意的最低更新率。
在更新线程上设置一个标志也是一个好主意,当有要更新的东西时它会打开和关闭它,这样它就不会在没有动画的时候无缘无故地请求重绘。确保标志标有 volatile 关键字,因为它将由其他线程更新。如果您同时有多个动画,您可以根据列表中动画对象的存在来打开和关闭线程(完成后将其删除)
【讨论】:
Swing timing framework 可以帮助您完成大部分繁重的工作。
【讨论】: