forked from zhiyuan/Project1
添加玩家类、玩家移动与太空场景
This commit is contained in:
1 parent
7ecdc5dc5a
commit
5240227053
2 files changed
+131
No files matched your search
@@ -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
|
||||||
@@ -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)
|
||||||
Reference in new issue
Block a user