如何在PyGame中制作Wave计时器

时间:2019-05-24 08:10:27

标签: python timer pygame countdown

因此,我是编程的新手(花了几个月的时间),并决定尝试编写游戏代码。 在这一点上,非常感谢Chris Bradfield编写的pygame编码系列教程,它们绝对很棒! 但是,既然我已经完成了教程,并且需要自己工作,那么我遇到了一个问题。我正在制作一个自上而下的射击游戏,并使其基于波浪。因此,当一个波浪中的僵尸死亡时,我想展示一个倒数计时器,直到下一个波浪开始。我认为我在正确的atm路径上,让我告诉你我正在使用什么。

def new(self)
'''
    self.timer_flag = False
    self.x = threading.Thread(target=self.countdown, args=(TIME_BETWEEN_WAVES,))
'''

def countdown(self, time_between_waves):
    self.wave_timer = time_between_waves
    for i in range(TIME_BETWEEN_WAVES):
        while self.timer_flag:
            self.wave_timer -= 
            time.sleep(1)

def update(self)
'''
    self.countdown_has_run = False
    if len(self.mobs) == 0:
        self.timer_flag = True
        if not self.countdown_has_run:
            self.countdown_has_run = True
            self.x.start()
'''

现在,当timer_flag为True时,我也会绘制计时器,但它不会递减,因此我认为问题出在调用/启动线程倒数计时功能上吗?

而且,这是我第一次在这里发帖,所以请让我知道如何更好地格式化等等,以便您能够提供帮助

2 个答案:

答案 0 :(得分:0)

在我看来,您缺乏检查屏幕上还有多少小怪的机制。我想可能是这样的:

class CountdownClock:
    def __init__(self):
        self.start_no = 1
        self.time_between_waves = 5
        self.t = threading.Thread(target=self.check_mobs_left)
        self.t.start()

    def check_mobs_left(self):
        self.mobs = ["mob" for _ in range(randint(2, 7))]  #generate 2-7 mobs per level
        print (f"Wave {self.start_no} : Total {len(self.mobs)} mobs found!")
        while self.mobs:
            print (f"Still {len(self.mobs)} mobs left!")
            time.sleep(1)
            del self.mobs[-1] #simulate mob kill - remove this line from your actual setting
        self.next_wave(self.time_between_waves)
        self.time_between_waves +=2 #increased time for each wave

    def next_wave(self,time_between_waves):
        self.time_left = time_between_waves
        print(f"Wave {self.start_no} cleared!")
        self.start_no += 1
        while self.time_left:
            print (f"Next wave in...{self.time_left}")
            self.time_left -=1
            time.sleep(1)
        self.t = threading.Thread(target=self.check_mobs_left)
        self.t.start()

a = CountdownClock()

您将不断地进行此操作,而无需每次调用​​该方法并设置标志和内容。

答案 1 :(得分:0)

不要理会线程。无需让您的生活变得复杂。

通常,您在游戏中始终使用Clock(如果没有,则应开始使用它)以限制帧速率,并确保您的世界以恒定的速度移动(如果没有,则应开始使用)这样做)。

因此,如果您想在5秒内触发某些内容,只需创建一个变量,该变量保存值5000,然后减去处理上一帧所花费的时间(由Clock返回)。{ {1}}):

tick

我在下面总结了一个简单的例子。在这里,我使用了一个简单的类(也是Sprite)将剩余时间绘制到屏幕上。计时器用尽时,它将调用一个函数,该函数将创建新的僵尸浪潮。

在主循环中,我检查是否没有计时器在运行并且没有僵尸,如果是这种情况,则会创建一个新计时器。

代码如下:

clock = pygame.time.Clock()
dt = 0
timer = 5000
while True:
    ...
    timer -= dt
    if timer <= 0:
       do_something()
    dt = clock.tick(60)

enter image description here