如何在不暂停其他函数的情况下暂停一个pygame函数?

2024-09-27 23:17:14 发布

您现在位置:Python中文网/ 问答频道 /正文

所以我有一个函数,我想每隔2秒改变一个变量。目前,该函数每2秒更改一次变量(goblinx)。问题是时间。等等使所有功能暂停2秒。我怎么可能只有函数movegoblin()pause。在

def movegoblin():
    global goblinx
    global gobliny
    x = 1
    if x == 1:
        goblinx += 32
        pygame.time.wait(200)

Tags: 函数功能iftimedef时间globalpygame
3条回答

到这里的方法,是提高你的妖精?(和其他字符)在你的程序中处理从函数到适当的类,这样它们就可以有内部状态。在

每一个这样的类都可以有变量,这些变量在每一个游戏帧更新,当计数达到某个值时触发一个动作。在

这个解决方案比仅仅为了计时而添加并发线程更干净,而且如果做得好,可以导致应用程序设计,这将是开发、扩展和维护的福音。在

您可以采用的样式的简短示例,保留代码中的功能。 (请注意,您可以使用游戏精灵精灵精灵类为每个对象组调用authomaticaly的“update”方法-我将在下面从头开始执行)

帧延迟=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()。 这样你就可以有一个合适的地精类,这将允许你有多个“地精”在你的游戏-而你的例子中的代码将要求你硬编码每个字符。你只要把它叫做地精。快走“在你的游戏的每一帧的方法。上面的例子被调整为每10帧移动一次,但是你可以改变它(也可以为你实例化的每个小妖精改变它)。在

正如我所说,pygame已经提供了“Sprite”和“Sprite groups”类作为这种机制的框架,但是在一个更小的游戏中使用你自己的类将帮助你更好地理解pygame Sprite已经提供的需求和内容,因此您可以在以后的项目(或项目的后期阶段)中使用它们

我想大多数人首先想到的答案应该是:“你想错了!”--如果遵循传统的gamedev方法,这一点实际上是正确的;jsbueno和monkey向您展示了通常情况下如何去那里。在

我只想指出一个python项目,它试图以解决问题的方式给出解决方案。其主张是:现实世界是并发的,所以你应该以并发的方式对其进行建模(事实上,你的直觉方法是并发的,这就支持了这一点)。在

问题是,在这个问题上使用真正的多线程方法肯定会给您带来比解决问题更多的问题,因为您必须考虑竞争条件等(因此sajattack的答案是mutex)。另外,如果你的游戏中有数百个精灵/物体(这不是一个很高的数字,如果你想开始想大一点的话,那几百个线程的开销很可能会对糟糕的计算机处理过度。在

这就是为什么有些人启动了一个名为stackless python的项目。他们想提供一种工具,让你在没有多线程的情况下以并发方式进行编程!有了它,你可以像你建议的那样编程,让一个函数等待,而其他函数继续运行。他们称之为微线程(microthreads)背后的概念还有一篇很好的文章给你一个introduction to concurrent thinking in programming。您可能需要查看该项目,但这可能会给您留下几个问题:

  1. 您需要一个不同版本的python解释器。Stackless不在标准的c-python和pypy中,而且很可能不会很快出现。在
  2. 使用不同的解释器这一事实将使分发任何用无堆栈python编写的游戏变得更加困难。在
  3. 你可能会学到一种不寻常的游戏编程方法——这在将来的某个时候可能很重要(或者可能不重要)。在与现实生活中的程序员交谈或阅读现有游戏资源时,可能会给你带来麻烦。这可能是一个好主意,先做一些经典游戏编程,或者除了stackless之外。在

最简单的答案是:

在每一帧对你的地精调用一个.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

相关问题 更多 >

    热门问题