diff options
Diffstat (limited to 'src/splitscreen_duo/games')
| -rw-r--r-- | src/splitscreen_duo/games/breakout.py | 14 | ||||
| -rw-r--r-- | src/splitscreen_duo/games/game_base.py | 55 | ||||
| -rw-r--r-- | src/splitscreen_duo/games/pong.py | 54 | ||||
| -rw-r--r-- | src/splitscreen_duo/games/snake.py | 18 |
4 files changed, 86 insertions, 55 deletions
diff --git a/src/splitscreen_duo/games/breakout.py b/src/splitscreen_duo/games/breakout.py index 734b394..ef369de 100644 --- a/src/splitscreen_duo/games/breakout.py +++ b/src/splitscreen_duo/games/breakout.py @@ -21,8 +21,8 @@ logger = logging.getLogger(__name__) class Breakout(GameBase): - def __init__(self, screen, serial, instance): - super().__init__(screen, serial, instance) + def __init__(self, screen, serial, instance, is_joint_mode=False): + super().__init__(screen, serial, instance, is_joint_mode) self.screen_width = screen.get_width() self.screen_height = screen.get_height() @@ -65,6 +65,7 @@ class Breakout(GameBase): if self.ball[0] <= BALL_SIZE or self.ball[0] >= self.screen_width - BALL_SIZE: self.ball_dx *= -1 + if self.ball[1] <= BALL_SIZE: self.ball_dy *= -1 @@ -90,6 +91,9 @@ class Breakout(GameBase): self.bricks.remove(brick) self.score += 1 + + self.send_stats(self.score) + self.ball_dy *= -1 logger.debug(f"brick hit, score: {self.score}") @@ -156,9 +160,11 @@ class Breakout(GameBase): for brick in self.bricks: pygame.draw.rect(self.screen, RED, brick) - score_text = self.font.render(f"Score: {self.score}", True, WHITE) + if not self.is_joint_mode or self.instance != "primary": + score_text = self.font.render(f"Score: {self.score}", True, WHITE) + + self.screen.blit(score_text, (10, 10)) - self.screen.blit(score_text, (10, 10)) pygame.display.flip() clock.tick(60) diff --git a/src/splitscreen_duo/games/game_base.py b/src/splitscreen_duo/games/game_base.py index 547b27e..8ef02ec 100644 --- a/src/splitscreen_duo/games/game_base.py +++ b/src/splitscreen_duo/games/game_base.py @@ -9,10 +9,11 @@ logger = logging.getLogger(__name__) class GameBase: - def __init__(self, screen, serial, instance): + def __init__(self, screen, serial, instance, is_joint_mode=False): self.screen = screen self.serial = serial self.instance = instance + self.is_joint_mode = is_joint_mode self.font = pygame.font.Font(None, 36) self.is_running = True self.opponent_dead = False @@ -37,7 +38,6 @@ class GameBase: def check_serial(self): if self.serial.in_waiting() > 0: data = self.serial.readline().decode("utf-8").strip() - logger.debug(f"received serial data during check_serial: {data}") message = json.loads(data) @@ -53,26 +53,50 @@ class GameBase: return False def end_game(self, score): - self.my_score = score + if self.is_joint_mode: + self.is_running = False + + if self.instance == "primary": + self.serial.write( + json.dumps({"command": Command.GAME_ENDED.value}).encode("utf-8") + + b"\n" + ) + else: + self.my_score = score - logger.debug(f"ending game, sending score: {self.my_score}") + self.serial.write( + json.dumps( + { + "command": Command.SCORE.value, + "action": None, + "value": self.my_score, + } + ).encode("utf-8") + + b"\n" + ) - self.serial.write( - json.dumps( - {"command": Command.SCORE.value, "action": None, "value": self.my_score} - ).encode("utf-8") - ) + if self.opponent_dead: + self.score_display_time = pygame.time.get_ticks() - if self.opponent_dead: - self.score_display_time = pygame.time.get_ticks() + logger.debug("opponent already dead, starting score display") + else: + self.waiting = True - logger.debug("opponent already dead, starting score display") - else: - self.waiting = True + logger.debug("waiting for opponent to finish") - logger.debug("waiting for opponent to finish") + def send_stats(self, value): + if self.is_joint_mode and self.instance == "primary": + self.serial.write( + json.dumps({"command": Command.STATS.value, "value": value}).encode( + "utf-8" + ) + + b"\n" + ) def update(self): + if self.is_joint_mode: + return None + if self.waiting: self.screen.fill(self.BLACK) @@ -108,7 +132,6 @@ class GameBase: "action": None, "value": None, } - elif self.score_display_time: self.screen.fill(self.BLACK) diff --git a/src/splitscreen_duo/games/pong.py b/src/splitscreen_duo/games/pong.py index 7f0d4e9..464e529 100644 --- a/src/splitscreen_duo/games/pong.py +++ b/src/splitscreen_duo/games/pong.py @@ -17,9 +17,8 @@ logger = logging.getLogger(__name__) class Pong(GameBase): - def __init__(self, screen, serial, instance): - super().__init__(screen, serial, instance) - + def __init__(self, screen, serial, instance, is_joint_mode=False): + super().__init__(screen, serial, instance, is_joint_mode) self.screen_width = screen.get_width() self.screen_height = screen.get_height() self.player_score = 0 @@ -33,14 +32,8 @@ class Pong(GameBase): self.screen_width // 2 - PADDLE_WIDTH // 2, self.screen_height - 40, ] - self.ai_paddle = [ - self.screen_width // 2 - PADDLE_WIDTH // 2, - 40, - ] - self.ball = [ - self.screen_width // 2, - self.screen_height // 2, - ] + self.ai_paddle = [self.screen_width // 2 - PADDLE_WIDTH // 2, 40] + self.ball = [self.screen_width // 2, self.screen_height // 2] self.ball_dx = random.choice([-BALL_SPEED, BALL_SPEED]) self.ball_dy = BALL_SPEED @@ -61,6 +54,7 @@ class Pong(GameBase): if self.ai_paddle[0] < 0: self.ai_paddle[0] = 0 + if self.ai_paddle[0] > self.screen_width - PADDLE_WIDTH: self.ai_paddle[0] = self.screen_width - PADDLE_WIDTH @@ -72,16 +66,10 @@ class Pong(GameBase): self.ball_dx *= -1 player_rect = pygame.Rect( - self.player_paddle[0], - self.player_paddle[1], - PADDLE_WIDTH, - PADDLE_HEIGHT, + self.player_paddle[0], self.player_paddle[1], PADDLE_WIDTH, PADDLE_HEIGHT ) ai_rect = pygame.Rect( - self.ai_paddle[0], - self.ai_paddle[1], - PADDLE_WIDTH, - PADDLE_HEIGHT, + self.ai_paddle[0], self.ai_paddle[1], PADDLE_WIDTH, PADDLE_HEIGHT ) ball_rect = pygame.Rect( self.ball[0] - BALL_SIZE, @@ -102,17 +90,16 @@ class Pong(GameBase): if self.ball[1] <= 0: self.player_score += 1 + self.send_stats(self.player_score) self.reset_ball() elif self.ball[1] >= self.screen_height: self.ai_score += 1 + self.send_stats(self.player_score) self.reset_ball() def reset_ball(self): - self.ball = [ - self.screen_width // 2, - self.screen_height // 2, - ] + self.ball = [self.screen_width // 2, self.screen_height // 2] self.ball_dx = random.choice([-BALL_SPEED, BALL_SPEED]) self.ball_dy = random.choice([-BALL_SPEED, BALL_SPEED]) @@ -201,9 +188,10 @@ class Pong(GameBase): game_over = self.check_game_over() if game_over: - self.score_display_time = pygame.time.get_ticks() + if self.is_joint_mode and self.instance == "primary": + self.send_stats(self.player_score) - logger.debug(f"game over: {game_over}, starting score display") + self.end_game(self.player_score) continue @@ -230,13 +218,17 @@ class Pong(GameBase): BALL_SIZE, ) - player_score_text = self.font.render( - f"Player: {self.player_score}", True, WHITE - ) - ai_score_text = self.font.render(f"AI: {self.ai_score}", True, WHITE) + if not self.is_joint_mode or self.instance != "primary": + player_score_text = self.font.render( + f"Player: {self.player_score}", True, WHITE + ) + ai_score_text = self.font.render( + f"AI: {self.ai_score}", True, WHITE + ) + + self.screen.blit(player_score_text, (10, self.screen_height - 40)) + self.screen.blit(ai_score_text, (10, 10)) - self.screen.blit(player_score_text, (10, self.screen_height - 40)) - self.screen.blit(ai_score_text, (10, 10)) pygame.display.flip() clock.tick(60) diff --git a/src/splitscreen_duo/games/snake.py b/src/splitscreen_duo/games/snake.py index 51c0bcc..b593ea1 100644 --- a/src/splitscreen_duo/games/snake.py +++ b/src/splitscreen_duo/games/snake.py @@ -15,8 +15,8 @@ logger = logging.getLogger(__name__) class Snake(GameBase): - def __init__(self, screen, serial, instance): - super().__init__(screen, serial, instance) + def __init__(self, screen, serial, instance, is_joint_mode=False): + super().__init__(screen, serial, instance, is_joint_mode) self.screen_width = screen.get_width() self.screen_height = screen.get_height() @@ -73,6 +73,9 @@ class Snake(GameBase): ) self.score += 1 + + self.send_stats(self.score) + self.food = self.spawn_food() else: self.body.pop() @@ -122,6 +125,11 @@ class Snake(GameBase): continue + if self.check_collision(): + self.end_game(self.score) + + continue + self.screen.fill(BLACK) for segment in self.body: @@ -137,9 +145,11 @@ class Snake(GameBase): [self.food[0], self.food[1], BLOCK_SIZE, BLOCK_SIZE], ) - score_text = self.font.render(f"Score: {self.score}", True, WHITE) + if not self.is_joint_mode or self.instance != "primary": + score_text = self.font.render(f"Score: {self.score}", True, WHITE) + + self.screen.blit(score_text, (10, 10)) - self.screen.blit(score_text, (10, 10)) pygame.display.flip() clock.tick(SPEED) |