将Graphic对象移向光标

时间:2012-01-27 19:41:55

标签: java graphics

我想在用户点击鼠标按钮时将Graphics对象移向光标,但我不知道如何...

我有光标和Graphic对象的位置,但是没有关于我如何改变其X和Y以从开始位置到新点(用户点击的位置)进行“平滑”移动的线索......

2 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

一般方法:

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

  1. 添加MouseListener并实现mousedown
  2. 在你的听众中抓住鼠标事件的X,Y。
  3. 决定你想要移动物体的速度(恒定速度?到达光标的恒定时间?正在加速?减速?)
  4. 写一个描述朝向光标的运动的方程式,最好是根据要覆盖的剩余距离。对于一个非常快速的减速方法,可能是distanceRemaining / 5。 (例如)。其他动作需要一些几何/代数,但这是你的工作:)
  5. 创建一个封装上述逻辑的对象,并有一个标志来确定动画何时完成。
  6. 使用“动画”线程(或上面提到的时序框架,我还没有使用它)每秒执行24次或更多次更新到模型的X和Y坐标基于X和Y方向的剩余距离并调用repaint()。线程应该这样做,直到动画完成标志为真,然后停止调用repaint()。
  7. 然后Java会以你知道它可以处理的速率为你调用paint函数(如果你调用得太快,它将为你合并额外的调用,并阻止你用一堆绘画调用锁定程序) 。只要java选择调用它,你的绘图函数就应该根据它的当前状态绘制模型。
  8. 在同一个线程中更新x和y非常重要,而不是独立的线程。这听起来很酷,但它失败了,因为线程调度程序有时会滞后一个线程,你可以在一个维度上获得2或3个更新而在另一个维度上没有相应的更新,这将导致对象在一行中移动不光滑。在大多数情况下,您应该在同一个线程中对模型(对于此动作和任何其他动作)进行所有更新。

    请注意您的x&你的模型中的y可能需要浮动或加倍,因为你不想松散像素的分数,特别是如果运动要慢。以剩余距离表示等式避免了必须计算轨迹的角度并使用正弦/余弦函数来执行更新。但是,在某些情况下,您可能会发现更容易计算该角度并使用正弦/余弦代替,如果您想要一个不易变换的复杂运动以剩余距离表示。做什么使您的代码清晰,如果需要,稍后进行优化。

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

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