我正在尝试制作一个相对简单的动画,需要在旋转背景上旋转椭圆。我不得不采取一些技巧来pygame.transform.rotate
与我试图旋转的表面打得很好。即,我制作了这个函数来重新定位从 pygame 的旋转函数获得的新矩形:
def recenter(orig_rect, rotated_surf):
oldcenter = orig_rect.center
rotRect = rotated_surf.get_rect()
rotRect.center = oldcenter
screen.blit(rotated_surf, rotRect)
功能是不言自明的。我意识到原来的(未旋转的)表面仍然在显示器上显示,但这并不是真正的问题。别担心。
上述函数由旋转函数(背景和椭圆)使用,如下所示:
# width, height, screen are globals
def rotate_background(surf, speed, t0):
new_angle = ((pygame.time.get_ticks() - t0) * (speed / 1000)) % 360
w, h = surf.get_size()
blittedRect = screen.blit(surf, (width / 2 - w / 2, height / 2 - h / 2))
recenter(blittedRect, pygame.transform.rotate(surf, new_angle))
return surf
def rotate_ellipse(surf, coords, speed, t0):
new_angle = ((pygame.time.get_ticks() - t0) * (speed / 1000)) % 360
if new_angle > 90:
new_angle = 90 # limit rotation
w, h = surf.get_size()
x, y = coords
blittedRect = screen.blit(surf, (width / 2 - w / 2 + x, height / 2 - h / 2 + y))
recenter(blittedRect, pygame.transform.rotate(surf, new_angle))
这些旋转函数被称为每一帧的一个。
这是我的主要游戏循环的简化版本。请注意,这不是实际的生产代码,而是说明上述元素(直接取自代码库)如何结合在一起的:
ellipse = create_ellipse() # returns a surf
background = create_background() # returns a surf
while True:
rotate_background()
rotate_ellipse()
pygame.display.flip()
关于上面的background
和ellipse
变量的一句话。这两个变量都包含一个pygame.Surface
实例,在该实例上绘制了一些东西。我不会详细介绍,background
因为它工作正常。在中,一个椭圆通过,黄色create_ellipse
绘制到表面上。在此之前,被称为。的颜色键也设置为确保整个表面是透明的,除了绘制黄色椭圆的地方。ellipse
pygame.draw.ellipse
ellipse.fill(GREEN)
ellipse
GREEN
问题:我没有看到椭圆
我注释掉ellipse.set_colorkey
以确保椭圆被正确地blitted。这是。我看到一个绿色矩形出现,当椭圆旋转时尺寸会发生变化。这使我推断出确实有一个椭圆正在绘制,因为它可以旋转。
是什么赋予了?如果有用的话,我可以提供完整的代码。整个东西大约有200行,但我希望我上面的解释对你们来说已经足够了。我认为我们应该从本地开始并向外工作 =)
首先十分感谢!