https://www.youtube.com/watch?v=pNe6fsaCVtI
gepostet von k-net,
habe ich mal einen Schritt für Schritt Nachbau erstellt.
(Es wird immer nur der Unterschied zum vorherigen Schritt angezeigt)
SCHRITT 1
Zunächst fängt man mit einem Basis pygame an:
Code: Alles auswählen
import sys
import pygame
WIDTH = 800
HEIGHT = 800
def main():
screen = init()
game_loop(screen)
def init():
"""Initialisierung von pygame und Anlegen des screen buffers"""
pygame.init()
screen = pygame.display.set_mode((WIDTH, HEIGHT))
return screen
def game_loop(screen):
"""Die game loop in der der zeitliche Ablauf kontrolliert wird"""
while True:
process_events()
pygame.display.update()
pygame.time.Clock().tick(60)
def process_events():
"""Verarbeitung von Ereignissen"""
for event in pygame.event.get():
if event.type == pygame.QUIT:
sys.exit()
if __name__ == "__main__":
main()
Als nächstes wird das Konzept der Zeit hinzugefügt:
Code: Alles auswählen
def game_loop(screen):
"""Die game loop in der der zeitliche Ablauf kontrolliert wird"""
t = 0 # Die Zeit beginnt
while True:
process_events()
pygame.display.update()
pygame.time.Clock().tick(60)
# t wird 60 mal pro Sekunde um 0.02 erhöht
# erhöht/veringert man dies Zahl, läuft die Zeit schneller/langsamer
t += 0.02
Das Zeichnen findet in einer eigenen Funktion statt:
Code: Alles auswählen
BLACK = (0, 0, 0)
def game_loop(screen):
"""Die game loop in der der zeitliche Ablauf kontrolliert wird"""
t = 0 # Die Zeit beginnt
while True:
process_events()
draw(screen, t)
pygame.display.update()
pygame.time.Clock().tick(60)
# t wird 60 mal pro Sekunde um 0.02 erhöht
# erhöht/veringert man dies Zahl, läuft die Zeit schneller/langsamer
t += 0.02
def draw(screen, t):
"""Alles was gezeichnet werden soll, wird von hier gesteuert"""
screen.fill(BLACK)
Um einen roten Kreis in den Hintergrund zubekommen geht es so weiter:
Code: Alles auswählen
CENTERX = WIDTH // 2
CENTERY = WIDTH // 2
OUTERRADIUS = min(WIDTH, HEIGHT) * 0.45
BLACK = (0, 0, 0)
RED = (255, 0, 0)
def draw(screen, t):
"""Alles was gezeichnet werden soll, wird von hier gesteuert"""
screen.fill(BLACK)
draw_background_circle(screen)
def draw_background_circle(screen):
"""Roter Kreis als Hintergrund"""
pygame.draw.circle(screen, RED, (CENTERX, CENTERY), OUTERRADIUS)
Jetzt kommt erstmal nur eine Linie dazu:
Code: Alles auswählen
import math
def draw(screen, t):
"""Alles was gezeichnet werden soll, wird von hier gesteuert"""
screen.fill(BLACK)
draw_background_circle(screen)
draw_angled_line(screen, 0)
def draw_angled_line(screen, angle):
"""Zeichnet eine Linie durch den Fenstermittelpunkt unter einem bestimmten Winkel"""
pygame.draw.line(
screen,
BLACK,
(
CENTERX - math.cos(angle) * OUTERRADIUS,
CENTERY - math.sin(angle) * OUTERRADIUS,
),
(
CENTERX + math.cos(angle) * OUTERRADIUS,
CENTERY + math.sin(angle) * OUTERRADIUS,
),
2,
)
Mehrere Linien, alle um den gleichen Winkel zueinander verdreht:
Code: Alles auswählen
COUNT = 8
def draw(screen, t):
"""Alles was gezeichnet werden soll, wird von hier gesteuert"""
screen.fill(BLACK)
draw_background_circle(screen)
draw_lines(screen)
def draw_lines(screen):
"""Zeichnet mehrere Linien mit gleichem Verdrehungwinkel zueinander"""
for index in range(COUNT):
draw_angled_line(screen, math.pi / COUNT * index)
Ein einzelner Kreis:
Code: Alles auswählen
RADIUS = 20
WHITE = (255, 255, 255)
def draw(screen, t):
"""Alles was gezeichnet werden soll, wird von hier gesteuert"""
screen.fill(BLACK)
draw_background_circle(screen)
draw_lines(screen)
draw_circle(screen, 0, t)
def draw_circle(screen, angle, t):
"""Zeichnet einen weißen kleinen Kreis in einem bestimmten Winkel"""
pygame.draw.circle(
screen,
WHITE,
(
CENTERX + math.cos(angle) * (OUTERRADIUS - RADIUS), # um RADIUS nach innen versetzt
CENTERY + math.sin(angle) * (OUTERRADIUS - RADIUS),
),
RADIUS,
)
Jetzt kommt die Animation über die Zeit:
Code: Alles auswählen
def draw_circle(screen, angle, t):
"""Zeichnet einen weißen kleinen Kreis in einem bestimmten Winkel"""
pygame.draw.circle(
screen,
WHITE,
(
CENTERX + math.sin(t) * math.cos(angle) * (OUTERRADIUS - RADIUS), # um RADIUS nach innen versetzt
CENTERY + math.sin(t) * math.sin(angle) * (OUTERRADIUS - RADIUS),
),
RADIUS,
)
Die Möglichkeit zur Phasenverschiebung wird geschaffen:
Code: Alles auswählen
def draw(screen, t):
"""Alles was gezeichnet werden soll, wird von hier gesteuert"""
screen.fill(BLACK)
draw_background_circle(screen)
draw_lines(screen)
draw_circle(screen, 0, t)
def draw_circle(screen, angle, t, shift):
"""Zeichnet einen weißen kleinen Kreis in einem bestimmten Winkel"""
pygame.draw.circle(
screen,
WHITE,
(
CENTERX + math.sin(t + shift) * math.cos(angle) * (OUTERRADIUS - RADIUS),
CENTERY + math.sin(t + shift) * math.sin(angle) * (OUTERRADIUS - RADIUS),
),
RADIUS,
)
Und schließlich sollen mehrere Kreise gezeichnet werden:
Code: Alles auswählen
def draw(screen, t):
"""Alles was gezeichnet werden soll, wird von hier gesteuert"""
screen.fill(BLACK)
draw_background_circle(screen)
draw_lines(screen)
draw_circles(screen, t)
def draw_circles(screen, t):
for index in range(COUNT):
draw_circle(screen, math.pi / COUNT * index, t, math.pi / COUNT * index)
Alles zusammen:
Code: Alles auswählen
import sys
import math
import pygame
WIDTH = 800
HEIGHT = 800
CENTERX = WIDTH // 2
CENTERY = WIDTH // 2
OUTERRADIUS = min(WIDTH, HEIGHT) * 0.45
RADIUS = 20
COUNT = 8
BLACK = (0, 0, 0)
WHITE = (255, 255, 255)
RED = (255, 0, 0)
def main():
screen = init()
game_loop(screen)
def init():
"""Initialisierung von pygame und Anlegen des screen buffers"""
pygame.init()
screen = pygame.display.set_mode((WIDTH, HEIGHT))
return screen
def game_loop(screen):
"""Die game loop in der der zeitliche Ablauf kontrolliert wird"""
t = 0 # Die Zeit beginnt
while True:
process_events()
draw(screen, t)
pygame.display.update()
pygame.time.Clock().tick(60)
# t wird 60 mal pro Sekunde um 0.02 erhöht
# erhöht/veringert man dies Zahl, läuft die Zeit schneller/langsamer
t += 0.02
def process_events():
"""Verarbeitung von Ereignissen"""
for event in pygame.event.get():
if event.type == pygame.QUIT:
sys.exit()
def draw(screen, t):
"""Alles was gezeichnet werden soll, wird von hier gesteuert"""
screen.fill(BLACK)
draw_background_circle(screen)
draw_lines(screen)
draw_circles(screen, t)
def draw_background_circle(screen):
"""Roter Kreis als Hintergrund"""
pygame.draw.circle(screen, RED, (CENTERX, CENTERY), OUTERRADIUS)
def draw_circles(screen, t):
for index in range(COUNT):
draw_circle(screen, math.pi / COUNT * index, t, math.pi / COUNT * index)
def draw_circle(screen, angle, t, shift):
"""Zeichnet einen weißen kleinen Kreis in einem bestimmten Winkel"""
pygame.draw.circle(
screen,
WHITE,
(
CENTERX + math.sin(t + shift) * math.cos(angle) * (OUTERRADIUS - RADIUS),
CENTERY + math.sin(t + shift) * math.sin(angle) * (OUTERRADIUS - RADIUS),
),
RADIUS,
)
def draw_lines(screen):
"""Zeichnet mehrere Linien mit gleichem Verdrehungwinkel zueinander"""
for index in range(COUNT):
draw_angled_line(screen, math.pi / COUNT * index)
def draw_angled_line(screen, angle):
"""Zeichnet eine Linie durch den Fenstermittelpunkt unter einem bestimmten Winkel"""
pygame.draw.line(
screen,
BLACK,
(
CENTERX - math.cos(angle) * OUTERRADIUS,
CENTERY - math.sin(angle) * OUTERRADIUS,
),
(
CENTERX + math.cos(angle) * OUTERRADIUS,
CENTERY + math.sin(angle) * OUTERRADIUS,
),
2,
)
if __name__ == "__main__":
main()
Weitere Schritte:
Variieren der Anzahl der Kreise, Animationsgeschwindigkeit, Hintergrundlinien ein/ausschalten, ...