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ìnhKhi 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ự.
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.
- Đặt
pop = 1.0trước vòng lặp, rồi đặtpop = 1.6khi bạn nhặt được viên ngọc. - Mỗi khung hình, làm cho nó dần trở về:
pop += (1 - pop) * 0.2. - 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
4Rung màn hình và chớp sáng khi trúng đòn
Rung màn hìnhChớp sáng khi trúng đònKhựng hình khi trúng đònGiữ hiệu ứng tinh tế5Chuyển động mượt mà
Di chuyển về phía mục tiêuCamera mượt màBật lên khi nhặtMượt mà ở mọi tốc độ khung hìnhTự luyện tập: Playground Pygame