Menu
CoddyTech

Ziehe die Kiste

Teil des Abschnitts Die Spielschleife der Pygame-Journey von Coddy. Lektion 16 von 32.

Ein Ziehvorgang besteht aus drei Ereignissen. Die Maustaste wird auf der Kiste gedrückt (MOUSEBUTTONDOWN), der Zeiger bewegt sich (MOUSEMOTION, viele Male), und die Maustaste wird losgelassen (MOUSEBUTTONUP). Eine Variable merkt sich, ob dazwischen gerade gezogen wird:

elif event.type == pygame.MOUSEBUTTONDOWN:
    if crate.collidepoint(event.pos):
        dragging = True
elif event.type == pygame.MOUSEBUTTONUP:
    dragging = False
elif event.type == pygame.MOUSEMOTION and dragging:
    crate.move_ip(event.rel)

Bei einem MOUSEMOTION-Ereignis gibt event.rel an, wie weit sich der Zeiger seit dem letzten Ereignis bewegt hat, als (x, y). crate.move_ip(event.rel) verschiebt die Kiste um denselben Betrag, sodass die Stelle, an der du sie angefasst hast, unter dem Zeiger bleibt.

Die Kiste wird nach dem Edelstein gezeichnet, sodass sie ihn verdecken kann. Ein Klick auf die Kiste darf dann nicht den Edelstein darunter einsammeln: Prüfe zuerst die Kiste und den Edelstein mit elif, damit nur eines von beiden den Klick erhält.

challenge icon

Aufgabe

Mittel
  1. Erstelle vor der Schleife crate = pygame.Rect(40, 230, 60, 60) und dragging = False.
  2. Setze bei MOUSEBUTTONDOWN dragging = True, wenn der Klick auf der Kiste erfolgt; andernfalls (elif) prüfe wie zuvor den Edelstein.
  3. Setze bei MOUSEBUTTONUP dragging = False. Verschiebe bei MOUSEMOTION, während du ziehst, die Kiste um event.rel.
  4. Zeichne nach der Kontur des Edelsteins die Kiste in Braun (150, 100, 50) mit einem (110, 70, 35) breiten Rand von 3 Pixeln.

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)
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 gem.collidepoint(event.pos):
                score += 1
                gem.x = random.randint(15, 435)
                gem.y = random.randint(55, 315)

    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)
    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