"Spin" python、pygame 唱首歌游戏中的硬币图像

"Spin" coin image in python, pygame clicker game

所以我目前正在制作唱首歌游戏,而且我已经有了一些非常漂亮的东西。但是因为我想打磨游戏,所以我想给屏幕中央的硬币添加一个旋转的硬币动画。

我有一个 coin.py 文件,它是这样的:

import pygame

class Coin():
    def __init__(self, screen):
        self.screen = screen

        self.image = pygame.image.load('pyfiles/images/click_button.png')
        self.image_x = 230
        self.image_y = 130

        self.scale_change_x = 10
        self.scale_change_y = 10

    def blitme(self):
        self.screen.blit(self.image, (self.image_x, self.image_y))

而目前的游戏玩法是这样的:

如您所见,当我的光标移到硬币图像上时,它变成了黄色。但是现在,我希望它不仅变黄而且像这张图片一样旋转(我在 google 上找到的):

我应该将什么代码添加到我的 coin.py 文件中以使其在我的光标继续(与)硬币碰撞时执行此操作?

如果您有 GIF 动画,请参阅 Animated sprite from few images


如果您没有 GIF 动画或硬币的 sprite sheet,您可以通过沿 y 轴挤压和翻转硬币来实现类似的效果。
使用 pygame.transform.scale() to scale an image and pygame.transform.flip() 翻转它。以下代码片段创建 coin Surface 的旋转效果,该效果取决于特定的 angel:

new_width = round(math.sin(math.radians(angle)) * coin_rect.width) 
rot_coin = coin if new_width >= 0 else pygame.transform.flip(coin, True, False) 
rot_coin = pygame.transform.scale(rot_coin, (abs(new_width), coin_rect.height))
window.blit(rot_coin, rot_coin.get_rect(center = coin_rect.center))

最小示例:

import pygame
import math

pygame.init()
window = pygame.display.set_mode((400, 400))
font = pygame.font.SysFont(None, 40)
clock = pygame.time.Clock()

coin = pygame.Surface((160, 160), pygame.SRCALPHA)
pygame.draw.circle(coin, (255, 255, 0), (80, 80), 80, 10)
pygame.draw.circle(coin, (128, 128, 0), (80, 80), 75)
cointext = pygame.font.SysFont(None, 80).render("10", True, (255, 255, 0))
coin.blit(cointext, cointext.get_rect(center = coin.get_rect().center))
coin_rect = coin.get_rect(center = window.get_rect().center)
angle = 0

run = True
while run:
    clock.tick(60)
    current_time = pygame.time.get_ticks()
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            run = False

    window.fill(0)    
    new_width = round(math.sin(math.radians(angle)) * coin_rect.width) 
    angle += 2
    rot_coin = coin if new_width >= 0 else pygame.transform.flip(coin, True, False) 
    rot_coin = pygame.transform.scale(rot_coin, (abs(new_width), coin_rect.height))
    window.blit(rot_coin, rot_coin.get_rect(center = coin_rect.center))
    pygame.display.flip()

pygame.quit()
exit()