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.
Wyzwanie
ŁatwyNiech skrzynia zasłania klejnot, a jej obrys nie pozwala na kliknięcie klejnotu.
- Przenieś linię rysującą skrzynię za obrys klejnotu, a pod nią narysuj ponownie
cratew kolorze(110, 70, 35)i o szerokości3, jako jej krawędź. - W gałęzi
MOUSEBUTTONDOWNzmieńifklejnotu naelif, 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