0

我不确定标题是否正确,但...

我想为具有给定密度/流量/速度配置的一段道路制作动画(使用 html + canvas + javascript)。为此,我需要在一端有一个车辆“源”,在另一端有一个“接收器”。然后,某个参数将确定每个时间单位创建多少车辆,以及它们的(恒定)速度。然后,我想我应该有一个“时钟”循环,以给定的帧速率增加车辆的位置。优选地,用户可以更改表单中的某些值,并且运行动画会相应地更新。

最终结果应该是这个(更复杂,希望)的变体(抱歉闪烁):

在此处输入图像描述

其实这是一个很常见的问题,有上千个屏保都使用了这个效果,最显着的就是“星域”,它有星星生成和星星运动的参数。所以,我相信这个算法一定有一些“设计模式”,或者更广泛的形式(甚至可能是一个名字)。可以解决我的问题的是一些示例或教程,说明如何使用常见的控制流(循环、计数器、ifs)来实现这一点。

任何想法都非常感谢!

4

1 回答 1

1

我不确定你的问题,这似乎不是算法问题,更像是编程建议。我有一个游戏正是需要这个(对于怪物而不是汽车),这就是我所做的。它在一种 .Net 伪代码中,但在其他环境中也存在类似的东西。

如果您手动运行动画,则基本上需要一个“游戏循环”。

while (noinput):
    timenow = getsystemtime();  
    timedelta = timenow - timeprevious;  
    update_object_positions(timedelta);  
    draw_stuff_to_screen();
    timeprevious = timenow;
    noinput = check_for_input()

update_object_positions(timedelta)移动所有内容timedelta,即自上次执行此循环以来的时间。每次 timedelta 都会进行彻底的重绘。如果你想让它以恒定的速度运行,比如每 20 毫秒运行一次,你可以坚持thread.sleep(20-timedelta)将时间延长到 20 毫秒。

回到你的问题。我有一个汽车类,包括它的速度、车道、类型等以及它出现的时间。我有有限数量的“汽车”,所以这些是预先生成的。我把它们放在一个列表中,按它们出现的时间排序。然后在update_object_position(time)例程中,我查看下一辆车的开始时间是否早于当前时间,如果是,我将汽车从列表中弹出,直到第一辆(下一辆)汽车有未来的开始时间。

你想要(我猜)无限数量的汽车。这只需要稍作改动。为每个车道生成第一辆车,记录它的开始时间。当你打电话时update_object_position(),如果你启动一辆车,找到那条车道的下一辆车和它的时间,然后让它成为下一辆车。如果您有想要重复的模式,请在一个列表中生成整个模式,然后在该列表被清空时生成一个新模式。这在让用户指定可变模式流方面也很有效。

最后,您是否看过随着流量的增加,实际流量中会发生什么?随机的小制动活动会导致后面的汽车稍微过度反应,随着轻微过度反应的累积,它会变成汽车完全停在路上一公里处。它很奇怪,因此可能对您的墙纸/屏幕保护程序产生很大的影响,并且可以作为适当的模拟。

于 2013-04-27T08:55:52.503 回答