Przeciągnij skrzynię
Część sekcji Pętla gry ścieżki Pygame w Coddy. Lekcja 16 z 32.
Przeciąganie obejmuje trzy zdarzenia. Przycisk zostaje wciśnięty na skrzyni (MOUSEBUTTONDOWN), wskaźnik się przesuwa (MOUSEMOTION, wiele razy), a przycisk zostaje zwolniony (MOUSEBUTTONUP). Zmienna zapamiętuje, czy w międzyczasie trwa przeciąganie:
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)Wartość event.rel w zdarzeniu MOUSEMOTION określa, o ile przesunął się wskaźnik od poprzedniego zdarzenia, w postaci (x, y). crate.move_ip(event.rel) przesuwa skrzynię o tę samą odległość, więc miejsce, za które ją złapano, pozostaje pod wskaźnikiem.
Skrzynia jest rysowana po klejnocie, więc może go zasłonić. Kliknięcie skrzyni nie może wtedy zebrać klejnotu znajdującego się pod nią: najpierw sprawdź skrzynię, a klejnot z użyciem elif, aby tylko jeden z nich zareagował na kliknięcie.
Wyzwanie
Średni- Przed pętlą utwórz
crate = pygame.Rect(40, 230, 60, 60)idragging = False. - Po
MOUSEBUTTONDOWNustawdragging = True, gdy kliknięcie nastąpi na skrzyni; w przeciwnym razie (elif) sprawdź klejnot tak jak wcześniej. - Ustaw
dragging = FalsepoMOUSEBUTTONUP. Podczas przeciągania, przyMOUSEMOTION, przesuwaj skrzynię oevent.rel. - Po narysowaniu obrysu klejnotu narysuj skrzynię na brązowo
(150, 100, 50), z krawędzią w kolorze(110, 70, 35)o szerokości 3 pikseli.
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)
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()
Wszystkie lekcje w sekcji Pętla gry
3Mysz
Podążaj za wskaźnikiemKliknij klejnotPoćwicz samodzielnie: Edytor online Pygame