Zdarzenie timera
Część sekcji Zasady gry ścieżki Pygame w Coddy. Lekcja 11 z 29.
Za każdy głaz, który spadnie poza planszę, czekają nagrody w postaci punktów. Sprawiedliwiej będzie przyznawać punkt za każdą sekundę przetrwania. pygame może co sekundę wysyłać do twojej gry własne zdarzenie.
Typy zdarzeń to liczby. pygame.USEREVENT to pierwszy typ, który pygame zostawia do twojej dyspozycji, więc nadaj swojemu typowi numer na jego podstawie:
POINT = pygame.USEREVENT + 1
...
pygame.time.set_timer(POINT, 1000)Od tej chwili co 1000 ms, wraz z innymi zdarzeniami, pojawia się zdarzenie POINT. Obsłuż je tak samo jak naciśnięcie klawisza:
if event.type == POINT and state == "play":
score += 1Licznik czasu działa nadal w menu i na ekranie końca gry, więc sprawdzaj stan. Ponowne wywołanie set_timer uruchamia go od nowa, dlatego umieść je w reset(): w każdej nowej grze na pierwszy punkt trzeba poczekać pełną sekundę.
Wyzwanie
Średni- Dodaj
POINT = pygame.USEREVENT + 1po kolorach. - W
reset()uruchom timer, który wysyłaPOINTco 1000 ms. - Podczas gry, gdy wystąpi zdarzenie
POINT, dodaj 1 do wyniku. - Spadające skały nie dają już punktów.
Spróbuj swoich sił
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()
Ta lekcja zawiera krótki quiz. Zacznij lekcję, żeby na niego odpowiedzieć i śledzić swoje postępy.
Wszystkie lekcje w sekcji Zasady gry
Poćwicz samodzielnie: Edytor online Pygame