You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何修复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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.25 04:27:27