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