Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- # Sonnenuntergang in Anlehnung an "Carla's Island", [Mu: Pygame Zero]
- # eine bahnbrechende Computeranimation von Nelson Max (1981),
- # siehe z.B. https://archive.org/details/CarlasIsland
- # Copyright 2021--2023 Roland Richter
- from pgzhelper import *
- # Fenstergröße 800 x 500
- TITLE = "Grafik bis zum Abendrot"
- WIDTH = 800
- HEIGHT = 500
- # Bilder stammen von https://kenney.nl/assets/planets
- planet = Actor("kenney_planets/planets/planet08.png")
- planet.pos = (WIDTH-40, 0)
- # Setze die Größe des Actors auf 10 % der Originalgröße
- planet.scale = 0.1
- frame_count = 0
- total_time = 0.0
- delta_times = []
- light_sky_blue = (135, 206, 235)
- warm_black = (0, 66, 66)
- def lerp_color(beg_clr, end_clr, factor):
- return (round((1.-factor) * beg_clr[0] + factor * end_clr[0]),
- round((1.-factor) * beg_clr[1] + factor * end_clr[1]),
- round((1.-factor) * beg_clr[2] + factor * end_clr[2]))
- def draw():
- # Zähle die Anzahl der gezeichneten frames mit
- global total_time, frame_count
- frame_count += 1
- # Setze den Hintergrund auf eine "interpolierte Farbe"
- if frame_count < 200:
- factor = 0.0
- elif frame_count < 400:
- factor = ((frame_count-200) / 200.)
- else:
- factor = 1.0
- bg_color = lerp_color(light_sky_blue, warm_black, factor)
- screen.fill(bg_color)
- # Zeichne eine Insel in "La Salle Green"
- screen.draw.filled_circle((0.5*WIDTH, HEIGHT), 0.3*HEIGHT, "#087830")
- # Male das Meer quer über den unteren Teil des Fensters in "Dark cerulean"
- screen.draw.filled_rect(Rect((0, 0.8*HEIGHT), (WIDTH, HEIGHT)), "#08457E")
- # Male eine weiße Wolke ...
- screen.draw.filled_circle((0.75*WIDTH, 0.30*HEIGHT), 42, "white")
- screen.draw.filled_circle((0.72*WIDTH, 0.31*HEIGHT), 42, "white")
- screen.draw.filled_circle((0.77*WIDTH, 0.28*HEIGHT), 42, "white")
- screen.draw.filled_circle((0.79*WIDTH, 0.32*HEIGHT), 42, "white")
- # Male einen Leuchtturm ...
- screen.draw.filled_rect(Rect((0.4*WIDTH, 0.6*HEIGHT), (20, 80)), "#F0EAD6")
- # ... mit einem Blinklicht, dessen Farbe zwischen rot und schwarz hin-
- # und herspringt.
- if frame_count % 120 < 20:
- screen.draw.filled_circle((0.4*WIDTH+10, 0.6*HEIGHT), 10, "red")
- else:
- screen.draw.filled_circle((0.4*WIDTH+10, 0.6*HEIGHT), 10, "black")
- # Schreibe Informationen in die linke obere Ecke
- avg_delta = sum(delta_times) / len(delta_times)
- frame_rate = 1.0 / avg_delta
- info = "frame " + str(frame_count) + " (" + "{:.2f}".format(frame_rate) + " fps)"
- screen.draw.text(info, (10, 10), color="white", fontsize=24)
- # Zeichne den Planeten
- planet.draw()
- # Hoppla! Der Planet sollte doch hinter dem Meer und der Wolke verschwinden.
- # PROBIERE, den Planeten so zu zeichnen, dass er hinter dem Meer und hinter
- # der Wolke verschwindet.
- def update(delta_time):
- # delta_time ist die Zeit in Sekunden, die seit dem letzten Aufruf vergangen sind:
- # https://pygame-zero.readthedocs.io/en/stable/hooks.html?highlight=update()#update
- global total_time, delta_times
- total_time += delta_time
- delta_times.append(delta_time)
- if len(delta_times) > 10:
- delta_times.pop(0)
- # Bewege den Planeten nach links unten
- planet.x -= 2
- planet.y += 1
- # ----------------------------------------------------------------------
- # This program is free software: you can redistribute it and/or modify
- # it under the terms of the GNU General Public License as published by
- # the Free Software Foundation, either version 3 of the License, or
- # (at your option) any later version.
- #
- # This program is distributed in the hope that it will be useful,
- # but WITHOUT ANY WARRANTY; without even the implied warranty of
- # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- # GNU General Public License for more details.
- #
- # You should have received a copy of the GNU General Public License
- # along with this program. If not, see <https://www.gnu.org/licenses/>.
Add Comment
Please, Sign In to add comment