我不确定你的问题,这似乎不是算法问题,更像是编程建议。我有一个游戏正是需要这个(对于怪物而不是汽车),这就是我所做的。它在一种 .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()
,如果你启动一辆车,找到那条车道的下一辆车和它的时间,然后让它成为下一辆车。如果您有想要重复的模式,请在一个列表中生成整个模式,然后在该列表被清空时生成一个新模式。这在让用户指定可变模式流方面也很有效。
最后,您是否看过随着流量的增加,实际流量中会发生什么?随机的小制动活动会导致后面的汽车稍微过度反应,随着轻微过度反应的累积,它会变成汽车完全停在路上一公里处。它很奇怪,因此可能对您的墙纸/屏幕保护程序产生很大的影响,并且可以作为适当的模拟。