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

时间:2012-05-26 00:50:38

标签: python pygame

所以我有一个函数(下面),我想每2秒更改一个变量。目前该功能每2秒更改变量(goblinx)。问题是time.wait导致所有函数暂停2秒。我怎么能只使用movegoblin()函数暂停。

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

4 个答案:

答案 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。您可能想要查看该项目,但这可能会给您带来一些问题:

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

答案 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()