拾取时弹出
本课属于 Coddy Pygame 学习旅程的“音效与游戏体验”单元。第 18 课,共 23 课。
你收集宝石时,分数会加 1,但你的目光落在宝石上,而不是角落里的计分器。短暂的弹跳会把你的视线吸引到计分器上:图标先变大,然后缩回原来的尺寸。
用一个缩放值,1.0 表示正常尺寸。拾取宝石时,将它设为 1.6;每帧都用和之前相同的公式,让它逐渐回到 1:
pop = 1.6 # 收集到宝石时
pop += (1 - pop) * 0.2 # 每一帧绘制时,缩放值决定尺寸。按这个尺寸创建 Rect,然后将它的中心放到指定位置,这样图标会以中心为基准放大,而不是从角落开始放大:
size = int(20 * pop)
icon = pygame.Rect(0, 0, size, size)
icon.center = (30, 30)图标会立刻变大,然后平滑地缩回去。这就是弹跳效果:每帧缩回差值的 0.2,大约用四分之一秒就能回到原来的尺寸。
对于图像,可以使用 pygame.transform.scale_by(image, pop) 缩放,然后用同样的方法将它的 Rect 居中。
挑战
简单收集宝石时,让金色图标弹起。
- 在循环之前设置
pop = 1.0,收集宝石时设置pop = 1.6。 - 每一帧都让它逐渐恢复:
pop += (1 - pop) * 0.2。 - 绘制图标,让它的宽和高都是
int(20 * pop)像素,并保持中心位于(30, 30)。
按“开始”,然后点击宝石:图标会变大再恢复。然后点击“检查”。
亲手试试
import random
import pygame
pygame.init()
screen = pygame.display.set_mode((480, 360))
pygame.display.set_caption("Gem Picker")
clock = pygame.time.Clock()
font = pygame.font.Font(None, 32)
coin_sound = pygame.mixer.Sound("assets/sounds/coin.ogg")
gem = pygame.Rect(300, 200, 24, 24)
score = 0
running = True
while running:
for event in pygame.event.get():
if event.type == pygame.QUIT:
running = False
elif event.type == pygame.MOUSEBUTTONDOWN and gem.collidepoint(event.pos):
score += 1
coin_sound.play()
gem.topleft = (random.randint(80, 420), random.randint(90, 300))
screen.fill((30, 30, 46))
pygame.draw.rect(screen, (170, 90, 230), gem)
icon = pygame.Rect(0, 0, 20, 20)
icon.center = (30, 30)
pygame.draw.rect(screen, (255, 200, 60), icon)
label = font.render(f"x {score}", True, (240, 240, 240))
screen.blit(label, (52, 20))
pygame.display.flip()
clock.tick(60)
pygame.quit()
音效与游戏体验中的所有课
自己练习: Pygame 在线编辑器