Python: So zeichnen Sie gezeichnete Elemente im Pygame am Raster
Ich experimentiere mit einem Pathfinding-Projekt und bin beim Erstellen einer funktionierenden GUI hängen geblieben. Ich verwende Pygame und habe bereits ein Raster und eine Funktion erstellt, die Würfel zeichnet, wenn Sie die Maustaste drücken (oder weiter drücken). Diese Würfel gehen jedoch einfach dorthin, wo Sie klicken, und rasten nicht am Raster ein. Ich habe darüber nachgedacht, Modulo irgendwie zu verwenden, aber ich kann es scheinbar nicht zum Laufen bringen. Den Code finden Sie unten. Die Cube-Klasse verwende ich für die auf dem Bildschirm gezeichneten Quadrate. Außerdem ist die drawgrid()Funktion, wie ich mein Gitter einrichte. Ich würde gerne Hilfe dabei bekommen, da ich jetzt seit drei Tagen auf dieser Straßensperre festsitze.
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)
Andere drawgrid()Funktion:
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))
Antworten
Sie müssen die Position an der Rastergröße ausrichten. Verwenden Sie den Bodenteilungsoperator ( //), um die Koordinaten durch die Größe einer Zelle zu teilen und den Integralindex im Raster zu berechnen:
x, y = pygame.mouse.get_pos()
ix = x // sizebtwn
iy = y // sizebtwn
Multiplizieren Sie das Ergebnis mit der Größe einer Zelle, um die Koordinate zu berechnen:
self.cx, self.cy = ix * sizebtwn, iy * sizebtwn
Minimales Beispiel:
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()