因此,我是编程的新手(花了几个月的时间),并决定尝试编写游戏代码。 在这一点上,非常感谢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时,我也会绘制计时器,但它不会递减,因此我认为问题出在调用/启动线程倒数计时功能上吗?
而且,这是我第一次在这里发帖,所以请让我知道如何更好地格式化等等,以便您能够提供帮助
答案 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)