Sebuah Peristiwa Timer
Termasuk bagian Aturan Game dalam perjalanan Pygame di Coddy. Pelajaran 11 dari 29.
Satu poin untuk setiap batu yang jatuh melewati kamu memberi imbalan untuk menunggu. Satu poin untuk setiap detik kamu bertahan terasa lebih adil. pygame dapat mengirim event tersendiri ke gamemu setiap detik.
Tipe event adalah angka. pygame.USEREVENT adalah event pertama yang disediakan pygame untuk kamu, jadi beri nama eventmu berdasarkan itu:
POINT = pygame.USEREVENT + 1
...
pygame.time.set_timer(POINT, 1000)Setelah itu, event POINT tiba setiap 1000 ms bersama event lainnya, dan kamu menanganinya seperti penekanan tombol:
if event.type == POINT and state == "play":
score += 1Timer tetap berjalan di menu dan layar game over, jadi periksa kondisinya. Memanggil set_timer lagi akan memulainya ulang, itulah sebabnya perintah itu diletakkan di reset(): setiap permainan baru menunggu satu detik penuh sebelum mendapat poin pertama.
Tantangan
Sedang- Tambahkan
POINT = pygame.USEREVENT + 1setelah warna. - Di
reset(), mulai timer yang mengirimPOINTsetiap 1000 ms. - Saat terjadi peristiwa
POINTselama permainan, tambahkan 1 ke skor. - Batu yang jatuh melewati layar tidak lagi menambah skor.
Coba sendiri
import random
import pygame
pygame.init()
screen = pygame.display.set_mode((480, 360))
pygame.display.set_caption("Meteor Dodge")
clock = pygame.time.Clock()
heart = pygame.image.load("assets/images/heart.png").convert_alpha()
heart_empty = pygame.image.load("assets/images/heart_empty.png").convert_alpha()
font = pygame.font.Font("assets/fonts/pixel.ttf", 24)
big_font = pygame.font.Font("assets/fonts/pixel.ttf", 48)
WHITE = (240, 240, 240)
PLATE = (60, 60, 90)
def reset():
global player, rock, score, lives, hit_time
player = pygame.Rect(220, 300, 40, 40)
rock = pygame.Rect(random.randint(0, 456), -24, 24, 24)
score = 0
lives = 3
hit_time = -2000
def draw_menu():
screen.fill((30, 30, 46))
title = big_font.render("Meteor Dodge", True, WHITE)
title_rect = title.get_rect(center=(240, 140))
pygame.draw.rect(screen, PLATE, title_rect.inflate(24, 12))
screen.blit(title, title_rect)
hint = font.render("Press Enter to play", True, WHITE)
screen.blit(hint, hint.get_rect(center=(240, 200)))
def draw_game():
screen.fill((30, 30, 46))
safe = pygame.time.get_ticks() - hit_time < 1000
if not safe or pygame.time.get_ticks() // 100 % 2 == 0:
pygame.draw.rect(screen, (255, 196, 0), player)
pygame.draw.rect(screen, (235, 80, 80), rock)
score_text = font.render(f"{score:05}", True, WHITE)
score_rect = score_text.get_rect(topright=(470, 10))
pygame.draw.rect(screen, PLATE, score_rect.inflate(12, 8))
screen.blit(score_text, score_rect)
for i in range(3):
if i < lives:
screen.blit(heart, (10 + i * 40, 10))
else:
screen.blit(heart_empty, (10 + i * 40, 10))
def play_frame():
global score, lives, state, hit_time
keys = pygame.key.get_pressed()
if keys[pygame.K_LEFT]:
player.x -= 6
if keys[pygame.K_RIGHT]:
player.x += 6
player.clamp_ip(screen.get_rect())
rock.y += 4
if rock.top > 360:
rock.y = -24
rock.x = random.randint(0, 456)
score += 1
now = pygame.time.get_ticks()
if rock.colliderect(player) and now - hit_time > 1000:
hit_time = now
lives -= 1
if lives == 0:
state = "over"
draw_game()
def draw_over():
draw_game()
message = big_font.render("Game over", True, WHITE)
screen.blit(message, message.get_rect(center=(240, 160)))
hint = font.render("Press R to play again", True, WHITE)
screen.blit(hint, hint.get_rect(center=(240, 200)))
reset()
state = "menu"
running = True
while running:
for event in pygame.event.get():
if event.type == pygame.QUIT:
running = False
if event.type == pygame.KEYDOWN:
if event.key == pygame.K_RETURN and state == "menu":
state = "play"
elif event.key == pygame.K_r and state == "over":
reset()
state = "play"
if state == "menu":
draw_menu()
elif state == "play":
play_frame()
else:
draw_over()
pygame.display.flip()
clock.tick(60)
pygame.quit()
Pelajaran ini berisi kuis singkat. Mulai pelajarannya untuk menjawab kuis dan melacak progresmu.
Semua pelajaran di Aturan Game
3Timer dan Gelombang
Aman Setelah Terkena BenturanSebuah Peristiwa TimerSebuah Batu Setiap 800 msGelombang yang Bertambah BesarHitung Mundur untuk MulaiLatihan sendiri: Playground Pygame