diff --git a/src/entity/player.py b/src/entity/player.py new file mode 100644 index 0000000..a25c2e9 --- /dev/null +++ b/src/entity/player.py @@ -0,0 +1,26 @@ +import pygame + +from src.config.color import Color + + +class Player: + def __init__(self, screen): + self.screen = screen + screen_rect = self.screen.get_rect() + self.x = screen_rect.centerx + self.y = screen_rect.centery + self.v = 0.1 + self.status = [] + + def move(self, dx, dy): + if "run" in self.status: + dx *= 5 + dy *= 5 + self.x += dx + self.y += dy + + def show(self): + pygame.draw.circle(self.screen, Color.white, (int(self.x), int(self.y)), 10) + + def update(self): + pass \ No newline at end of file diff --git a/src/scenes/space_scene.py b/src/scenes/space_scene.py new file mode 100644 index 0000000..81d37e3 --- /dev/null +++ b/src/scenes/space_scene.py @@ -0,0 +1,105 @@ +import os + +import pygame + +from src.config.color import Color +from src.config.game_config import data_path, GameConfig +from src.entity.player import Player +from src.scenes.base_scene import BaseScene + + +# class Player: +# """ +# 简单的玩家精灵,仅保存 image 和 rect,避免依赖 pygame.examples.aliens.Player +# aliens 内部依赖全局的 images 列表初始化,外部直接实例化会导致 images[0] 越界 +# """ +# def __init__(self, image_path: str, center=(400, 300)): +# self.image = pygame.image.load(image_path).convert_alpha() +# self.rect = self.image.get_rect() +# self.rect.center = center +# # 限制活动范围在窗口内 +# self.bounds = pygame.Rect(0, 0, int(GameConfig.window_x), int(GameConfig.window_y)) +# +# def clamp_into_bounds(self): +# if not self.bounds.contains(self.rect): +# self.rect.clamp_ip(self.bounds) + + +class SpaceScene(BaseScene): + name = "SpaceScene" # 场景名称 + + def __init__(self, screen): + super().__init__(screen) + self.Left_status = False + self.right_status = False + self.up_status = False + self.down_status = False + + # 实例化玩家 + self.player = Player(screen) + + # 设置字体 + font_file = os.path.join(data_path(), "Dymon-ShouXieTi.otf") + self.font = pygame.font.Font(font_file, 32) + + def update(self, dt=0): + """ + 场景每帧更新逻辑 + """ + # 移动玩家 + player_move_distance = self.player.v * dt + + if self.Left_status: + self.player.move(-player_move_distance, 0) + if self.right_status: + self.player.move(player_move_distance, 0) + if self.up_status: + self.player.move(0, -player_move_distance) + if self.down_status: + self.player.move(0, player_move_distance) + # 显示玩家 + self.player.show() + self.__show(self.player.status) + + def handle_event(self, event): + """ + 接收主循环传来的事件并处理 + """ + if event.type == pygame.KEYDOWN: + if event.key == pygame.K_ESCAPE: + self.switch_to_scene("MainMenuScene") + elif event.key == pygame.K_LEFT or event.key == pygame.K_a: + self.Left_status = True + elif event.key == pygame.K_RIGHT or event.key == pygame.K_d: + self.right_status = True + elif event.key == pygame.K_UP or event.key == pygame.K_w: + self.up_status = True + elif event.key == pygame.K_DOWN or event.key == pygame.K_s: + self.down_status = True + if event.key == pygame.K_LSHIFT: + if "run" not in self.player.status: + self.player.status.append("run") + + # 松开按键 + elif event.type == pygame.KEYUP: + if event.key == pygame.K_LEFT or event.key == pygame.K_a: + self.Left_status = False + elif event.key == pygame.K_RIGHT or event.key == pygame.K_d: + self.right_status = False + elif event.key == pygame.K_UP or event.key == pygame.K_w: + self.up_status = False + elif event.key == pygame.K_DOWN or event.key == pygame.K_s: + self.down_status = False + if event.key == pygame.K_LSHIFT: + if "run" in self.player.status: + self.player.status.remove("run") + + + def __show(self, info, dest=(0, 0)): + """ + 显示调试文本 + """ + if not isinstance(info, str): + info = str(info) + info_text = self.font.render(info, True, Color.white) + self.screen.blit(info_text, dest) \ No newline at end of file