【问题标题】:Why isn't the ellipse drawn to my surface showing up?为什么绘制到我的表面的椭圆没有出现?
【发布时间】:2012-12-26 19:22:29
【问题描述】:

我正在尝试制作一个需要在旋转背景上旋转椭圆的相对简单的动画。我不得不采取一些技巧来让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()

关于上面的backgroundellipse 变量。这两个变量都包含一个pygame.Surface 实例,在该实例上绘制了一些东西。我不会详细介绍background,因为它工作正常。在create_ellipse 中,通过pygame.draw.ellipseellipse 表面上绘制了一个椭圆,黄色。在此之前,ellipse.fill(GREEN) 被调用。 ellipse 的颜色键也设置为 GREEN 以确保整个表面都是透明的除了黄色椭圆被绘制的地方。

问题:我没有看到椭圆

我注释掉了ellipse.set_colorkey 以确保椭圆被正确地blitted。这是。我看到一个绿色矩形出现,当椭圆旋转时尺寸会发生变化。这让我推断出,确实有一个椭圆正在绘制,因为它可以旋转。

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

提前非常感谢!

【问题讨论】:

    标签: python animation pygame geometry-surface blit


    【解决方案1】:
    while True:
        rotate_background()
        rotate_ellipse
        pygame.display.flip()
    

    rotate_elipse() 未被调用,并且没有参数。如果是拼写错误,请使用 print 检查 elipse 是否正在传送到您期望的位置。也许数学不正确?

    你可以简化一些事情,比如width/2 等价于rect.centerx

    【讨论】:

    • 啊,我过于简化了并且打错字了,抱歉!最后一点代码并不是真的要按字面意思理解,而是显示了一切如何联系在一起。如文中所述,我看到了旋转椭圆的证据(表面矩形的大小调整),但我没有看到实际的椭圆。请假设 rotate_ellipse 被正确调用!
    【解决方案2】:

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

    我把 pygame.draw.ellipserect 参数误认为是 center_x_coordinate, center_y_coordinate, width, height

    我将电话改为pygame.draw.ellipse,现在一切正常。

    【讨论】:

      猜你喜欢
      • 2012-03-03
      • 1970-01-01
      • 1970-01-01
      • 2021-04-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多