manage actions in game logic

This commit is contained in:
adrienmalin 2019-09-28 14:23:51 +02:00
parent dfbfb093e0
commit 3223521d67
2 changed files with 49 additions and 43 deletions

View File

@ -23,8 +23,6 @@ WINDOW_HEIGHT = 600
WINDOW_TITLE = "TETRARCADE"
# Delays (seconds)
AUTOREPEAT_DELAY = 0.220 # Official : 0.300
AUTOREPEAT_INTERVAL = 0.010 # Official : 0.010
HIGHLIGHT_TEXT_DISPLAY_DELAY = 1
# Text
@ -166,10 +164,8 @@ class TetrArcade(Tetris, arcade.Window):
arcade.key.ENTER: self.new_game
}
}
self.autorepeatable_actions = (self.move_left, self.move_right, self.soft_drop)
self.highlight_texts = []
self.pressed_actions = []
arcade.Window.__init__(
self,
@ -199,8 +195,6 @@ class TetrArcade(Tetris, arcade.Window):
def new_game(self):
self.highlight_texts = []
self.pressed_actions = []
self.auto_repeat = False
super().new_game()
def new_current_piece(self):
@ -211,23 +205,14 @@ class TetrArcade(Tetris, arcade.Window):
def lock(self):
super().lock()
if self.pressed_actions:
self.stop_autorepeat()
self.scheduler.start(self.repeat_action, AUTOREPEAT_DELAY)
def swap(self):
super().swap()
self.reload_held_piece()
self.reload_current_piece()
def pause(self):
super().pause()
self.pressed_actions = []
self.stop_autorepeat()
def game_over(self):
super().game_over()
self.scheduler.stop(self.repeat_action)
def on_key_press(self, key, modifiers):
for key_or_modifier in (key, modifiers):
@ -236,11 +221,7 @@ class TetrArcade(Tetris, arcade.Window):
except KeyError:
pass
else:
action()
if action in self.autorepeatable_actions:
self.stop_autorepeat()
self.pressed_actions.append(action)
self.scheduler.start(self.repeat_action, AUTOREPEAT_DELAY)
self.do_action(action)
def on_key_release(self, key, modifiers):
try:
@ -248,27 +229,10 @@ class TetrArcade(Tetris, arcade.Window):
except KeyError:
pass
else:
if action in self.autorepeatable_actions:
try:
self.pressed_actions.remove(action)
except ValueError:
pass
def repeat_action(self):
if self.pressed_actions:
self.pressed_actions[-1]()
if not self.auto_repeat:
self.auto_repeat = True
self.scheduler.stop(self.repeat_action)
self.scheduler.start(self.repeat_action, AUTOREPEAT_INTERVAL)
else:
self.stop_autorepeat()
def stop_autorepeat(self):
self.auto_repeat = False
self.scheduler.stop(self.repeat_action)
self.remove_action(action)
def show_text(self, text):
self.scheduler.stop(self.del_highlight_text)
self.highlight_texts.append(text)
self.scheduler.start(self.del_highlight_text, HIGHLIGHT_TEXT_DISPLAY_DELAY)

View File

@ -10,6 +10,8 @@ NB_NEXT_PIECES = 5
# Delays (seconds)
LOCK_DELAY = 0.5
FALL_DELAY = 1
AUTOREPEAT_DELAY = 0.220 # Official : 0.300
AUTOREPEAT_PERIOD = 0.010 # Official : 0.010
class Coord:
@ -197,6 +199,8 @@ class Tetris():
self.current_piece = None
self.held_piece = None
self.time = 0
self.autorepeatable_actions = (self.move_left, self.move_right, self.soft_drop)
self.pressed_actions = []
def new_game(self):
self.level = 0
@ -205,6 +209,9 @@ class Tetris():
self.goal = 0
self.time = 0
self.pressed_actions = []
self.auto_repeat = False
self.lock_delay = LOCK_DELAY
self.fall_delay = FALL_DELAY
@ -348,6 +355,9 @@ class Tetris():
self.current_piece.prelocked = False
self.scheduler.stop(self.lock)
if self.pressed_actions:
self.stop_autorepeat()
self.scheduler.start(self.repeat_action, AUTOREPEAT_DELAY)
if all(
(mino_position + self.current_piece.position).y >= NB_LINES
@ -459,14 +469,46 @@ class Tetris():
self.scheduler.start(self.lock, self.lock_delay)
self.scheduler.start(self.clock, 1)
def clock(self, delta_time=1):
self.time += delta_time
def game_over(self):
self.status = Status.OVER
self.scheduler.stop(self.drop)
self.scheduler.stop(self.clock)
self.scheduler.stop(self.repeat_action)
def clock(self, delta_time=1):
self.time += delta_time
def do_action(self, action):
action()
if action in self.autorepeatable_actions:
self.stop_autorepeat()
self.pressed_actions.append(action)
if action == self.drop:
self.scheduler.start(self.repeat_action, AUTOREPEAT_PERIOD)
else:
self.scheduler.start(self.repeat_action, AUTOREPEAT_DELAY)
def repeat_action(self):
if self.pressed_actions:
self.pressed_actions[-1]()
if not self.auto_repeat:
self.auto_repeat = True
self.scheduler.stop(self.repeat_action)
self.scheduler.start(self.repeat_action, AUTOREPEAT_PERIOD)
else:
self.stop_autorepeat()
def remove_action(self, action):
if action in self.autorepeatable_actions:
try:
self.pressed_actions.remove(action)
except ValueError:
pass
def stop_autorepeat(self):
self.auto_repeat = False
self.scheduler.stop(self.repeat_action)
def show_text(self, text):
print(text)
raise NotImplementedError