Menu
CoddyTech

拾取时弹出

本课属于 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 居中。

challenge icon

挑战

简单

收集宝石时,让金色图标弹起。

  1. 在循环之前设置 pop = 1.0,收集宝石时设置 pop = 1.6。
  2. 每一帧都让它逐渐恢复:pop += (1 - pop) * 0.2。
  3. 绘制图标,让它的宽和高都是 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 在线编辑器