Parallax#

Screen shot of a parallax example
parallax.py#
  1"""
  2Parallax Example
  3python -m arcade.examples.parallax
  4"""
  5import arcade
  6
  7SCREEN_WIDTH = 700
  8SCREEN_HEIGHT = 700
  9SCREEN_TITLE = "Parallax Example"
 10MOVEMENT_SPEED = 5
 11SPRITE_SCALING = 3
 12BACKGROUND_RISE_AMOUNT = 40
 13
 14
 15class MyGame(arcade.Window):
 16    """ Main application class. """
 17
 18    def __init__(self, width, height, title):
 19        super().__init__(width, height, title)
 20
 21        arcade.set_background_color(arcade.color.BLACK)
 22
 23        self.backgrounds = arcade.SpriteList()
 24
 25        self.player_sprite = arcade.SpriteSolidColor(20, 30, arcade.color.PURPLE)
 26        self.player_sprite.bottom = 0
 27        self.player_sprite.center_x = self.width / 2
 28        self.player_list = arcade.SpriteList()
 29        self.player_list.append(self.player_sprite)
 30
 31        # Track the current state of what key is pressed
 32        self.left_pressed = False
 33        self.right_pressed = False
 34
 35        self.camera = arcade.SimpleCamera()
 36
 37    def setup(self):
 38        """ Set up the game variables. Call to re-start the game. """
 39        # Create your sprites and sprite lists here
 40        images = (":resources:images/cybercity_background/far-buildings.png",
 41                  ":resources:images/cybercity_background/back-buildings.png",
 42                  ":resources:images/cybercity_background/foreground.png")
 43
 44        rise = BACKGROUND_RISE_AMOUNT * SPRITE_SCALING
 45
 46        for count, image in enumerate(images):
 47            bottom = rise * (len(images) - count - 1)
 48
 49            sprite = arcade.Sprite(image, scale=SPRITE_SCALING)
 50            sprite.bottom = bottom
 51            sprite.left = 0
 52            self.backgrounds.append(sprite)
 53
 54            sprite = arcade.Sprite(image, scale=SPRITE_SCALING)
 55            sprite.bottom = bottom
 56            sprite.left = sprite.width
 57            self.backgrounds.append(sprite)
 58
 59    def pan_camera_to_user(self, panning_fraction: float = 1.0):
 60        # This spot would center on the user
 61        screen_center_x = self.player_sprite.center_x - (self.camera.viewport_width / 2)
 62        screen_center_y = self.player_sprite.center_y - (
 63            self.camera.viewport_height / 2
 64        )
 65
 66        if screen_center_y < 0:
 67            screen_center_y = 0
 68        user_centered = screen_center_x, screen_center_y
 69
 70        self.camera.move_to(user_centered, panning_fraction)
 71
 72    def on_draw(self):
 73        self.clear()
 74
 75        self.camera.use()
 76
 77        # Call draw() on all your sprite lists below
 78        self.backgrounds.draw(pixelated=True)
 79        self.player_list.draw(pixelated=True)
 80
 81    def on_update(self, delta_time):
 82        """
 83        All the logic to move, and the game logic goes here.
 84        Normally, you'll call update() on the sprite lists that
 85        need it.
 86        """
 87        self.player_sprite.center_x += self.player_sprite.change_x
 88        self.player_sprite.center_y += self.player_sprite.change_y
 89        self.pan_camera_to_user(0.1)
 90
 91        camera_x = self.camera.position[0]
 92
 93        for count, sprite in enumerate(self.backgrounds):
 94            layer = count // 2
 95            frame = count % 2
 96            offset = camera_x / (2 ** (layer + 1))
 97            jump = (camera_x - offset) // sprite.width
 98            final_offset = offset + (jump + frame) * sprite.width
 99            sprite.left = final_offset
100
101    def update_player_speed(self):
102        """ Calculate speed based on the keys pressed """
103
104        self.player_sprite.change_x = 0
105        self.player_sprite.change_y = 0
106
107        if self.left_pressed and not self.right_pressed:
108            self.player_sprite.change_x = -MOVEMENT_SPEED
109        elif self.right_pressed and not self.left_pressed:
110            self.player_sprite.change_x = MOVEMENT_SPEED
111
112    def on_key_press(self, key, modifiers):
113        """Called whenever a key is pressed. """
114
115        if key == arcade.key.LEFT:
116            self.left_pressed = True
117            self.update_player_speed()
118        elif key == arcade.key.RIGHT:
119            self.right_pressed = True
120            self.update_player_speed()
121
122    def on_key_release(self, key, modifiers):
123        """Called when the user releases a key. """
124
125        if key == arcade.key.LEFT:
126            self.left_pressed = False
127            self.update_player_speed()
128        elif key == arcade.key.RIGHT:
129            self.right_pressed = False
130            self.update_player_speed()
131
132
133def main():
134    """ Main function """
135    game = MyGame(SCREEN_WIDTH, SCREEN_HEIGHT, SCREEN_TITLE)
136    game.setup()
137    arcade.run()
138
139
140if __name__ == "__main__":
141    main()