Menu
CoddyTech

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 -= 1

Wenn 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.

challenge icon

Aufgabe

Mittel
  1. Nachdem du die Kiste erstellt hast, setze crate.center = gem.center. Mache dasselbe, nachdem ein eingesammelter Edelstein einen neuen Platz bekommen hat.
  2. Setze vor der Schleife time_left = 1800. Ziehe in der Schleife nach den Ereignissen 1 davon ab, solange der Wert über 0 liegt.
  3. Verarbeite MOUSEBUTTONDOWN und MOUSEMOTION nur, solange time_left > 0 gilt.
  4. 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()
quiz iconTeste dich selbst

Diese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.

Alle Lektionen in Die Spielschleife

Übe selbstständig: Pygame-Playground