在 Pygame 中鼠标悬停时使图像变大时会发生奇怪的事情

Weird things happening when making image get bigger on mouse hover in Pygame

我正在制作一个场景,其中有一个竖起大拇指的图像应该在鼠标悬停时变大,并在鼠标不再悬停时缩小回正常大小。

我是这样制作竖起大拇指的图片的:

thumbs_up_image = pygame.image.load("./plz_like.png")
thumbs_up_rect = thumbs_up_image.get_rect(topleft=(screen.get_width() // 2 - thumbs_up_image.get_width() + 75,
                                                   screen.get_height() // 2 + thumbs_up_image.get_height() - 225))

这就是我让它变大的方法:


if thumbs_up_rect.collidepoint(pygame.mouse.get_pos()):
    thumbs_up_image = pygame.transform.scale(thumbs_up_image,
                                             [n + 50 for n in thumbs_up_image.get_size()])
    thumbs_up_rect = thumbs_up_image.get_rect()

图片是这样的:

screen.blit(thumbs_up_image, thumbs_up_rect)

问题是,当我将鼠标悬停在点赞图片上时,它首先会转到屏幕的左上角。然后,当我再次将鼠标悬停在它上面时,它会变得非常大并且像素化。

我做错了什么?

尝试使用此 pygame 函数:

pygame.transform.rotozoom(Surface, angle, scale)

我在游戏中也遇到过一些像素化问题,但它似乎可以解决这个问题。

您没有显示实际将图像呈现到屏幕上的代码。;但基本上:你没有保存原始大小 - 在每次悬停事件中它都会增长和增长(并且它会每帧增长一次,如果该代码在主循环中是运行)。

您需要一个变量来保存原始图像,一个告诉您的代码图像已经调整大小,以及一个 if 上的 if 子句来恢复原始图像:pygame 不会为你那样做。

此外,当您对图像使用 get_rect 时,其左上角位置将始终为“0, 0” - 您必须将此左上角平移到合适的坐标 - 获取原始精灵的矩形中心(无论其在屏幕上的位置数据在哪里),并在新矩形上设置相同的中心应该可行。

最后,更喜欢“rotozoom”而不是“scale” - Pygame 文档清楚地表明第二种方法使用更好的缩放算法。

我自己想出来了

我是这样做的:

首先我准备了一张大图,是正方形的:(如下图)

big_thumbs_image = pygame.transform.scale(thumbs_up_image, [i + 50 for i in thumbs_up_image.get_size()])

big_thumbs_image_rect = thumbs_up_image.get_rect(
    topleft=(screen.get_width() // 2 - thumbs_up_image.get_width() + 55,
             screen.get_height() // 2 + thumbs_up_image.get_height() - 250))

然后,当小图像的矩形与鼠标碰撞时,blit 大图像:

if thumbs_up_rect.collidepoint(pygame.mouse.get_pos()):
    screen.blit(big_thumbs_image, big_thumbs_image_rect)