为什么我的表面上的椭圆不会出现?

时间:2012-12-26 19:22:29

标签: python animation pygame geometry-surface blit

我正在尝试做一个相对简单的动画,需要在旋转的背景上旋转椭圆。我不得不采用一些技巧让pygame.transform.rotate与我正在尝试旋转的表面一起玩得很好。也就是说,我已经使这个函数重新定义了从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)

功能是相当不言自明的。我意识到原始(未旋转)的表面仍然在显示器上显示,但事实证明并不是真正的问题。别担心。

旋转功能(背景和椭圆)使用上述功能:

# 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变量的说法。这两个变量都包含一个pygame.Surface实例,在该实例上绘制了一些内容。由于工作正常,我不会详细介绍background。在create_ellipse中,通过ellipse以黄色在pygame.draw.ellipse曲面上绘制椭圆。在此之前,ellipse.fill(GREEN)被调用。 ellipse的颜色键也设置为GREEN,以确保整个曲面是透明的除了,其中绘制了黄色椭圆。

问题:我没有看到椭圆

我注释掉了ellipse.set_colorkey以确保椭圆正确无效。它是。我看到一个绿色的直尺出现,随着椭圆的旋转,尺寸会发生变化。这使我推断,确实有一个椭圆被绘制,因为它可以旋转。

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

非常感谢!

2 个答案:

答案 0 :(得分:0)

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

rotate_elipse()没有被调用,也没有参数。如果这是一个错字,请使用打印来检查elipse是否与您期望的位置相关。也许数学不对?

您可以简化一些事情,例如width/2等同于rect.centerx

答案 1 :(得分:0)

好的,问题源于我自己的愚蠢。

我将rect的{​​{1}}参数误认为pygame.draw.ellipse

我将调用改为center_x_coordinate, center_y_coordinate, width, height,现在一切正常。