added Funktional, Undo Doodle
This commit is contained in:
1 parent
8431a9955a
commit
c269b7f6b8
4 files changed
+342
No files matched your search
@@ -0,0 +1,89 @@
|
||||
import pygame
|
||||
|
||||
|
||||
class Game:
|
||||
def __init__(self):
|
||||
pygame.init()
|
||||
self.screen = pygame.display.set_mode((800, 600))
|
||||
pygame.display.set_caption("Undo Doodle")
|
||||
self.clock = pygame.time.Clock()
|
||||
|
||||
# Der Zustand ist eine Liste von Strichen.
|
||||
# Jeder Strich ist eine Liste von Punkten (tuples).
|
||||
initial_state = []
|
||||
|
||||
# Die Historie speichert die aufeinanderfolgenden, immutablen Zustände
|
||||
self.history = [initial_state]
|
||||
|
||||
self.drawing = False
|
||||
self.current_stroke = []
|
||||
|
||||
@property
|
||||
def current_state(self):
|
||||
"""Liefert den aktuellen Zustand (oberstes Element der Historie)."""
|
||||
return self.history[-1]
|
||||
|
||||
def run(self):
|
||||
running = True
|
||||
while running:
|
||||
running = self.handle_events()
|
||||
self.update()
|
||||
self.draw()
|
||||
self.clock.tick(60)
|
||||
pygame.quit()
|
||||
|
||||
def handle_events(self):
|
||||
for event in pygame.event.get():
|
||||
if event.type == pygame.QUIT:
|
||||
return False
|
||||
|
||||
elif event.type == pygame.KEYDOWN:
|
||||
# Mit 'u' oder Strg+Z einen Schritt zurückgehen (Undo)
|
||||
if event.key == pygame.K_u or (event.key == pygame.K_z and (pygame.key.get_mods() & pygame.KMOD_CTRL)):
|
||||
if len(self.history) > 1:
|
||||
self.history.pop()
|
||||
print("Undo ausgeführt!")
|
||||
|
||||
elif event.type == pygame.MOUSEBUTTONDOWN:
|
||||
if event.button == 1: # Linke Maustaste gedrückt
|
||||
self.drawing = True
|
||||
self.current_stroke = [event.pos]
|
||||
|
||||
elif event.type == pygame.MOUSEMOTION:
|
||||
if self.drawing:
|
||||
self.current_stroke.append(event.pos)
|
||||
|
||||
elif event.type == pygame.MOUSEBUTTONUP:
|
||||
if event.button == 1 and self.drawing:
|
||||
self.drawing = False
|
||||
if self.current_stroke:
|
||||
# IMMUTABLE ANSATZ:
|
||||
# Erstelle einen völlig neuen Zustand (neue Liste),
|
||||
# anstatt den alten Zustand direkt zu verändern.
|
||||
new_strokes = self.current_state + [self.current_stroke]
|
||||
self.history.append(new_strokes)
|
||||
self.current_stroke = []
|
||||
|
||||
return True
|
||||
|
||||
def update(self):
|
||||
pass
|
||||
|
||||
def draw(self):
|
||||
self.screen.fill((255, 255, 255)) # Hintergrund weiß füllen
|
||||
|
||||
# 1. Zeichne alle fertigen Striche aus dem aktuellen Zustand
|
||||
for stroke in self.current_state:
|
||||
if len(stroke) > 1:
|
||||
pygame.draw.lines(self.screen, (0, 0, 0), False, stroke, 3)
|
||||
|
||||
# 2. Zeichne den aktuellen Strich während des Ziehens in einer Vorschau-Farbe
|
||||
if self.drawing and len(self.current_stroke) > 1:
|
||||
pygame.draw.lines(self.screen, (120, 120, 120), False, self.current_stroke, 3)
|
||||
|
||||
pygame.display.flip()
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
game = Game()
|
||||
game.run()
|
||||
Reference in new issue
Block a user