如何修改Pygame代码实现2D滚动世界的水平与垂直移动功能
问题修复说明
以下是导致运行异常的核心原因及修复方案:
- 背景平铺逻辑错误:原有代码仅支持水平方向的背景拼接,新增垂直移动后,你分开绘制水平、垂直背景的逻辑会造成背景互相覆盖、绘制冗余,是卡顿的核心诱因,需要改为2D四图拼接逻辑实现完整的背景滚动
- 精灵显示异常:你误将玩家圆的颜色设置为和清屏色一致的黑色,在偏暗背景下左右移动时看不到精灵,会误以为仅支持上下移动;同时精灵Y轴坐标计算错误,导致位置偏移,移动观感别扭
- 滚动逻辑参数错误:部分坐标换算时的偏移值设置错误,会导致滚动时精灵位置错位
- 性能冗余:设置500FPS没有实际意义,反而会增加不必要的性能消耗,是卡顿的次要原因
修复后完整代码
import sys import pygame from pygame.locals import * W, H = 513,513 HW, HH = W//2, H//2 AREA = W*H # 初始化窗口 CLOCK = pygame.time.Clock() DS = pygame.display.set_mode((W, H)) pygame.display.set_caption("2D世界探索") FPS = 60 # 调整为常规显示帧率,兼顾流畅度和性能消耗 def events(): for event in pygame.event.get(): if event.type==QUIT or (event.type==KEYDOWN and event.key==K_ESCAPE): pygame.quit() sys.exit() # 颜色定义 BLACK = (0, 0, 0, 255) WHITE = (255, 255, 255, 255) bg = pygame.image.load("stage.png").convert() bgWidth, bgHeight = bg.get_rect().size stageWidth = bgWidth*2 stageHeight = bgHeight*2 stagePosX = 0 stagePosY = 0 startScrollingPosX = HW startScrollingPosY = HH circleRadius = 25 circlePosX = circleRadius circlePosY = circleRadius playerPosX = circleRadius playerPosY = circleRadius playerVelocityX = 0 playerVelocityY = 0 while True: events() k = pygame.key.get_pressed() # 水平方向控制 if k[K_RIGHT]: playerVelocityX = 1 elif k[K_LEFT]: playerVelocityX = -1 else: playerVelocityX = 0 # 垂直方向控制 if k[K_UP]: playerVelocityY = -1 elif k[K_DOWN]: playerVelocityY = 1 else: playerVelocityY = 0 # 玩家水平位置更新与边界判断 playerPosX += playerVelocityX if playerPosX > stageWidth - circleRadius: playerPosX = stageWidth - circleRadius if playerPosX < circleRadius: playerPosX = circleRadius if playerPosX < startScrollingPosX: circlePosX = playerPosX elif playerPosX > stageWidth - startScrollingPosX: circlePosX = playerPosX - stageWidth + W else: circlePosX = startScrollingPosX stagePosX += -playerVelocityX # 玩家垂直位置更新与边界判断 playerPosY += playerVelocityY if playerPosY > stageHeight - circleRadius: playerPosY = stageHeight - circleRadius if playerPosY < circleRadius: playerPosY = circleRadius if playerPosY < startScrollingPosY: circlePosY = playerPosY elif playerPosY > stageHeight - startScrollingPosY: circlePosY = playerPosY - stageHeight + H else: circlePosY = startScrollingPosY stagePosY += -playerVelocityY # 2D背景平铺逻辑 rel_x = stagePosX % bgWidth rel_y = stagePosY % bgHeight DS.blit(bg, (rel_x - bgWidth, rel_y - bgHeight)) DS.blit(bg, (rel_x, rel_y - bgHeight)) DS.blit(bg, (rel_x - bgWidth, rel_y)) DS.blit(bg, (rel_x, rel_y)) # 绘制玩家精灵 pygame.draw.circle(DS, WHITE, (circlePosX, playerPosY - circleRadius), circleRadius, 0) pygame.display.update() CLOCK.tick(FPS) DS.fill(BLACK)
内容的提问来源于stack exchange,提问作者grommet
相关产品推荐
相关产品推荐

