Hervorhebung beim Überfahren
Teil des Abschnitts Die Spielschleife der Pygame-Journey von Coddy. Lektion 15 von 32.
Jedes Mal gx <= x <= gx + 30 zu testen, wird aufwendig. Pygame hat eine Klasse für Rechtecke, pygame.Rect, die Position und Größe zusammenfasst und diese Tests für dich durchführt:
gem = pygame.Rect(225, 165, 30, 30)
if gem.collidepoint(event.pos):
score += 1gem.collidepoint(point) ist True, wenn sich der Punkt innerhalb des Rect befindet. Du kannst gem.x und gem.y weiterhin lesen und ändern. Ein Rect benennt auch seine eigenen Punkte: gem.midtop, gem.midright, gem.midbottom und gem.midleft sind die Mittelpunkte seiner Seiten, die die vier Ecken des Edelsteins bilden.
Mit demselben Test für die Position des Mauszeigers kannst du feststellen, ob der Spieler auf den Edelstein zeigt. Spiele zeigen das durch eine Hervorhebung an:
if gem.collidepoint(pygame.mouse.get_pos()):
pygame.draw.rect(screen, (255, 196, 0), gem.inflate(10, 10), 2)gem.inflate(10, 10) ist ein neues Rect, das 10 Pixel breiter und höher ist und denselben Mittelpunkt hat. Dadurch liegt die Umrandung 5 Pixel außerhalb des Edelsteins.
Aufgabe
Einfach- Ersetze
gx, gy = 225, 165durchgem = pygame.Rect(225, 165, 30, 30)und verwendegem.xundgem.yan den Stellen, an denen dugxundgyverwendet hast. - Zeichne den Edelstein anhand von
[gem.midtop, gem.midright, gem.midbottom, gem.midleft]und prüfe Klicks mitgem.collidepoint(event.pos). - Zeichne nach dem Edelstein, wenn sich der Zeiger darüber befindet, eine gelbe Umrandung mit
(255, 196, 0)umgem.inflate(10, 10), die2Pixel breit ist.
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()
gx, gy = 225, 165
score = 0
running = True
while running:
for event in pygame.event.get():
if event.type == pygame.QUIT:
running = False
elif event.type == pygame.MOUSEBUTTONDOWN:
x, y = event.pos
if gx <= x <= gx + 30 and gy <= y <= gy + 30:
score += 1
gx = random.randint(15, 435)
gy = random.randint(55, 315)
screen.fill((30, 30, 46))
gem_points = [(gx + 15, gy), (gx + 30, gy + 15), (gx + 15, gy + 30), (gx, gy + 15)]
pygame.draw.polygon(screen, (80, 220, 255), gem_points)
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