Отключить ключи на 2 секунды Pygame - PullRequest
0 голосов
/ 27 апреля 2018

Я пишу игру в 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. Кажется, ни один из методов, которые я пробую, не работает, и я всегда получаю один и тот же результат. Могу ли я получить какую-либо помощь? Спасибо

Примечание: это для первого года проекта, спрашиваю, что было последним средством.

1 Ответ

0 голосов
/ 27 апреля 2018

В настоящее время вы определяете 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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...