Menu
CoddyTech

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.

challenge icon

Tantangan

Sedang
  1. Sebelum perulangan, buat crate = pygame.Rect(40, 230, 60, 60) dan dragging = False.
  2. Saat MOUSEBUTTONDOWN, atur dragging = True ketika penekanan terjadi pada peti, jika tidak (elif) uji gem seperti sebelumnya.
  3. Atur dragging = False saat MOUSEBUTTONUP. Saat MOUSEMOTION ketika sedang menyeret, pindahkan peti sebesar event.rel.
  4. 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

Latihan sendiri: Playground Pygame