Python: Comment faire en sorte que les éléments dessinés s'alignent sur la grille dans pygame
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
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()