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