Parallax#
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()