Parallax#

parallax.py#
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()
|