aboutsummaryrefslogtreecommitdiff
path: root/src/splitscreen_duo/games
diff options
context:
space:
mode:
Diffstat (limited to 'src/splitscreen_duo/games')
-rw-r--r--src/splitscreen_duo/games/breakout.py14
-rw-r--r--src/splitscreen_duo/games/game_base.py55
-rw-r--r--src/splitscreen_duo/games/pong.py54
-rw-r--r--src/splitscreen_duo/games/snake.py18
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)