Ray-Casting Starting File#

../../_images/start4.png
start.py#
  1import random
  2import arcade
  3
  4# Do the math to figure out our screen dimensions
  5SCREEN_WIDTH = 800
  6SCREEN_HEIGHT = 600
  7SCREEN_TITLE = "Ray-casting Demo"
  8
  9SPRITE_SCALING = 0.25
 10
 11# How fast the camera pans to the player. 1.0 is instant.
 12CAMERA_SPEED = 0.1
 13
 14PLAYER_MOVEMENT_SPEED = 7
 15BOMB_COUNT = 70
 16PLAYING_FIELD_WIDTH = 1600
 17PLAYING_FIELD_HEIGHT = 1600
 18
 19
 20class MyGame(arcade.Window):
 21
 22    def __init__(self, width, height, title):
 23        super().__init__(width, height, title, resizable=True)
 24
 25        # Sprites and sprite lists
 26        self.player_sprite = None
 27        self.wall_list = arcade.SpriteList()
 28        self.player_list = arcade.SpriteList()
 29        self.bomb_list = arcade.SpriteList()
 30        self.physics_engine = None
 31
 32        self.generate_sprites()
 33        self.background_color = arcade.color.ARMY_GREEN
 34
 35    def generate_sprites(self):
 36        # -- Set up several columns of walls
 37        for x in range(0, PLAYING_FIELD_WIDTH, 128):
 38            for y in range(0, PLAYING_FIELD_HEIGHT, int(128 * SPRITE_SCALING)):
 39                # Randomly skip a box so the player can find a way through
 40                if random.randrange(2) > 0:
 41                    wall = arcade.Sprite(":resources:images/tiles/boxCrate_double.png", SPRITE_SCALING)
 42                    wall.center_x = x
 43                    wall.center_y = y
 44                    self.wall_list.append(wall)
 45
 46        # -- Set some hidden bombs in the area
 47        for i in range(BOMB_COUNT):
 48            bomb = arcade.Sprite(":resources:images/tiles/bomb.png", 0.25)
 49            placed = False
 50            while not placed:
 51                bomb.center_x = random.randrange(PLAYING_FIELD_WIDTH)
 52                bomb.center_y = random.randrange(PLAYING_FIELD_HEIGHT)
 53                if not arcade.check_for_collision_with_list(bomb, self.wall_list):
 54                    placed = True
 55            self.bomb_list.append(bomb)
 56
 57        # Create the player
 58        self.player_sprite = arcade.Sprite(":resources:images/animated_characters/female_person/femalePerson_idle.png",
 59                                           scale=SPRITE_SCALING)
 60        self.player_sprite.center_x = 256
 61        self.player_sprite.center_y = 512
 62        self.player_list.append(self.player_sprite)
 63
 64        # Physics engine, so we don't run into walls
 65        self.physics_engine = arcade.PhysicsEngineSimple(self.player_sprite, self.wall_list)
 66
 67    def on_draw(self):
 68        self.clear()
 69
 70        self.wall_list.draw()
 71        self.bomb_list.draw()
 72        self.player_list.draw()
 73
 74    def on_key_press(self, key, modifiers):
 75        """Called whenever a key is pressed. """
 76
 77        if key == arcade.key.UP:
 78            self.player_sprite.change_y = PLAYER_MOVEMENT_SPEED
 79        elif key == arcade.key.DOWN:
 80            self.player_sprite.change_y = -PLAYER_MOVEMENT_SPEED
 81        elif key == arcade.key.LEFT:
 82            self.player_sprite.change_x = -PLAYER_MOVEMENT_SPEED
 83        elif key == arcade.key.RIGHT:
 84            self.player_sprite.change_x = PLAYER_MOVEMENT_SPEED
 85
 86    def on_key_release(self, key, modifiers):
 87        """Called when the user releases a key. """
 88
 89        if key == arcade.key.UP or key == arcade.key.DOWN:
 90            self.player_sprite.change_y = 0
 91        elif key == arcade.key.LEFT or key == arcade.key.RIGHT:
 92            self.player_sprite.change_x = 0
 93
 94    def on_update(self, delta_time):
 95        """ Movement and game logic """
 96
 97        # Call update on all sprites (The sprites don't do much in this
 98        # example though.)
 99        self.physics_engine.update()
100
101
102if __name__ == "__main__":
103    MyGame(SCREEN_WIDTH, SCREEN_HEIGHT, SCREEN_TITLE)
104    arcade.run()