在 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)
我正在制作一个场景,其中有一个竖起大拇指的图像应该在鼠标悬停时变大,并在鼠标不再悬停时缩小回正常大小。
我是这样制作竖起大拇指的图片的:
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)