作为我四年级软件工程学位的一部分,我正在做一个寻找路径的项目。我们假设给出一组多智能体寻路算法的可视化表示。最简单的是适用于多智能体的A*。
无论如何,我们的环境是一个网格地图,其中每个单元都可以被阻塞或用作代理路径的一部分。我想做的是使用动画来很好地表示智能体的最终运动,但在我的网格中设置颜色变化的动画。也就是说,将路径中的每一步用某种颜色绘制一秒钟左右,以显示智能体是如何移动的。
我想做的另一件事是通过绘制A*算法的开放列表和封闭列表中的变化来表示算法的工作方式,同时进行计算。
我使用经过调整的观察者设计模式将事件从我的算法层发送到我的控制器和GUI层。我想在GUI层做的是,每当一个磁贴被添加到开放列表中时,我想让那个单元格绘制成某种颜色,然后根据预定义的计时器淡出它,或者稍后添加一个滑块来控制这个计时器。
我看过code here了。这看起来很简单,问题是每个平铺动画都必须独立于其他动画,才能使算法和所有内容保持运行,并启动不同的动画。
那么,实现我想要的结果的最佳方法是什么呢?我应该为每个动画打开一个不同的线程,还是为每个单元预先创建一个线程?这对应用程序来说是不是太过分了,因为可能有多达1000个单元格,因此执行动画的线程接近1000个。
我认为我可能会遇到的另一个问题是,可能会发生单元格开始颜色褪色动画,然后必须重新启动,我不希望这两个动画同时进行(只有一个线程在同一时间为同一个单元格执行动画)。
如果有人有任何想法或认为这对我的项目有真正的帮助,我希望我对我试图实现的目标足够清楚。
发布于 2011-03-26 21:19:24
你可以发现三叉树动画库很有用。有关更多信息,请访问http://kenai.com/projects/trident/pages/Home。
发布于 2011-03-26 22:18:11
我会考虑一个只有一个动画线程的场景。例如,您可以尝试以下策略:
用于swing事件的
第三个线程管理gui中的所有动画。因此,它维护一个动画动作列表,这些动作连同它们的时间戳一起执行。这样的动作可以是例如在适当的数据结构中将单元格1,2的颜色设置为CF0000 @17:01:00。该动作列表随后由工作线程用动画动作填充(例如,您可以一次为淡入淡出的单元格添加几个动作)设置为100% @ now;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(...);
}请注意,您可以根据下一个操作的时间戳确定休眠时间,但请考虑到新的动画事件可能会中断此操作。否则,你也可以睡上一小段时间。
关于你的第二个问题,如果一个新的操作到达,这个线程可能会根据特殊单元格的需求从这个列表中删除任何操作。因此,您可能还需要维护一个辅助数据结构,以便有效地执行此操作。
发布于 2011-03-27 00:56:33
我会使用javax.swing.Timer和AlphaComposite,就像here演示的那样。
https://stackoverflow.com/questions/5442118
复制相似问题