class Unit():
def __init__(self):
self.update_delay = 200
self.last_update = pygame.time.get_ticks()
def update(self):
# call once per game update.
now = pygame.time.get_ticks()
if now - self.last_update >= self.update_delay:
self.last_update = now
# update AI , pathfind , etc.
self.x += 30
到这里的方法,是提高你的妖精?(和其他字符)在你的程序中处理从函数到适当的类,这样它们就可以有内部状态。在
每一个这样的类都可以有变量,这些变量在每一个游戏帧更新,当计数达到某个值时触发一个动作。在
这个解决方案比仅仅为了计时而添加并发线程更干净,而且如果做得好,可以导致应用程序设计,这将是开发、扩展和维护的福音。在
您可以采用的样式的简短示例,保留代码中的功能。 (请注意,您可以使用游戏精灵精灵精灵类为每个对象组调用authomaticaly的“update”方法-我将在下面从头开始执行)
帧延迟=20
在主循环中,实例化一个地精,执行以下操作:
goblin = Goblin()
,在进入while循环之前,并在每个帧调用goblin.move()
。 这样你就可以有一个合适的地精类,这将允许你有多个“地精”在你的游戏-而你的例子中的代码将要求你硬编码每个字符。你只要把它叫做地精。快走“在你的游戏的每一帧的方法。上面的例子被调整为每10帧移动一次,但是你可以改变它(也可以为你实例化的每个小妖精改变它)。在正如我所说,pygame已经提供了“Sprite”和“Sprite groups”类作为这种机制的框架,但是在一个更小的游戏中使用你自己的类将帮助你更好地理解pygame Sprite已经提供的需求和内容,因此您可以在以后的项目(或项目的后期阶段)中使用它们
我想大多数人首先想到的答案应该是:“你想错了!”--如果遵循传统的gamedev方法,这一点实际上是正确的;jsbueno和monkey向您展示了通常情况下如何去那里。在
我只想指出一个python项目,它试图以解决问题的方式给出解决方案。其主张是:现实世界是并发的,所以你应该以并发的方式对其进行建模(事实上,你的直觉方法是并发的,这就支持了这一点)。在
问题是,在这个问题上使用真正的多线程方法肯定会给您带来比解决问题更多的问题,因为您必须考虑竞争条件等(因此sajattack的答案是mutex)。另外,如果你的游戏中有数百个精灵/物体(这不是一个很高的数字,如果你想开始想大一点的话,那几百个线程的开销很可能会对糟糕的计算机处理过度。在
这就是为什么有些人启动了一个名为stackless python的项目。他们想提供一种工具,让你在没有多线程的情况下以并发方式进行编程!有了它,你可以像你建议的那样编程,让一个函数等待,而其他函数继续运行。他们称之为微线程(microthreads)背后的概念还有一篇很好的文章给你一个introduction to concurrent thinking in programming。您可能需要查看该项目,但这可能会给您留下几个问题:
最简单的答案是:
在每一帧对你的地精调用一个.update()函数。如果时间已过>;=200毫秒,则移动他。否则什么都不做。在
相关问题 更多 >
编程相关推荐