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