我想要做一个相对简单的动画,需要在旋转的背景上旋转一个椭圆。我不得不采取一些欺骗手段让pygame.transform.rotate
与我尝试旋转的表面发挥很好的作用。也就是说,我做了这个功能recenters从pygame中的旋转功能获得新的RECT:为什么椭圆不是画在我的表面上?
def recenter(orig_rect, rotated_surf):
oldcenter = orig_rect.center
rotRect = rotated_surf.get_rect()
rotRect.center = oldcenter
screen.blit(rotated_surf, rotRect)
的functionning是相当不言自明。我意识到原始的(未旋转的)表面仍然会传到显示器上,但这并不是真正的问题。别担心。
上述功能用于通过旋转功能(背景&椭圆)这样:
# 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
变量A字以上。这两个变量都包含一个pygame.Surface
实例,在该实例上绘制了事物。我不会详细介绍background
,因为它工作正常。在create_ellipse
中,通过pygame.draw.ellipse
以黄色将椭圆绘制到ellipse
表面上。在此之前,ellipse.fill(GREEN)
被调用。 ellipse
的颜色代码也设置为GREEN
,以确保整个表面都是透明的,其中绘制了黄色椭圆的。
的问题:我没有看到椭圆
我注释掉ellipse.set_colorkey
,以确保椭圆被正确位图混合。它是。当椭圆旋转时,我看到一个绿色的直尺出现了尺寸的变化。这使我推断,确实存在一个椭圆,因为它可以旋转。
什么给?如果它可以有用,我可以提供完整的代码。整个事情大概有200行,但我希望我的解释对你们来说已经足够了。我想我们应该从本地开始并向外工作=)
非常感谢!
啊,我简化了**和**的拼写错误,对不起!最后一点代码并不意味着从字面上理解,而是展示了如何将所有东西联系在一起。正如文中所提到的,我看到了旋转椭圆(表面的矩形的大小调整)的证据,但我没有看到实际的椭圆。请假定正在调用rotate_ellipse! – blz