Я написал пошаговую боевую последовательность, в которой противник время от времени использует атаки, которые происходятPython

Программы на Python
Ответить Пред. темаСлед. тема
Anonymous
 Я написал пошаговую боевую последовательность, в которой противник время от времени использует атаки, которые происходят

Сообщение Anonymous »

Я изучаю Python, моим первым проектом была небольшая текстовая игра, теперь я переделал ее с помощью Pygame. Когда я приступил к реализации боя, я столкнулся с этой проблемой и не смог решить ее самостоятельно. Что должно произойти, так это то, что враг бездействует в течение хода, что означает, что приближается сильная атака, а затем, после того, как игрок делает свой ход, атака наносится на втором ходу врага. И в большинстве случаев ведет себя так, как надо. Но если игрок использует защитное действие (парирование или контрзаклинание), когда противник не готовит атаку, то неактивная часть атаки пропускается и сразу наносится мгновенный урон.
Вот фрагмент кода, который обрабатывает ходы игрока и противника:

Код: Выделить всё

    if not player_turn:
if sblade.hp <  sblade.hp_max*0.3:
if not action_generated:
action = random.randint(1, 2)
action_generated = True
if action == 1:
sblade.idle_index = 0
sblade.is_interrupting = False
sblade.is_preparing_attack = False
sblade.is_preparing_spell = False
sblade.is_idle = True
third_status_message = f"{sblade.name} looks scared and is taking a defensive posture."
sblade.is_parrying = True
player_turn = not player_turn
elif action == 2:
sblade.idle_index = 0
sblade.is_parrying = False
sblade.is_preparing_attack = False
sblade.is_preparing_spell = False
sblade.is_idle = True
third_status_message = f"{sblade.name} looks scared and is preparing a counterspell"
sblade.is_interrupting = True
player_turn = not player_turn
else:
if sblade.is_preparing_attack:
if not virtual_keypress:
# enemy uses the same attack functions as the player and they rely on variables being     set to certain
# values by the player pressing Enter so there's a virtual keypress for the enemy
keys_locked = True
sblade.is_moving = True
sblade.is_moving_forward = True
virtual_keypress = True
channeled_attack(sblade, lavender, SBLADE_CHARGED_ATTACK2_LIST)
elif sblade.is_preparing_spell:
if not virtual_keypress:
keys_locked = True
sblade.is_moving = True
sblade.is_moving_forward = True
virtual_keypress = True
channeled_attack(sblade, lavender, SBLADE_CHARGED_SPELL2_LIST)
else:
if not action_generated:
action = random.randint(1, 4)
action_generated = True
if action == 1:
if not virtual_keypress:
keys_locked = True
sblade.is_parrying = False
sblade.is_interrupting = False
sblade.is_moving = True
sblade.is_moving_forward = True
virtual_keypress = True
attack(sblade, lavender, SBLADE_ATTACK_LIST)
elif action == 2:
if not virtual_keypress:
keys_locked = True
sblade.is_parrying = False
sblade.is_interrupting = False
sblade.is_casting = True
virtual_keypress = True
spell(sblade, lavender)
elif action == 3:
sblade.idle_index = 0
sblade.is_interrupting = False
sblade.is_parrying = False
sblade.is_preparing_attack = True
sblade.status_message = f"{sblade.name} is looking for an opening."
player_turn = not player_turn
elif action == 4:
sblade.idle_index = 0
sblade.is_parrying = False
sblade.is_interrupting = False
sblade.is_preparing_spell = True
sblade.status_message = f"{sblade.name} is looking focused."
player_turn = not player_turn

elif player_turn:
if not keys_locked:
arrow_movement(keys_pressed, arrow_rect)
if arrow_rect.y == pos1[1]:
if keys_pressed[pygame.K_RETURN] and not keys_locked:
main.confirm_sound.play()
keys_locked = True
lavender.is_parrying = False
lavender.is_interrupting = False
lavender.is_moving = True
lavender.is_moving_forward = True
attack(lavender, sblade,  LAVENDER_ATTACK_LIST)
if arrow_rect.y == pos2[1]:
if keys_pressed[pygame.K_RETURN] and not keys_locked:
main.confirm_sound.play()
keys_locked = True
lavender.is_parrying = False
lavender.is_interrupting = False
lavender.is_casting = True
spell(lavender, sblade)
if arrow_rect.y == pos3[1]:
if keys_pressed[pygame.K_RETURN] and not keys_locked:
main.confirm_sound.play()
lavender.is_parrying = True
lavender.is_interrupting = False
lavender.status_message = "Lavender is preparing to parry."
action_generated = False
virtual_keypress = False
player_turn = not player_turn
if arrow_rect.y == pos4[1]:
if keys_pressed[pygame.K_RETURN] and not keys_locked:
main.confirm_sound.play()
lavender.is_interrupting = True
lavender.is_parrying = False
lavender.status_message = "Lavender is preparing to interrupt a spell."
action_generated = False
virtual_keypress = False
player_turn = not player_turn
Ненаправленные атаки по-прежнему происходят, когда игрок использует защитное действие, поэтому, поскольку они находятся в том же пуле действий, что и инициирование направленных атак, я предполагаю, что первое половина направленной атаки все еще происходит, но затем по какой-то причине вместо передачи хода игроку она возвращается к началу, и срабатывает вторая половина. А если игрок не использует защитное действие, то он пропускает ход как надо.
Я даже не понимаю, почему так и с чего начать поиск для решения. Может быть, я просто слишком утомлен на этом этапе, потому что до сих пор я придумывал разные вещи и свои собственные, никого не спрашивая, и, несмотря на то, что я добился успеха во всем, кроме этого одного, весь процесс занял оооочень много времени. И у меня также возникла некоторая задержка мозга, и я решил заставить защитные действия игрока установить для ключей key_locked значение True, хотя это всего лишь условие, позволяющее игроку вводить данные, но по какой-то причине это фактически решило проблему, которая меня еще больше смутила. Я просто ослеп и не понимаю, какую разницу это имеет? Но это недопустимое решение, так как для того, чтобы включить ввод данных игроком для последующих ходов, действия врага, которые настраивают направленные атаки, должны были бы установить дляkeys_locked обратно значение False, и когда я заставил их это сделать, направленные атаки немедленно вернулись к выполнению, если игрок использует оборонительные действия.

Подробнее здесь: https://stackoverflow.com/questions/785 ... -attacks-t
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «Python»