Menu
CoddyTech

Bật lên khi nhặt

Thuộc phần Âm thanh và cảm giác chơi trong hành trình Pygame của Coddy. Bài học 18 trên 23.

Khi bạn nhặt được một viên ngọc, điểm số tăng thêm một, nhưng mắt bạn đang nhìn viên ngọc chứ không phải góc màn hình. Hiệu ứng nảy bật ngắn sẽ thu hút mắt bạn đến bộ đếm: biểu tượng phóng to rồi thu nhỏ về kích thước ban đầu.

Giữ một tỷ lệ, 1.0 tương ứng với kích thước bình thường. Khi nhặt được ngọc, đặt tỷ lệ thành 1.6; mỗi khung hình, tỷ lệ dần trở về 1 theo cùng công thức như trước:

pop = 1.6         # khi nhặt được một viên ngọc

pop += (1 - pop) * 0.2    # mỗi khung hình

Khi vẽ, tỷ lệ quyết định kích thước. Tạo Rect với kích thước đó, rồi đặt tâm vào đúng vị trí để biểu tượng lớn dần quanh tâm thay vì từ góc:

size = int(20 * pop)
icon = pygame.Rect(0, 0, size, size)
icon.center = (30, 30)

Biểu tượng phóng to ngay lập tức rồi thu nhỏ dần. Hiệu ứng đó tạo cảm giác nảy bật: tỷ lệ 0.2 đưa biểu tượng trở về kích thước ban đầu trong khoảng một phần tư giây.

Với hình ảnh, thay đổi kích thước bằng pygame.transform.scale_by(image, pop) rồi đặt tâm Rect theo cách tương tự.

challenge icon

Thử thách

Dễ

Làm cho biểu tượng vàng phồng lên khi bạn nhặt được viên ngọc.

  1. Đặt pop = 1.0 trước vòng lặp, rồi đặt pop = 1.6 khi bạn nhặt được viên ngọc.
  2. Mỗi khung hình, làm cho nó dần trở về: pop += (1 - pop) * 0.2.
  3. Vẽ biểu tượng có chiều rộng và chiều cao int(20 * pop) pixel, vẫn căn giữa tại (30, 30).

Nhấn Chơi rồi nhấp vào viên ngọc: biểu tượng sẽ phồng lên rồi thu nhỏ lại. Sau đó nhấn Kiểm tra.

Tự làm thử

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()

Tất cả bài học trong Âm thanh và cảm giác chơi

Tự luyện tập: Playground Pygame