Advertisement
rric

schwebende_ufo_sterne

Dec 15th, 2023 (edited)
30
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 5.79 KB | None | 0 0
  1. # Eine Menge an Bäumen ziehen vorbei ...
  2. # Copyright 2023 Roland Richter                        [Mu: Pygame Zero]
  3.  
  4. import random
  5.  
  6. # Erzeuge ein rechteckiges 800×500 Fenster
  7. TITLE = "Schwebende UFO-Sterne"
  8. WIDTH = 800
  9. HEIGHT = 500
  10. frame_count = 0
  11.  
  12. horizon_y = 400
  13.  
  14. ufo = Actor("kenney_alien-ufo-pack/png/shippink_manned.png", (WIDTH//2, 140))
  15. dome = Actor("kenney_alien-ufo-pack/png/dome.png", (WIDTH//2, 140 - 30))
  16. star = None
  17. ufo_speed = 1
  18. ufo_lift = 0
  19. star_descent = 0
  20.  
  21. # Erzeuge 125 Bäume:
  22. # - horizontal alle 80 Pixel
  23. # - vertikal zwischen 350 und 450
  24. # Der Anchor-Punkt ist oben in der Mitte, wo der Stern befestigt werden soll.
  25. wood = []
  26. for num in range(125):
  27.     tree = Actor(
  28.         "kenney_platformer-art-winter/tiles/pinesapling.png",
  29.         anchor=("center", "top"),
  30.         midtop=(80 * num + WIDTH//2, random.randint(350, 450)),
  31.     )
  32.     wood.append(tree)
  33.  
  34. # Es gibt zwei Listen von Sternen:
  35. # - die Sterne, die an einem Baum befestigt wurden
  36. # - die Sterne, die hinunter gefallen und am Boden verstreut sind
  37. attached = []
  38. scattered = []
  39.  
  40. game_finished = False
  41.  
  42. # Holiday / Seasonal 4 by Diego Nava from https://mixkit.co/free-stock-music/tag/christmas/
  43. music.play("mixkit-holiday-seasonal-4-511.mp3")
  44. music.set_volume(0.4)
  45.  
  46. def draw():
  47.     screen.fill("skyblue2")
  48.  
  49.     # Male Schnee in den unteren Teil des Fensters
  50.     screen.draw.filled_rect(Rect((0, horizon_y), (WIDTH, HEIGHT - horizon_y)), "snow")
  51.  
  52.     # Male die Sonne
  53.     screen.draw.filled_circle((150, 70), 45, "yellow")
  54.  
  55.     # Male zuerst die am Boden verstreuten Sterne, ...
  56.     for scad in scattered:
  57.         scad.draw()
  58.  
  59.     # ... dann die Bäume, und dann erst ...
  60.     for tree in wood:
  61.         tree.draw()
  62.  
  63.     # ... die an Bäumen befestigten Sterne.
  64.     for attd in attached:
  65.         attd.draw()
  66.  
  67.     if star_descent:
  68.         star.draw()
  69.  
  70.     # Zeichne das UFO mit der Hülle
  71.     ufo.draw()
  72.     dome.draw()
  73.  
  74.     # PROBIERE Zeige in einer Ecke des Fensters an,
  75.     # - wie viele Sterne an einer Baumspitze befestigt sind;
  76.     # - wie viele Sterne das UFO insgesamt abgeworfen hat.
  77.     # TIPP vewende die Länge der Listen 'attached' und 'scattered'
  78.  
  79.     global frame_count
  80.     frame_count += 1
  81.  
  82.  
  83. def update():
  84.     global game_finished, wood, horizon_y, ufo_speed, ufo_lift, star, star_descent
  85.  
  86.     # Lass das Ufo wackeln; erzeuge dazu einen zufälligen Winkel
  87.     winkel = random.randint(-8, 8)
  88.     ufo.angle = winkel
  89.  
  90.     # Die Hülle des UFOs muss ebenfalls mitbewegt werden
  91.     dome.x = ufo.x
  92.     dome.y = ufo.y - 30
  93.     dome.angle = ufo.angle
  94.  
  95.     if ufo_speed != 0:
  96.         for tree in wood:
  97.             tree.x -= ufo_speed
  98.         for scad in scattered:
  99.             scad.x -= ufo_speed
  100.         for attd in attached:
  101.             attd.x -= ufo_speed
  102.  
  103.     if ufo_lift != 0:
  104.         horizon_y += ufo_lift
  105.         for tree in wood:
  106.             tree.y += ufo_lift
  107.         for scad in scattered:
  108.             scad.y += ufo_lift
  109.         for attd in attached:
  110.             attd.y += ufo_lift
  111.         ufo_lift = 0
  112.  
  113.     if not star is None:
  114.         star.y += star_descent
  115.         star_descent += 0.2
  116.  
  117.         # Falls der Stern zu tief nach unten gefallen ist, ...
  118.         if star.y >= horizon_y+90:
  119.             # ... bleibt er verstreut am Boden liegen;
  120.             star.angle = random.randint(45, 135)
  121.             scattered.append(star)
  122.             star = None
  123.             star_descent = 0
  124.             sounds.impactglass_light_003.play()
  125.         # falls der Stern noch hinunter fällt, ...
  126.         else:
  127.             # ... wird für jede Baumspitze die Distanz berechnet;
  128.             for tree in wood:
  129.                 # falls der Stern ganz nahe zu einer Baumspitze ist, ...
  130.                 if tree.distance_to(star) <= 9.0:
  131.                     # ... wird er jetzt an diesem Baum befestigt.
  132.                     star.center = tree.midtop
  133.                     attached.append(star)
  134.                     star = None
  135.                     star_descent = 0
  136.                     sounds.impactbell_heavy_000.play()
  137.                     break
  138.  
  139.     # Wenn der letzte Baum erreicht wird, ist das Spiel zu Ende!
  140.     if wood[-1].x <= WIDTH//2:
  141.         game_finished = True
  142.         ufo_speed = -3
  143.  
  144.  
  145. # Verändere Geschwindigkeit und Auftrieb mit ⭠, ⭢ und ⭡; siehe auch
  146. # https://pygame-zero.readthedocs.io/en/stable/hooks.html#buttons-and-keys
  147. def on_key_down(key):
  148.     global game_finished, wood, horizon_y, ufo_speed, ufo_lift, star, star_descent
  149.  
  150.     if game_finished:
  151.         return
  152.  
  153.     if key == keys.LEFT:  # ⭠: flieg nach links
  154.         if ufo_speed > 1:
  155.             ufo_speed -= 1
  156.     if key == keys.RIGHT:  # ⭢: flieg nach rechts
  157.         if ufo_speed <= 8:
  158.             ufo_speed += 1
  159.  
  160.     if key == keys.UP:  # ⭡: schwebe nach oben
  161.         if horizon_y <= 420:
  162.             ufo_lift = +3
  163.     if key == keys.DOWN:  # : schwebe nach unten
  164.         if horizon_y >= 360:
  165.             ufo_lift = -3
  166.  
  167.     if star is None and key == keys.SPACE:
  168.         star = Actor("kenney_platformer-pack-redux/png/items/star.png", (WIDTH//2, 140))
  169.         star_descent = 0.5
  170.  
  171.  
  172. # ----------------------------------------------------------------------
  173. # This program is free software: you can redistribute it and/or modify
  174. # it under the terms of the GNU General Public License as published by
  175. # the Free Software Foundation, either version 3 of the License, or
  176. # (at your option) any later version.
  177. #
  178. # This program is distributed in the hope that it will be useful,
  179. # but WITHOUT ANY WARRANTY; without even the implied warranty of
  180. # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  181. # GNU General Public License for more details.
  182. #
  183. # You should have received a copy of the GNU General Public License
  184. # along with this program.  If not, see <https://www.gnu.org/licenses/>.
  185.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement