Python: Cara membuat elemen yang digambar pas ke grid di pygame
Saya sedang bereksperimen dengan proyek Pathfinding dan terjebak saat membuat GUI yang berfungsi. Saya menggunakan pygame dan sudah membuat kisi dan fitur, yang menggambar kubus saat Anda menekan (atau terus menekan) tombol mouse. Namun, kubus ini hanya pergi kemanapun Anda klik, dan tidak masuk ke grid. Saya berpikir untuk menggunakan modulo entah bagaimana tetapi sepertinya saya tidak bisa membuatnya berfungsi. Silakan temukan kode yang terlampir di bawah ini. Kelas Cube adalah apa yang saya gunakan untuk kotak yang digambar di layar. Selain itu, drawgrid()fungsinya adalah bagaimana saya mengatur grid saya. Saya membutuhkan bantuan dalam hal ini, karena saya telah terjebak di penghalang jalan ini selama tiga hari sekarang.
class Cube:
def update(self):
self.cx, self.cy = pygame.mouse.get_pos()
self.square = pygame.Rect(self.cx, self.cy, 20, 20)
def draw(self):
click = pygame.mouse.get_pressed()
if click[0]: # evaluate left button
pygame.draw.rect(screen, (255, 255, 255), self.square)
drawgrid()Fungsi lainnya :
def drawgrid(w, rows, surface):
sizebtwn = w // rows # Distance between Lines
x = 0
y = 0
for i in range(rows):
x = x + sizebtwn
y = y + sizebtwn
pygame.draw.line(surface, (255, 255, 255), (x, 0), (x, w))
pygame.draw.line(surface, (255, 255, 255), (0, y), (w, y))
Jawaban
Anda harus menyelaraskan posisi dengan ukuran grid. Gunakan operator pembagian lantai ( //) untuk membagi koordinat dengan ukuran sel dan menghitung indeks integral dalam kisi:
x, y = pygame.mouse.get_pos()
ix = x // sizebtwn
iy = y // sizebtwn
Kalikan hasilnya dengan ukuran sel untuk menghitung koordinat:
self.cx, self.cy = ix * sizebtwn, iy * sizebtwn
Contoh minimal:
import pygame
pygame.init()
screen = pygame.display.set_mode((200, 200))
clock = pygame.time.Clock()
def drawgrid(w, rows, surface):
sizebtwn = w // rows
for i in range(0, w, sizebtwn):
x, y = i, i
pygame.draw.line(surface, (255, 255, 255), (x, 0), (x, w))
pygame.draw.line(surface, (255, 255, 255), (0, y), (w, y))
class Cube:
def update(self, sizebtwn):
x, y = pygame.mouse.get_pos()
ix = x // sizebtwn
iy = y // sizebtwn
self.cx, self.cy = ix * sizebtwn, iy * sizebtwn
self.square = pygame.Rect(self.cx, self.cy, sizebtwn, sizebtwn)
def draw(self, surface):
click = pygame.mouse.get_pressed()
if click[0]:
pygame.draw.rect(surface, (255, 255, 255), self.square)
cube = Cube()
run = True
while run:
clock.tick(60)
for event in pygame.event.get():
if event.type == pygame.QUIT:
run = False
cube.update(screen.get_width() // 10)
screen.fill(0)
drawgrid(screen.get_width(), 10, screen)
cube.draw(screen)
pygame.display.flip()