如何修复Pymunk代码运行时屏幕黑屏问题?
问题解决:Pymunk+Pygame黑屏修复
你的代码存在几个关键错误导致屏幕黑屏,逐个修正即可恢复正常:
错误点与修复方式
- 缩进逻辑错误:主循环里的屏幕填充、小球绘制、物理更新、画面刷新代码,全部缩进在
pygame.QUIT事件的判断分支内,只有点击关闭窗口时才会执行,正常运行时完全不会触发绘制逻辑。需将这些代码移到事件循环外部,与for event同级。 - 类方法缩进错误:
Ball类的draw方法定义在了__init__方法内部,属于局部函数,外部无法调用ball.draw()。需将draw方法的缩进调整到与__init__同级,作为类的成员方法。 - 变量拼写错误:
screeen.fill多写了一个字母e,修正为screen.fill。 - 颜色参数格式错误:
screen.fill的颜色值需要传入元组,应写成screen.fill((217,217,217)),而非三个单独的数值参数。 - 坐标系统不匹配:Pymunk的y轴方向向下,Pygame的y轴方向向上,直接使用Pymunk的位置绘制会导致小球移动方向与预期相反,需在绘制时转换y坐标。
修正后的完整代码
import pygame, sys import pymunk import pymunk.pygame_util from pymunk.vec2d import Vec2d size = (800, 800) FPS = 120 space = pymunk.Space() space.gravity = (0, 250) pygame.init() screen = pygame.display.set_mode(size) clock = pygame.time.Clock() class Ball: def __init__(self, pos): self.body = pymunk.Body(1, 1, body_type=pymunk.Body.DYNAMIC) # 转换初始坐标适配Pygame的y轴方向 self.body.position = (pos[0], size[1] - pos[1]) self.radius = 60 self.shape = pymunk.Circle(self.body, self.radius) space.add(self.body, self.shape) def draw(self): # 绘制时转换y坐标,匹配Pygame坐标系 x = int(self.body.position.x) y = size[1] - int(self.body.position.y) pygame.draw.circle(screen, (255,0,0), (x,y), self.radius) balls = [] balls.append(Ball((400, 0))) balls.append(Ball((100, 0))) balls.append(Ball((600, 100))) while True: for event in pygame.event.get(): if event.type == pygame.QUIT: pygame.quit() sys.exit() # 核心绘制与更新逻辑移至事件循环外部 screen.fill((217,217,217)) for ball in balls: ball.draw() space.step(1/FPS) # 使用与帧率匹配的步长,提升物理模拟稳定性 pygame.display.update() clock.tick(FPS)
内容的提问来源于stack exchange,提问作者Kitty
相关产品推荐
相关产品推荐

