光线投射开始文件#

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