效果展示
import pygame
import sys
pygame.init()
# 设置帧率控制
clock = pygame.time.Clock()
FPS = 60
# 游戏窗口设置
SCREEN_WIDTH = 800
SCREEN_HEIGHT = 640
LOWER_MARGIN = 100 # 下方边距,用于放置按钮等UI
SIDE_MARGIN = 300 # 右侧边距,用于放置图块选择面板
# 创建游戏窗口(主窗口 + 边距)
screen = pygame.display.set_mode((SCREEN_WIDTH + SIDE_MARGIN, SCREEN_HEIGHT + LOWER_MARGIN))
pygame.display.set_caption('关卡编辑器') # 设置窗口标题
# 定义游戏变量
ROWS = 16 # 地图行数
MAX_COLS = 150 # 地图最大列数
TILE_SIZE = SCREEN_HEIGHT // ROWS # 每个图块的大小
TILE_TYPES = 21 # 图块种类数量
level = 0 # 当前编辑的关卡编号
current_tile = 0 # 当前选中的图块编号
scroll_left = False # 控制是否向左滚动地图
scroll_right = False # 控制是否向右滚动地图
scroll = 0 # 地图当前滚动偏移量
scroll_speed = 1 # 滚动速度
# 定义颜色常量
GREEN = (144, 201, 120)
WHITE = (255, 255, 255)
RED = (200, 25, 25)
# 加载背景图片
pine1_img = pygame.image.load('img/Background/pine1.png').convert_alpha()
pine2_img = pygame.image.load('img/Background/pine2.png').convert_alpha()
mountain_img = pygame.image.load('img/Background/mountain.png').convert_alpha()
sky_img = pygame.image.load('img/Background/sky_cloud.png').convert_alpha()
# 绘制背景函数:绘制天空、山、松树等远景
def draw_bg():
screen.fill(GREEN) # 填充绿色背景
width = sky_img.get_width()
for x in range(4):
# 多张背景图循环绘制,并根据滚动调整位置
screen.blit(sky_img, ((x * width) - scroll * 0.5, 0)) # 天空层
screen.blit(mountain_img, ((x * width) - scroll * 0.6, SCREEN_HEIGHT - mountain_img.get_height() - 300)) # 山层
screen.blit(pine1_img, ((x * width) - scroll * 0.7, SCREEN_HEIGHT - pine1_img.get_height() - 150)) # 松树1层
screen.blit(pine2_img, ((x * width) - scroll * 0.8, SCREEN_HEIGHT - pine2_img.get_height())) # 松树2层
# 绘制网格线(辅助对齐图块)
def draw_grid():
# 绘制垂直线
for c in range(MAX_COLS + 1):
pygame.draw.line(screen, WHITE, (c * TILE_SIZE - scroll, 0), (c * TILE_SIZE - scroll, SCREEN_HEIGHT))
# 绘制水平线
for c in range(ROWS + 1):
pygame.draw.line(screen, WHITE, (0, c * TILE_SIZE), (SCREEN_WIDTH, c * TILE_SIZE))
run = True
while run:
clock.tick(FPS) # 控制帧率
draw_bg() # 绘制背景
draw_grid() # 绘制网格线
# 地图滚动逻辑
if scroll_left and scroll > 0:
scroll -= 5 * scroll_speed
if scroll_right and scroll < (MAX_COLS * TILE_SIZE) - SCREEN_WIDTH:
scroll += 5 * scroll_speed
for event in pygame.event.get():
if event.type == pygame.QUIT:
run = False
pygame.quit()
sys.exit()
# 键盘按下事件
if event.type == pygame.KEYDOWN:
if event.key == pygame.K_LEFT:
scroll_left = True # 左箭头开始向左滚动
if event.key == pygame.K_RIGHT:
scroll_right = True # 右箭头开始向右滚动
if event.key == pygame.K_LSHIFT:
scroll_speed = 5 # 左Shift加速滚动
if event.type == pygame.KEYUP:
if event.key == pygame.K_LEFT:
scroll_left = False # 松开左箭头停止向左滚动
if event.key == pygame.K_RIGHT:
scroll_right = False # 松开右箭头停止向右滚动
if event.key == pygame.K_LSHIFT:
scroll_speed = 1 # 松开左Shift恢复正常滚动速度
pygame.display.update()
