我在pygame中编写游戏,我需要尝试并禁用三个输入键中的一个,持续2秒,每隔一段时间。现在我遇到了很多麻烦,并花了很多时间在互联网上寻找方法。这是' key_disable'代码到目前为止:
def key_disable(self):
disabled_period = 2000
timer = 0
alarm = alert_font.render("ALERT", False, (255, 0, 0))
x = randint(0, 2500)
if x < 25:
timer += 1
if timer <= disabled_period:
screen.blit(alarm, (74, 100))
return False
elif self.damage > 100:
return False
elif x > 26:
return True
这在主事件循环中使用,如下所示:
keys_pressed = pg.key.get_pressed()
if rover.fuel > 0:
MarsRover.key_disable(rover)
if keys_pressed[pg.K_LEFT] and MarsRover.key_disable(rover) is True:
rover.move_left()
if keys_pressed[pg.K_RIGHT] and MarsRover.key_disable(rover) is True:
rover.move_right()
if keys_pressed[pg.K_SPACE] and MarsRover.key_disable(rover) is True:
thrust = Thrust('thrust.png', rover.rect.left + 31, rover.rect.bottom - 12)
thrust.rotated()
rover.Start_Engine()
screen.blit(thrust.image_rotated, thrust.rect)
pg.display.update()
这个想法是,如果函数返回False,那么它将禁用控件2秒。但它只有在我禁用所有控件时才会工作,这似乎只是几毫秒,这不是我想要的。
我已经尝试了各种计时方法,例如模块(抱歉拼写)时间保持,例如:if (current_time - start_time) % 2 == 0
。我尝试的方法似乎都没有用,我总是得到相同的结果。我能得到任何帮助吗?
感谢
注意:这是第一年的项目,要求这是最后的手段。
答案 0 :(得分:3)
您目前正在函数内部定义timer
。因此,每次调用函数时都会被遗忘并重新设置为0
。 timer
的值似乎也与实际时间无关:它是循环的0到4倍的随机更新,其中循环在繁忙时段可能需要超过1毫秒。更好的实施可能是:
class MarsRover(object):
time_left_disabled = 0
def disable(self):
self.time_left_disabled = 2000
def update_disabled(self, time_taken):
# There are several ways to implement this, including if-statements
self.time_left_disabled = max(self.time_left_disabled - time_taken, 0)
def is_enabled(self):
return (self.time_left_disabled <= 0)
# your other code here
主循环的一部分如下:
# Check if the rover should be disabled again
if randint(0, 2500) < 25:
rover.disable()
else:
rover.update_disabled(dt)
# Do some other stuff
# Check the keyboard input
if keys_pressed[pg.K_LEFT] and rover.is_enabled():
rover.move_left()
if keys_pressed[pg.K_RIGHT] and rover.is_enabled():
rover.move_right()
if keys_pressed[pg.K_SPACE] and rover.is_enabled():
rover.thrust()
# some other stuff
# Ensure the FPS is not going crazy
dt = clock.tick(framerate)