Java 将图形对象移向光标

Java 将图形对象移向光标,java,graphics,Java,Graphics,我想在用户单击鼠标按钮时将图形对象移向光标,但我不知道如何 我有光标和图形对象的位置,但不知道如何更改其X和Y,使其从起始位置“平滑”移动到新点(用户单击的位置).摆动可以帮助您完成大部分繁重的工作。一般方法: 让模型支持图形,并将模型中每个项目的坐标存储在模型上 添加MouseListener并实现mousedown 在侦听器中,获取鼠标事件的X,Y 决定移动对象的速度(恒定速度?到达光标的恒定时间?加速?减速?) 写一个方程式来描述朝向光标的运动,最好是根据剩余的覆盖距离。对于非常快的减速进

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

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

摆动可以帮助您完成大部分繁重的工作。

一般方法:

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

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

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

    每秒24次更新是电影摄影机的标准帧速率,并且该数字是与人眼的速度相关的最小值,如果更新速度低于该速度,人们会认为运动是不稳定的。要获得最大的平滑度,你可能需要每秒60次以上,但这可能只是视频游戏所必需的,而且会造成更大的性能成本。选择视觉上令人满意的最低更新率

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