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

如何将Pygame窗口屏幕旋转90度?pygame.transform.rotate无效怎么办?

Pygame窗口整体屏幕旋转90度的实现方案

Pygame本身没有提供直接旋转窗口的原生API,你之前遇到的pygame.transform.rotate()仅作用于单个Surface的问题是正常的,要实现整个窗口内容旋转,我们可以通过离屏缓冲的方式间接实现:

  • 第一步:调整窗口的宽高数值,旋转90度的话把原来的宽高互换,比如原设计的游戏画面尺寸是(800, 600),旋转后窗口尺寸设为(600, 800)
  • 第二步:创建一个和原设计画面尺寸一致的离屏缓冲Surface,所有游戏内容都先绘制到这个离屏Surface上,不要直接绘制到主显示Surface
  • 第三步:每帧渲染完成后,用pygame.transform.rotate()把离屏Surface旋转90度,再适配到当前窗口的尺寸
  • 第四步:把处理好的Surface绘制到主显示Surface上,再调用pygame.display.flip()更新屏幕

可参考以下示例代码:

import pygame

pygame.init()
# 原设计的游戏画面尺寸
original_size = (800, 600)
# 旋转90度后的窗口尺寸,宽高互换
window_size = (original_size[1], original_size[0])
screen = pygame.display.set_mode(window_size)
# 创建离屏缓冲Surface
offscreen_surface = pygame.Surface(original_size)

clock = pygame.time.Clock()
running = True
while running:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running = False
    
    # 所有绘制操作都先画到offscreen_surface上,比如填充背景、画角色、UI等
    offscreen_surface.fill((0, 0, 255))
    pygame.draw.circle(offscreen_surface, (255, 0, 0), (400, 300), 50)
    
    # 旋转离屏Surface 90度,再缩放到窗口尺寸
    rotated_surface = pygame.transform.rotate(offscreen_surface, 90)
    scaled_surface = pygame.transform.scale(rotated_surface, window_size)
    
    # 把最终画面绘制到主屏幕
    screen.blit(scaled_surface, (0, 0))
    pygame.display.flip()
    clock.tick(60)

pygame.quit()

注意事项:

  1. 旋转后所有的鼠标点击坐标需要做坐标转换,比如原来的鼠标坐标(x,y),旋转90度后对应的原画面坐标为(y, original_size[0] - x),否则点击检测会错位
  2. 如果对性能要求较高,可以提前计算好旋转和缩放的参数,避免每帧重复计算不必要的缩放开销
  3. 该方案对90/180/270这几个直角旋转适配效果最好,非直角旋转会出现黑边,需要额外做裁切处理

内容的提问来源于stack exchange,提问作者devesh marwah

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 15:48:03