Ошибка исчезает, когда я что-то печатаю в pygame - PullRequest
2 голосов
/ 06 мая 2020

Я знаю, что заголовок не очень ясен, но я не знаю, что еще сказать.

У меня есть игрок, атакующий, и когда он заканчивает атаковать, я запускаю таймер на 1 секунду , поэтому мы должны подождать одну секунду, прежде чем атаковать снова. Это не сработало (мы могли атаковать только один раз), и я не знал почему, поэтому я добавил print(self.between_two_attacks()), и все работало нормально, я мог атаковать, подождать одну секунду и атаковать снова.

Вот это программу, я не знаю, достаточно ли этого, потому что я понятия не имею, откуда взялась ошибка.

def between_two_attacks(self):
    if self.after_attack_max == 0:
        self.after_attack_max = pg.time.get_ticks() + 1000
        print("set timer")
    else:
        after_attack = pg.time.get_ticks()
        print("start timer")
        if after_attack >= self.after_attack_max:
            print("can attack again")
            self.can_attack = True
            self.after_attack_max = 0

def draw(self, win):
    print(self.between_two_attacks())
    if (self.attackcount + 1) >= 5:
        self.attackcount = 0
        self.between_two_attacks()
        self.action = STAND_UP
        self.arme = LIGHTSABER_OUT
        self.stops_attacking = True
        self.can_attack = False
    if self.action == ATTACKING:
        win.blit...

Run = True
While Run:
    for event in pg.event.get():
        if event.type == pg.KEYDOWN:
            if event.key == pg.K_SPACE and player.can_attack == True:
                player.action = ATTACKING



Если что-то неясно в этой части программы, просто скажите мне, и я Постараюсь объяснить. Спасибо за помощь :)

Ответы [ 2 ]

2 голосов
/ 07 мая 2020

Метод between_two_attacks должен быть вызван до получения состояния self.can_attack. self.can_attack устанавливается в between_two_attacks. Если метод не вызывается, self.can_attack никогда не превратится в True.
Когда вы сделаете print(self.between_two_attacks()), будет вызван self.between_two_attacks().

Более того, метод можно упростить:

self.can_attack должно быть установлено, если self.after_attack_max == 0 или если текущее время больше self.after_attack_max.
Если установлено self.can_attack, вычислить перезапуск таймера. Если он не установлен, его необходимо оценить. Первоначально self.after_attack_max равно 0. Если текущее время больше self.after_attack_max, атаки должны быть разрешены и таймер должен быть запущен снова:

def between_two_attacks(self):

    current_time = pg.time.get_ticks()
    if self.can_attack:
        self.after_attack_max = current_time + 1000

    elif current_time > self.after_attack_max:
        self.can_attack = True
        self.after_attack_max = current_time + 1000

Обратите внимание, self.after_attack_max устанавливается только в between_two_attacks, больше нигде не сбрасывай.

0 голосов
/ 07 мая 2020

Когда вы печатаете self.between_two_attacks(), вызывается и выполняется функция self. Теперь, если вы добавили всю строку, это означает, что эта функция не выполнялась в этот момент раньше, и теперь это так, поэтому, если вы удалите печать и оставите только функцию в том же месте, вы должны получить такое же поведение. Я не знаю, удастся ли мне объяснить свою мысль, поэтому здесь в качестве быстрого примера:

x = 5

def change_x():
    global x
    x+=10

print(x)

print(change_x())

print(x)

если вы удалите print(), вы получите тот же результат.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...