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.
Aufgabe
Mittel- Erstelle vor der Schleife
crate = pygame.Rect(40, 230, 60, 60)unddragging = False. - Setze bei
MOUSEBUTTONDOWNdragging = True, wenn der Klick auf der Kiste erfolgt; andernfalls (elif) prüfe wie zuvor den Edelstein. - Setze bei
MOUSEBUTTONUPdragging = False. Verschiebe beiMOUSEMOTION, während du ziehst, die Kiste umevent.rel. - 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
3Die Maus
Dem Zeiger folgenKlicke auf den EdelsteinÜbe selbstständig: Pygame-Playground