2012-12-26 41 views
1

我想要做一个相对简单的动画,需要在旋转的背景上旋转一个椭圆。我不得不采取一些欺骗手段让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() 

有关backgroundellipse变量A字以上。这两个变量都包含一个pygame.Surface实例,在该实例上绘制了事物。我不会详细介绍background,因为它工作正常。在create_ellipse中,通过pygame.draw.ellipse以黄色将椭圆绘制到ellipse表面上。在此之前,ellipse.fill(GREEN)被调用。 ellipse的颜色代码也设置为GREEN,以确保整个表面都是透明的,其中绘制了黄色椭圆的

的问题:我没有看到椭圆

我注释掉ellipse.set_colorkey,以确保椭圆被正确位图混合。它是。当椭圆旋转时,我看到一个绿色的直尺出现了尺寸的变化。这使我推断,确实存在一个椭圆,因为它可以旋转。

什么给?如果它可以有用,我可以提供完整的代码。整个事情大概有200行,但我希望我的解释对你们来说已经足够了。我想我们应该从本地开始并向外工作=)

非常感谢!

回答

0

好了,所以这个问题从我自己的愚蠢可怕的茎。

我误认为pygame.draw.ellipse的参数rectcenter_x_coordinate, center_y_coordinate, width, height

我改变了我的电话pygame.draw.ellipse,现在一切都很好。

0
while True: 
    rotate_background() 
    rotate_ellipse 
    pygame.display.flip() 

rotate_elipse()不会被调用,并且没有参数。如果是拼写错误,请使用打印来检查elipse是否符合您的期望。也许这个数学不正确?

可以简化的东西,比如width/2相当于rect.centerx

+0

啊,我简化了**和**的拼写错误,对不起!最后一点代码并不意味着从字面上理解,而是展示了如何将所有东西联系在一起。正如文中所提到的,我看到了旋转椭圆(表面的矩形的大小调整)的证据,但我没有看到实际的椭圆。请假定正在调用rotate_ellipse! – blz