Python: Cara membuat elemen yang digambar pas ke grid di pygame

Sep 17 2020

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

1 Rabbid76 Sep 17 2020 at 02:26

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()