Menu
CoddyTech

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 += 1

gem.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.

challenge icon

Aufgabe

Einfach
  1. Ersetze gx, gy = 225, 165 durch gem = pygame.Rect(225, 165, 30, 30) und verwende gem.x und gem.y an den Stellen, an denen du gx und gy verwendet hast.
  2. Zeichne den Edelstein anhand von [gem.midtop, gem.midright, gem.midbottom, gem.midleft] und prüfe Klicks mit gem.collidepoint(event.pos).
  3. Zeichne nach dem Edelstein, wenn sich der Zeiger darüber befindet, eine gelbe Umrandung mit (255, 196, 0) um gem.inflate(10, 10), die 2 Pixel 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

Übe selbstständig: Pygame-Playground