Edelsteinsuche
Teil des Abschnitts Die Spielschleife der Pygame-Journey von Coddy. Lektion 17 von 32.
Jetzt wird die Kiste zum Spiel. Jeder Edelstein erscheint unter der Kiste: Ziehe die Kiste weg und klicke auf den Edelstein, dann bewegt sich die Kiste auf den nächsten. Eine Runde dauert 30 Sekunden.
Platziere die Kiste auf dem Edelstein, indem du ihr das Zentrum des Edelsteins zuweist: crate.center = gem.center. Mach das vor der Schleife und jedes Mal, wenn ein neuer Edelstein erscheint.
Zähle die Zeit in Frames. Bei 60 Frames pro Sekunde entsprechen 30 Sekunden 1800 Frames:
time_left = 1800
while running:
# Ereignisse
if time_left > 0:
time_left -= 1Wenn time_left 0 erreicht, nimmt das Spiel keine Klicks und Ziehbewegungen mehr entgegen, und die Ergebniszeile zeigt das Resultat. Füge and time_left > 0 zu den Tests für MOUSEBUTTONDOWN und MOUSEMOTION hinzu.
Ein Balken am oberen Rand zeigt die verbleibende Zeit. Seine Breite entspricht dem noch verbleibenden Anteil der Runde: 480 * time_left // 1800 ist am Anfang 480, auf halber Strecke 240 und am Ende 0.
Aufgabe
Mittel- Nachdem du die Kiste erstellt hast, setze
crate.center = gem.center. Mache dasselbe, nachdem ein eingesammelter Edelstein einen neuen Platz bekommen hat. - Setze vor der Schleife
time_left = 1800. Ziehe in der Schleife nach den Ereignissen 1 davon ab, solange der Wert über 0 liegt. - Verarbeite
MOUSEBUTTONDOWNundMOUSEMOTIONnur, solangetime_left > 0gilt. - Zeichne nach der Punktestandreihe den Zeitbalken: grün
(120, 200, 120)bei(0, 0, 480 * time_left // 1800, 6).
Probier es selbst
import random
import pygame
pygame.init()
screen = pygame.display.set_mode((480, 360))
pygame.display.set_caption("Gem Hunt")
clock = pygame.time.Clock()
gem = pygame.Rect(225, 165, 30, 30)
crate = pygame.Rect(40, 230, 60, 60)
dragging = False
score = 0
running = True
while running:
for event in pygame.event.get():
if event.type == pygame.QUIT:
running = False
elif event.type == pygame.MOUSEBUTTONDOWN:
if crate.collidepoint(event.pos):
dragging = True
elif gem.collidepoint(event.pos):
score += 1
gem.x = random.randint(15, 435)
gem.y = random.randint(55, 315)
elif event.type == pygame.MOUSEBUTTONUP:
dragging = False
elif event.type == pygame.MOUSEMOTION and dragging:
crate.move_ip(event.rel)
screen.fill((30, 30, 46))
gem_points = [gem.midtop, gem.midright, gem.midbottom, gem.midleft]
pygame.draw.polygon(screen, (80, 220, 255), gem_points)
if gem.collidepoint(pygame.mouse.get_pos()):
pygame.draw.rect(screen, (255, 196, 0), gem.inflate(10, 10), 2)
pygame.draw.rect(screen, (150, 100, 50), crate)
pygame.draw.rect(screen, (110, 70, 35), crate, 3)
for i in range(score):
pygame.draw.rect(screen, (240, 110, 180), (10 + 10 * i, 14, 8, 8))
mouse_x, mouse_y = pygame.mouse.get_pos()
pygame.draw.circle(screen, (240, 240, 240), (mouse_x, mouse_y), 10, 2)
pygame.display.flip()
clock.tick(60)
pygame.quit()
Diese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.
Alle Lektionen in Die Spielschleife
3Die Maus
Dem Zeiger folgenKlicke auf den EdelsteinÜbe selbstständig: Pygame-Playground