所以我有一个函数(下面),我想每2秒更改一个变量。目前该功能每2秒更改变量(goblinx)。问题是time.wait导致所有函数暂停2秒。我怎么能只使用movegoblin()函数暂停。
def movegoblin():
global goblinx
global gobliny
x = 1
if x == 1:
goblinx += 32
pygame.time.wait(200)
答案 0 :(得分:4)
这里的方法是改进你的地精?(以及其他角色)你的程序中从函数到正确的类的处理,这样它们就可以有内部状态。
每个这样的类都可以包含在每个游戏帧中更新的变量,并在计数达到值时触发一个动作。
这个解决方案比仅为时序计算添加并发线程更清洁,并且正确完成,可以导致应用程序设计,这将是开发,扩展和维护的一个幸福。
您可以采用的样式的简短示例,保留代码中的功能。 (请注意,您可以使用pygame.sprite.Sprite类为每个对象组创建名为authomaticaly的“update”方法 - 我将从头开始执行此操作)
frame_delay = 20
class Goblin(object):
def __init__(self):
self.x = 1 #or whatever
self.y = 1 #or whatever
self.movement_count = 0
self.move_at_each = 10
def move(self):
self.movement_count += 1
if self.movement_count < self.move_at_each:
return
self.movement_count = 0
self.x += 32
在你的主循环中,你实例化一个精灵:
goblin = Goblin()
,在进入while循环之前,在每一帧调用goblin.move()
。
通过这种方式,您可以拥有一个合适的精灵类,这将允许您在游戏中拥有多个“精灵” - 而您示例中的代码则需要您对每个角色进行硬编码。而你只需在游戏的每一帧调用“goblin.move”方法。上面的示例被调整为移动每10帧,但您可以更改它(并且可以更改您实例化的每个单独的地精)。
正如我所说,pygame已经将“Sprite”和“sprite groups”类作为这种机制的框架提供,但是在一个较小的游戏中滚动你自己将有助于你更好地理解需求和pygame sprites已经提供,所以你可以在以后的项目中使用它们(或者在这个项目的后期阶段)
答案 1 :(得分:1)
最简单的答案:
每帧在你的精灵上调用.update()函数。如果时间过去> = 200毫秒,那么移动他。否则什么都不做。
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
答案 2 :(得分:0)
我认为大多数人首先想到的答案将是:&#34;你在想错误的方式!&#34; - 如果你遵循传统的gamedev方法,这实际上是正确的; jsbueno和猴子告诉你,你通常会去那里。
我只想指向一个python项目,试图以解决问题的方式提供解决方案。声明是:现实世界是并发的,所以你应该以并发的方式对它进行建模(事实上你的直觉方法是并发方法,支持这一点)。
问题在于,对问题使用真正的多线程方法肯定会给你带来比解决更多的问题,因为你必须考虑竞争条件等(因此sajattack中的互斥量&#39;答案)。如果你的游戏中有数百个精灵/物体(数量不是很多,如果你想开始思考大数据,就会想到成千上万的数量)对数百个线程的开销也很可能对处理它的糟糕计算机来说太过分了
这就是为什么有些人开始了一个名为stackless python的项目。他们希望提供一种工具,让您可以在没有多线程的情况下以并发方式编程!有了这个,您可以按照您的建议进行编程,让一个功能等待,而其他功能继续运行。他们称之为 microthreads 背后的概念还有一篇非常好的文章给你一个introduction to concurrent thinking in programming。您可能想要查看该项目,但这可能会给您带来一些问题:
答案 3 :(得分:-1)
import _thread
_thread.start_new_thread(movegoblin, ())
或者如果您愿意
import threading
threading.Thread(target=movegoblin).start()
带锁:
mutex = _thread.allocate_lock()
def movegoblin():
global goblinx
global gobliny
x = 1
if x == 1:
mutex.acquire()
goblinx += 32
pygame.time.wait(200)
mutex.release()