【问题标题】:color fade animation for grid cells in swing Pin摆动 Pin 中网格单元的颜色渐变动画
【发布时间】:2011-03-26 11:53:14
【问题描述】:

作为我第四年软件工程学位的一部分,我正在做一个寻路项目。 我们假设为一堆多智能体寻路算法提供视觉表示。最简单的是适用于多智能体的 A*。

无论如何,我们的环境是一个网格图,其中每个单元格都可以被阻止或用作代理路径的一部分。我想要做的是使用动画来很好地表示代理的最终移动,但在我的网格中动画颜色变化。 即用某种颜色在路径中的每一步画上一秒钟左右,以显示代理如何移动。

我想做的另一件事是通过在 A* 算法的开放列表和封闭列表中绘制变化来表示算法的工作方式,同时它进行计算。

我正在使用观察者设计模式的改编版本将事件从我的算法层发送到我的控制器和 GUI 层。 我想要在 GUI 层中做的是每次将图块添加到打开列表时,我希望将该单元格绘制成某种颜色,然后根据预定义的计时器让它消失,或者稍后添加一个滑块来控制这个计时器。

我查看了code here。看起来很简单,问题是每个瓦片动画都必须独立于其他动画,以允许算法和所有内容继续运行并启动不同的动画。

那么,实现我正在寻找的结果的最佳方法是什么?我应该为每个动画打开一个不同的线程还是为每个单元格设置一个预制线程? 这对应用程序来说是不是有点过头了,因为最多可以有 1000 个单元格,因此有接近 1000 个线程执行动画。

我想我可能会遇到的另一个问题是,一个单元格可能会开始其褪色动画,然后必须重新启动,我不希望这两个动画同时播放(只有一个线程同时为同一个单元格执行动画)。

如果有人有任何想法或认为它真的可以帮助我完成我的项目,我希望我对我想要实现的目标足够清楚。

【问题讨论】:

  • “我希望我对我想要达到的目标足够清楚,..” 直到现在经过 10 分钟的编辑,我什至可以理解你发布的那些乱七八糟的信件。所以不行。技术学位四年级的人应该能够找到他们的 shift 键并在每个句子的开头应用一次,并且每次使用“I”这个词。使用像 wanna 这样的俚语也无济于事。这些是国际论坛,很多人不会理解这个词。那些这样做的人会认为你很傻,不值得他们的关注和时间。请多加注意。

标签: java swing animation grid artificial-intelligence


【解决方案1】:

您会发现三叉戟动画库很有用。更多信息http://kenai.com/projects/trident/pages/Home

【讨论】:

  • 看起来很酷的库,它如何处理同时发生的许多动画?会有效率吗?看起来好像我必须为每个单元格创建这些时间线对象之一,难道不是像为每个单元格创建一个线程一样吗?谢谢
  • 三叉戟非常高效。查看 Kirill 的博客:pushing-pixels.org/2009/06/23/…
【解决方案2】:

我会考虑一个只有一个动画线程的场景。你可能例如尝试以下策略:

  • 摇摆事件的标准事件线程
  • 为您的逻辑提供一个工作线程
  • 所有动画只增加一个

第三个线程管理你的 gui 中的所有动画。因此,它维护了一个动画动作列表,以及它们的时间戳。这样的动作可以是例如在适当的数据结构中“将单元格 [1,2] 的颜色设置为 CF0000 @ 17:01:00”。这个动作列表然后由工作线程填充动画动作(例如,您可以一次添加多个动作以用于淡入淡出的单元格 - 1)现在设置为 100% @; 2) 设置为 75% @ now+10s; 3) 设置为 50% @ now+20s ...)。请确保此列表已正确同步,因为它将从两个线程中访问。

如果您保持此列表按时间戳排序,则很容易确定该线程在任何时候必须执行哪些操作。然后这个线程有一个非常简单的循环,例如像

while(true) {
    AnimationAction action = list.get(0);
    if(action!=null && action.timestamp <= now()) {
            action.perform(); // <= be sure that paint events occur in the edt
        list.remove(0);
        continue;
    }
    sleep(...);
}

请注意,您可以根据下一个动作的时间戳来确定睡眠时间,但要考虑到新的动画事件的到来可能不得不中断这一点。否则你也可以睡一小会儿。

关于您的第二个问题,如果有新操作到达,该线程可能会根据特殊单元格的需要从该列表中删除任何操作。因此,您可能还需要维护一个辅助数据结构以便有效地执行此操作。

【讨论】:

  • 谢谢,这就是我的想法,我不确定如何告诉 animationManager 线程它需要多长时间休眠,因为每次更改都可能发生在不同的时刻及时。线程可能应该一直保持活动状态,或者以某种方式设法唤醒队列中的下一个动画需要更改。也许我需要使用一种接近游戏中发生的机制,每次线程唤醒它都会检查它上次执行他的动作的时间,然后根据经过的时间计算颜色值变化,这是必要的吗?谢谢
  • @Amit 正如我在回答中提到的那样,您可以睡一段固定的时间(例如,对于任何类型的褪色动画来说,大约 50 到 100 毫秒的时间都可以)或者只是时间跨度动作。时间戳现在()。在后一种情况下,请务必处理必须在之前安排的新动作到达的情况,并在这种情况下中断睡眠。如果您想以您在评论中建议的其他方式处理它,那么您会遇到不同的情况。然后,您必须管理所有“正在进行的”衰落,并根据过期的时间跨度重新处理每个衰落。
  • +1 请务必在event dispatch thread上执行所有绘图。
  • 好的,谢谢,还有一个问题,你是从哪里得到 AnimationAction 类的?
【解决方案3】:

我会使用javax.swing.TimerAlphaComposite,如here 所示。

【讨论】:

    猜你喜欢
    • 2015-07-13
    • 2012-11-25
    • 1970-01-01
    • 1970-01-01
    • 2012-06-13
    • 2017-06-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多