Seret Peti
Termasuk bagian Perulangan Game dalam perjalanan Pygame di Coddy. Pelajaran 16 dari 32.
Proses drag menggunakan tiga event. Tombol ditekan pada peti (MOUSEBUTTONDOWN), pointer bergerak (MOUSEMOTION, berkali-kali), lalu tombol dilepas (MOUSEBUTTONUP). Sebuah variabel mengingat apakah proses drag sedang berlangsung di antaranya:
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)Nilai event.rel pada event MOUSEMOTION menunjukkan seberapa jauh pointer bergerak sejak event sebelumnya, dalam bentuk (x, y). crate.move_ip(event.rel) menggerakkan peti dengan jarak yang sama, sehingga titik yang kamu pegang tetap berada di bawah pointer.
Peti digambar setelah permata, sehingga peti dapat menutupinya. Jadi, menekan peti tidak boleh mengumpulkan permata di bawahnya: periksa peti terlebih dahulu, lalu permata dengan elif, agar hanya salah satunya yang menerima tekanan.
Tantangan
Sedang- Sebelum perulangan, buat
crate = pygame.Rect(40, 230, 60, 60)dandragging = False. - Saat
MOUSEBUTTONDOWN, aturdragging = Trueketika penekanan terjadi pada peti, jika tidak (elif) uji gem seperti sebelumnya. - Atur
dragging = FalsesaatMOUSEBUTTONUP. SaatMOUSEMOTIONketika sedang menyeret, pindahkan peti sebesarevent.rel. - Setelah garis tepi gem, gambar peti dengan warna cokelat
(150, 100, 50), dengan tepi(110, 70, 35)selebar 3 piksel.
Coba sendiri
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()
Semua pelajaran di Perulangan Game
1Gerakkan Persegi
Buka JendelaIsi Latar Belakang4Bergerak Berdasarkan Waktu
Delta WaktuPiksel per DetikVector2Percepatan dan GesekanBerputar Kembali di LayarLatihan sendiri: Playground Pygame