我是编程新手,在我正在制作的一个小型 RPG 游戏中遇到了这个问题。它主要是基于文本的,但将 tkinter 用于简单的 GUI。
在战斗中,我有一个 for 循环遍历所有参与战斗的生物,并一个接一个地执行它们的动作,每个动作之间都有短暂的睡眠。我的问题是,当用户按下键或单击按钮时,命令会在 for 循环完成后被缓冲并执行。在此循环进行时,是否有一种简单的方法可以忽略用户命令?我试过取消绑定键和禁用按钮,然后在循环完成时重新启用它们,但它仍然不起作用。我还阅读了有关刷新用户输入的信息,但我无法弄清楚。由于我是菜鸟,我想我在这里缺少一些基本概念。
这是我的代码:
def battle_round(self, command):
''' (Battle, command) -> NoneType
A round of battle where every creature gets an action.
'''
# Pause player input with mode variable.
self.player.mode = 'wait'
# Keep track of number of rounds.
self.round_number += 1
# Get initiative order for all mobs, party members, and player.
ordered_creatures = self.initiative()
# Get commands from each mob.
for mob in self.mobs:
mob.command = self.determine_mob_command()
# Check battle speed option.
delay = 1
# Begin actions for all creatures.
for creature in ordered_creatures:
# Delay between actions. Write a space between lines.
self.text_window.update_idletasks()
self.write(self.text_window, '\n')
time.sleep(delay)
# Player action.
if type(creature) == Player:
if command == 'standard_attack':
self.standard_player_attack()
if command == 'retreat':
self.retreat()
if type(creature) == PartyMember:
pass
# MOB action.
if type(creature) == MOB:
if creature.command == 'standard_attack':
self.standard_mob_attack(creature)
self.start_next_round()
我将 Python 3.2.3 与 Tk 8.5 和 IDLE 3.2.3 一起使用。我的操作系统是 Windows 7。
提前致谢!
编辑:感谢到目前为止的回复。我可能在这里不知所措,因为直到现在我什至不知道线程是什么,而且我不确定我将如何阅读和忽略用户输入。就用户输入的代码而言,我有很多。我将在这里复制并粘贴一些:
def attack():
if player.in_battle == True:
if player.mode != 'wait':
player.current_battle.battle_round('standard_attack')
def retreat():
if player.in_battle == True:
if player.mode != 'wait':
player.current_battle.battle_round('retreat')
# Set up battle buttons.
attack_button = Button(battle_button_frame, text='(A)ttack', command=attack,
width=10,)
attack_button.grid(column=1, columnspan=1, row=2, padx=5, pady=5)
retreat_button = Button(battle_button_frame, text='(R)etreat', command=retreat,
width=10,)
retreat_button.grid(column=2, columnspan=1, row=2, padx=5, pady=5)
battle_button_list = [attack_button, retreat_button]
例如,这些按钮可以让用户攻击选定的怪物,或者试图逃离战斗。
我还有几个键绑定:
# Bind Keys
root.bind('<Escape>', func=keyboard_cancel)
root.bind('<Control-Key-m>', func=keyboard_move_mode)
root.bind('<Control-Key-M>', func=keyboard_move_mode)
root.bind('<Control-Key-l>', func=keyboard_look_mode)
root.bind('<Control-Key-L>', func=keyboard_look_mode)
root.bind('<Control-Key-t>', func=keyboard_talk_mode)
root.bind('<Control-Key-T>', func=keyboard_talk_mode)
root.bind('<space>', func=keyboard_begin_battle)
root.bind('<Left>', func=arrow_key_select_left)
root.bind('<Right>', func=arrow_key_select_right)
我的问题仍然是,当带有睡眠的 for 循环进行时,如果用户按下按钮或使用键绑定,它将在战斗回合结束后立即执行。(如果有 6 个怪物和玩家,大约需要 7 秒。)我是一个完全的初学者,所以我很抱歉我的帖子不清楚,我的代码一团糟。