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.
Aufgabe
EinfachLass die Kiste den Edelstein verdecken, und verhindere, dass ein Klick darauf den Edelstein einsammelt.
- Verschiebe die Zeichenanweisung für die Kiste hinter die Umrisslinie des Edelsteins und zeichne darunter
crateerneut in(110, 70, 35)mit der Breite3als Kistenkante. - Ändere im Zweig
MOUSEBUTTONDOWNdasiffür den Edelstein inelif, 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
3Die Maus
Dem Zeiger folgenDen Edelstein anklickenÜbe selbstständig: Pygame-Playground