Menu
CoddyTech

Skrzynia zasłania klejnot

Część sekcji Pętla gry ścieżki Pygame w Coddy. Lekcja 18 z 35.

Skrzynię rysuje się przed klejnotem, więc klejnot wyświetla się na wierzchu. Aby klejnot mógł schować się pod skrzynią, narysuj skrzynię po klejnocie: to, co zostanie narysowane na końcu, zakrywa to, co już jest.

Naciśnięcie skrzyni nie może wtedy dotrzeć do testu klejnotu i złapać klejnotu, którego gracz nie widzi. Oba testy if są wykonywane. W przypadku elif drugi test jest wykonywany tylko wtedy, gdy pierwszy był fałszywy, więc tylko jeden z nich obsługuje naciśnięcie:

if crate.collidepoint(event.pos):
    dragging = True
elif gem.collidepoint(event.pos):
    print("Got it!")

Najpierw sprawdź, co jest narysowane na wierzchu. Naciśnięcie skrzyni nigdy nie dotrze wtedy do klejnotu znajdującego się za nią.

Ciemniejsza krawędź sprawia, że prostokąt wygląda na pełny. Narysuj ponownie ten sam Rect w ciemniejszym kolorze i z określoną szerokością, a zostanie narysowany tylko jego obrys, na wypełnieniu.

challenge icon

Wyzwanie

Łatwy

Niech skrzynia zasłania klejnot, a jej obrys nie pozwala na kliknięcie klejnotu.

  1. Przenieś linię rysującą skrzynię za obrys klejnotu, a pod nią narysuj ponownie crate w kolorze (110, 70, 35) i o szerokości 3, jako jej krawędź.
  2. W gałęzi MOUSEBUTTONDOWN zmień if klejnotu na elif, poniżej warunku sprawdzającego skrzynię.

Naciśnij „Graj”, przeciągnij skrzynię na klejnot i kliknij go: klejnot pozostaje ukryty i nie pojawia się różowy znacznik. Następnie naciśnij „Sprawdź”.

Spróbuj swoich sił

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

Wszystkie lekcje w sekcji Pętla gry

Poćwicz samodzielnie: Edytor online Pygame