添加玩家类、玩家移动与太空场景

This commit is contained in:
chicrobot committed 2026-08-05 23:09:21 +08:00
1 parent 7ecdc5dc5a
commit 5240227053
2 files changed
+131

No files matched your search

+26
View File
@@ -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
+105
View File
@@ -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)