Scrolling

Scrolling#

Oft möchtest du den Bildschirm “scrollen lassen.

Die einfachste Möglichkeit dazu ist es einen Hintergrund zu “verschieben”:

Damit dies wirklich gut funktioniert, musst du den Hintergrund als “Actor anlegen” und benötigst zwei Hintergründe.

scrolling background

Beide Hintergründe wandern von rechts nach links (oder von oben nach unten, links nach rechts, … - Je nach Spiel) - Sobald ein Hintergrund das Spielfeld verlassen würde, wird er wieder ganz rechts angefügt.

Auf diese Weise entsteht der Eindruck einer “unendlich langen Landschaft”.

Im Code kann man dies wie folgt umsetzen:

  • Lege mden Hintergrund zweimal mit dem gleichen Hintergrund an und platziere diese nebeneinander.

  • Es kann sinnvoll sein die Hintergründe in einer Liste zu speichern, da du sie dann gemeinsam bewegen kannst.

back0 = Actor()
back0.add_costume(BACKGROUND)
back0.size = WIDTH, HEIGHT
back1 = Actor(WIDTH, 0)
back1.size = WIDTH, HEIGHT
back1.add_costume(BACKGROUND)
backs = [back0, back1]

In der world.act-Methode die jedes Frame einmal aufgerufen wird, kannst den Bildschirm langsam verschieben:

@world.register
def act(self):
    for back in backs:
        back.x -= 1
        if back.x <= - WIDTH:
            back.x = WIDTH

Als Code sieht dies so aus:


from miniworlds import *

WIDTH, HEIGHT = 800, 400
world = World(WIDTH, HEIGHT)
left, bottom = WIDTH/2, HEIGHT/2

BACKGROUND = "desertback"

back0 = Actor()
back0.add_costume(BACKGROUND)
back0.size = WIDTH, HEIGHT
back1 = Actor(WIDTH, 0)
back1.size = WIDTH, HEIGHT
back1.add_costume(BACKGROUND)
backs = [back0, back1]

walker = Actor((100, HEIGHT - 100))
walker.size = 100, 60
walker.add_costumes(["walk1", "walk2"])
walker.speed = 1
walker.count = 0

@world.register
def act(self):
    for back in backs:
        back.x -= 1
        if back.x <= - WIDTH:
            back.x = WIDTH
    walker.count += walker.speed
    if walker.count > 11:
        costume = walker.next_costume()
        walker.count = 0

@world.register
def on_key_down(self, keys):
    if "q" in keys:
        world.quit
        
world.run()

Notiz: Die Idee stammt von dem Blog schockwellenreiter - Jörg Kantereit hat dort dieses Snippet mit Pygame Zero programmiert.