From 6050bca9332100d28b48d5154e5e0f2951dd769b Mon Sep 17 00:00:00 2001 From: chicrobot Date: Mon, 27 Jul 2026 23:51:23 +0800 Subject: [PATCH] =?UTF-8?q?=E5=AE=9E=E7=8E=B0=E5=A4=9A=E5=9C=BA=E6=99=AF?= =?UTF-8?q?=E6=9D=A5=E5=9B=9E=E5=88=87=E6=8D=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/config/scenes.py | 8 ++++++++ src/scenes/base_scene.py | 4 ++-- src/scenes/game_scene.py | 34 ++++++++++++++++++++++++++++++++-- src/scenes/main_menu_scene.py | 4 ++-- start.py | 9 +++++++-- 5 files changed, 51 insertions(+), 8 deletions(-) create mode 100644 src/config/scenes.py diff --git a/src/config/scenes.py b/src/config/scenes.py new file mode 100644 index 0000000..286d91b --- /dev/null +++ b/src/config/scenes.py @@ -0,0 +1,8 @@ +from src.scenes.main_menu_scene import MainMenuScene +from src.scenes.game_scene import GameScene + + +scene_dict = { + "MainMenuScene": MainMenuScene, + "GameScene": GameScene, +} diff --git a/src/scenes/base_scene.py b/src/scenes/base_scene.py index 5893318..4c40730 100644 --- a/src/scenes/base_scene.py +++ b/src/scenes/base_scene.py @@ -21,8 +21,8 @@ class BaseScene: """ pass - def switch_to_scene(self, scene_class): + def switch_to_scene(self, scene_name): """ 切换场景 """ - self.next_scene = scene_class(self.screen, self.clock) \ No newline at end of file + self.next_scene = scene_name \ No newline at end of file diff --git a/src/scenes/game_scene.py b/src/scenes/game_scene.py index e3c2822..a4c0eca 100644 --- a/src/scenes/game_scene.py +++ b/src/scenes/game_scene.py @@ -1,12 +1,24 @@ +import os + import pygame -from src.config.game_config import GameConfig +from src.config.game_config import data_path, GameConfig from src.scenes.base_scene import BaseScene class GameScene(BaseScene): + name = "GameScene" def __init__(self, screen, clock): super().__init__(screen, clock) + # 初始化音乐 + pygame.mixer.init() + # 播放并循环音乐 + pygame.mixer_music.load(os.path.join(data_path(), "vespidaze-upbeat-rpg-battle-460971.mp3")) + pygame.mixer_music.play(-1) + + self.back_status = False + + # 状态值 self.dirty_x = 400 self.dirty_y = 300 @@ -21,6 +33,8 @@ class GameScene(BaseScene): self.BLUE = (0, 0, 255) def update(self): + if self.back_status: + self.switch_to_scene("MainMenuScene") if self.Left_status and self.dirty_x >= 0: self.dirty_x -= 1 if self.right_status and self.dirty_x <= GameConfig.window_x - 20: @@ -29,11 +43,26 @@ class GameScene(BaseScene): self.dirty_y -= 1 if self.down_status and self.dirty_y <= GameConfig.window_y - 30: self.dirty_y += 1 + # 填充窗口颜色 + self.screen.fill((255, 255, 255)) + + # 绘制矩形(移动体和固定体) dirty = pygame.draw.rect(self.screen, self.BLUE, [self.dirty_x, self.dirty_y, 20, 30]) + enemy = pygame.draw.rect(self.screen, self.RED, [40, 60, 10, 10]) + + # 碰撞监测 + if dirty.colliderect(enemy): + print("die") + self.dirty_x = 400 + self.dirty_y = 300 + dirty = pygame.draw.rect(self.screen, self.BLUE, [self.dirty_x, self.dirty_y, 20, 30]) def handle_event(self, event): + # 按下按键 if event.type == pygame.KEYDOWN: - if event.key == pygame.K_LEFT or event.key == pygame.K_a: + if event.key == pygame.K_ESCAPE: + self.back_status = True + 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 @@ -41,6 +70,7 @@ class GameScene(BaseScene): self.up_status = True elif event.key == pygame.K_DOWN or event.key == pygame.K_s: self.down_status = True + # 松开按键 elif event.type == pygame.KEYUP: if event.key == pygame.K_LEFT or event.key == pygame.K_a: self.Left_status = False diff --git a/src/scenes/main_menu_scene.py b/src/scenes/main_menu_scene.py index 895b4b9..b5d2690 100644 --- a/src/scenes/main_menu_scene.py +++ b/src/scenes/main_menu_scene.py @@ -5,10 +5,10 @@ import pygame from src.config.color import Color from src.config.game_config import data_path, GameConfig from src.scenes.base_scene import BaseScene -from src.scenes.game_scene import GameScene class MainMenuScene(BaseScene): + name = "MainMenuScene" """ 主菜单场景,显示提示信息,展示雨天特效 """ @@ -37,7 +37,7 @@ class MainMenuScene(BaseScene): def update(self): # 按键按下则切换场景 if self.button_status: - self.switch_to_scene(GameScene) + self.switch_to_scene("GameScene") # 显示提示文本 screen_rect = self.screen.get_rect() # 获取屏幕矩形 diff --git a/start.py b/start.py index 4b28203..f551c1e 100644 --- a/start.py +++ b/start.py @@ -1,6 +1,7 @@ import pygame from src.config.game_config import GameConfig +from src.config.scenes import scene_dict from src.scenes.main_menu_scene import MainMenuScene @@ -16,8 +17,10 @@ class Game: # 设置计时器 self.clock = pygame.time.Clock() + # 场景字典 + self.game_scenes = scene_dict # 当前场景 - self.scene = MainMenuScene(self.screen, self.clock) + self.scene = self.game_scenes["MainMenuScene"](self.screen, self.clock) # 运行循环 self.running = True @@ -35,7 +38,9 @@ class Game: # 检查是否切换场景 if self.scene.next_scene is not None: - self.scene = self.scene.next_scene + if self.scene.next_scene in self.game_scenes.keys(): + scene_class = self.game_scenes[self.scene.next_scene] + self.scene = scene_class(self.screen, self.clock) # 清屏 self.screen.fill(GameConfig.bg_color)