我正在做一个寻路项目,作为我四年级软件工程学位的一部分。 我们假设为一堆多代理寻路算法提供可视化表示。最简单的一个是A *适用于多代理。
无论如何,我们的环境是一个网格图,其中每个单元格都可以被阻止或用作代理程序路径的一部分。我想要做的是使用动画来很好地表示代理的最终移动,但是在我的网格中设置颜色变化的动画。 I.E用一些颜色涂抹路径中的每一步,以显示代理如何移动。
我想要做的另一件事是通过绘制A *算法的打开列表和闭合列表中的更改来表示算法的工作方式。
我正在使用观察者设计模式的改编版本将事件从我的算法层发送到我的控制器和GUI层。 我想在GUI层中做什么是每次将瓷砖添加到打开列表中时,我希望将该单元格涂成某种颜色,然后根据预定义的计时器逐渐消失,或者稍后添加滑块来控制这个计时器。
我看了code here。看起来很简单,问题是每个平铺动画都必须独立于其他平面动画,以允许算法和所有内容保持运行并启动不同的动画。
那么实现我正在寻找的结果的最佳方法是什么?我应该为每个动画打开一个不同的线程,还是为每个单元格预先制作一个线程? 这对应用程序来说是否有点过头了,因为最多可以有1000个单元格,因此接近1000个线程执行动画。
我认为我可能遇到的另一个问题是,可能会发生一个单元格将启动其颜色渐变动画,然后必须重新启动,我不希望两个动画同时进行(只有一个)线程同时为同一个单元格执行动画。)
我希望我能够清楚地了解我想要实现的目标,如果有人有任何想法或认为它可以真正帮助我完成我的项目。
答案 0 :(得分:2)
您可以找到有用的 Trident动画库。有关更多信息,请访问http://kenai.com/projects/trident/pages/Home
答案 1 :(得分:1)
我会考虑仅使用单个动画线程的场景。你可以例如尝试以下策略:
这第三个线程管理你gui中的所有动画。因此,它维护一个动画操作列表以及它们的时间戳。这样的动作可以是例如在适当的数据结构中“将单元格[1,2]的颜色设置为CF0000 @ 17:01:00”。然后,工作线程将使用动画操作填充此操作列表(例如,您可以为淡入淡出单元格添加多个操作 - 1),现在设置为100%; 2)设置为75%@ now + 10s; 3)设置为50%@现在+ 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(...);
}
请注意,您可以从下一个操作的时间戳确定休眠时间,但请考虑到达的新动画事件可能必须中断此操作。否则你也可以在很短的时间内睡觉。
关于您的第二个问题,如果新操作到达,此线程可能会根据需要删除此列表中的任何操作。因此,您还可以维护辅助数据结构,以便有效地执行此操作。
答案 2 :(得分:1)
我使用javax.swing.Timer
和AlphaComposite
,正如here所示。