Python: Comment faire en sorte que les éléments dessinés s'alignent sur la grille dans pygame

Sep 17 2020

J'expérimente un projet Pathfinding et je suis resté bloqué lors de la création d'une interface graphique fonctionnelle. J'utilise pygame et j'ai déjà créé une grille et une fonction, qui dessine des cubes lorsque vous appuyez (ou continuez à appuyer) sur le bouton de la souris. Cependant, ces cubes vont là où vous cliquez et ne s'alignent pas sur la grille. J'ai pensé à utiliser modulo d'une manière ou d'une autre, mais je n'arrive pas à le faire fonctionner. Veuillez trouver le code ci-dessous. La classe Cube est ce que j'utilise pour les carrés dessinés à l'écran. De plus, la drawgrid()fonction est de savoir comment configurer ma grille. J'aimerais beaucoup d'aide à ce sujet, car je suis bloqué sur ce barrage routier depuis trois jours maintenant.

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)

Autre drawgrid()fonction:

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

Réponses

1 Rabbid76 Sep 17 2020 at 02:26

Vous devez aligner la position sur la taille des grilles. Utilisez l'opérateur de division de plancher ( //) pour diviser les coordonnées par la taille d'une cellule et calculer l'index intégral dans la grille:

x, y = pygame.mouse.get_pos()

ix = x // sizebtwn
iy = y // sizebtwn

Multipliez le résultat par la taille d'une cellule pour calculer la coordonnée:

self.cx, self.cy = ix * sizebtwn, iy * sizebtwn

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