Menu
CoddyTech

Die Kiste verdeckt den Edelstein

Teil des Abschnitts Die Spielschleife der Pygame-Journey von Coddy. Lektion 18 von 35.

Die Kiste wird vor dem Edelstein gezeichnet, sodass der Edelstein darüber erscheint. Damit sich der Edelstein unter einer Kiste verstecken kann, zeichne die Kiste nach dem Edelstein: Was zuletzt gezeichnet wird, verdeckt, was bereits da ist.

Ein Klick auf die Kiste darf dann nicht den Test des Edelsteins erreichen und einen Edelstein aufnehmen, den der Spieler nicht sehen kann. Beide if-Tests werden ausgeführt. Mit elif wird der zweite nur ausgeführt, wenn der erste falsch war, sodass nur einer von ihnen den Klick verarbeitet:

if crate.collidepoint(event.pos):
    dragging = True
elif gem.collidepoint(event.pos):
    print("Got it!")

Teste zuerst, was oben gezeichnet wird. Ein Klick auf die Kiste erreicht dann nie den Edelstein dahinter.

Ein dunklerer Rand lässt eine Box solide wirken. Zeichne dasselbe Rect mit einer dunkleren Farbe und einer Breite erneut; dabei wird über der Füllung nur der Umriss gezeichnet.

challenge icon

Aufgabe

Einfach

Lass die Kiste den Edelstein verdecken, und verhindere, dass ein Klick darauf den Edelstein einsammelt.

  1. Verschiebe die Zeichenanweisung für die Kiste hinter die Umrisslinie des Edelsteins und zeichne darunter crate erneut in (110, 70, 35) mit der Breite 3 als Kistenkante.
  2. Ändere im Zweig MOUSEBUTTONDOWN das if für den Edelstein in elif, unterhalb der Prüfung für die Kiste.

Drücke auf „Spielen“, ziehe die Kiste auf den Edelstein und klicke darauf: Der Edelstein bleibt verdeckt und es erscheint keine rosa Markierung. Drücke dann auf „Prüfen“.

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
            if 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))
    pygame.draw.rect(screen, (150, 100, 50), crate)
    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)
    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()

Alle Lektionen in Die Spielschleife

Übe selbstständig: Pygame-Playground