我该如何旋转一组pygame对象(无论是矩形还是图像)?

4
一幅图胜过千言万语,因此,我的问题是“我该如何实现这一点?”:
直觉告诉我,可以在pygame.display.set_mode定义的主显示对象中定义一个表面,在表面上绘制(或拼贴)所需内容,然后使用pygame.transform.rotate对其进行旋转。 我认为,静态点可以直接绘制到下面代码中由pygame.display.set_mode函数返回的screen对象中。
因此,我起草了以下测试代码,但我没有看到任何旋转效果。 我做错了什么?
#!/usr/bin/env python

import pygame as pg
from pygame.locals import *

SIZE = (800, 600)
BGCOL = (128, 128, 128)
STIMCOL = (80, 255, 80)

screen = pg.display.set_mode((SIZE), HWSURFACE | DOUBLEBUF)
screen.fill(BGCOL)

surf = pg.Surface((200, 200), flags=HWSURFACE)
surf.fill(BGCOL)

pg.draw.rect(surf, STIMCOL, (10, 20, 40, 50))
pg.draw.rect(surf, STIMCOL,  (60, 70, 80, 90))

screen.blit(surf, (100, 100))

pg.display.flip()

running = True
while running:
    pg.transform.rotate(surf, -1)
    pg.display.flip()

当然,如果有更好的方法来做到这一点,我非常乐意聆听。也许“sprite groups”是一个不错的选择?(尽管我以前从未使用过...=/)

谢谢!

1个回答

2

你的代码中有几个错误:

pygame.transform.rotate(surface,angle) 返回旋转后的表面(surface)

并且你没有在while循环中blit表面(surface)。因此你的代码应该是这样的:

import pygame as pg
from pygame.locals import *

SIZE = (800, 600)
BGCOL = (128, 128, 128)
STIMCOL = (80, 255, 80)

screen = pg.display.set_mode((SIZE), HWSURFACE | DOUBLEBUF)
screen.fill(BGCOL)

surf = pg.Surface((200, 200), flags=HWSURFACE)
surf.fill(BGCOL)

pg.draw.rect(surf, STIMCOL, (10, 20, 40, 50))
pg.draw.rect(surf, STIMCOL,  (60, 70, 80, 90))

screen.blit(surf, (100, 100))

pg.display.flip()

running = True
while running:
    surf = pg.transform.rotate(surf, -1) # updating rotation on the surface
    screen.blit(surf, (100, 100)) #bliting the resulting image every frame
    pg.display.flip()

编辑:在查阅了pygame文档中的评论后,发现当旋转角度不为90度时,调整图像大小存在许多问题。您应该跟踪旋转,并通过逐渐增加的角度从头开始旋转图像。


这是朝正确方向迈出的一步,但我运行了代码后,矩形直接滚出屏幕,再也没有回来...=( - Louis Thibault
正如我在编辑中所说,如果旋转角度不是90度,则生成的表面会变大。您可以在http://www.pygame.org/docs/ref/transform.html中找到解决此问题的代码,该代码在rotate的注释中。 - Bartlomiej Lewandowski

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接