沿着一条路走的精灵#

follow_path.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 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 | """ Sprite Follow Path This example has enemy sprites follow a set path. Artwork from https://kenney.nl If Python and Arcade are installed, this example can be run from the command line with: python -m arcade.examples.sprite_follow_path """ import arcade import math # --- Constants --- SPRITE_SCALING_PLAYER = 0.5 SPRITE_SCALING_ENEMY = 0.5 ENEMY_SPEED = 3.0 SCREEN_WIDTH = 800 SCREEN_HEIGHT = 600 SCREEN_TITLE = "Sprite Follow Path Simple Example" class Enemy(arcade.Sprite): """ This class represents the Enemy on our screen. """ def __init__(self, image, scale, position_list): super().__init__(image, scale) self.position_list = position_list self.cur_position = 0 self.speed = ENEMY_SPEED def update(self): """ Have a sprite follow a path """ # Where are we start_x = self.center_x start_y = self.center_y # Where are we going dest_x = self.position_list[self.cur_position][0] dest_y = self.position_list[self.cur_position][1] # X and Y diff between the two x_diff = dest_x - start_x y_diff = dest_y - start_y # Calculate angle to get there angle = math.atan2(y_diff, x_diff) # How far are we? distance = math.sqrt((self.center_x - dest_x) ** 2 + (self.center_y - dest_y) ** 2) # How fast should we go? If we are close to our destination, # lower our speed so we don't overshoot. speed = min(self.speed, distance) # Calculate vector to travel change_x = math.cos(angle) * speed change_y = math.sin(angle) * speed # Update our location self.center_x += change_x self.center_y += change_y # How far are we? distance = math.sqrt((self.center_x - dest_x) ** 2 + (self.center_y - dest_y) ** 2) # If we are there, head to the next point. if distance <= self.speed: self.cur_position += 1 # Reached the end of the list, start over. if self.cur_position >= len(self.position_list): self.cur_position = 0 class MyGame(arcade.Window): """ Our custom Window Class""" def __init__(self): """ Initializer """ # Call the parent class initializer super().__init__(SCREEN_WIDTH, SCREEN_HEIGHT, SCREEN_TITLE) # Variables that will hold sprite lists self.player_list = None self.enemy_list = None # Set up the player info self.player_sprite = None self.score = 0 # Don't show the mouse cursor self.set_mouse_visible(False) arcade.set_background_color(arcade.color.AMAZON) def setup(self): """ Set up the game and initialize the variables. """ # Sprite lists self.player_list = arcade.SpriteList() self.enemy_list = arcade.SpriteList() # Score self.score = 0 # Set up the player # Character image from kenney.nl self.player_sprite = arcade.Sprite(":resources:images/animated_characters/female_person/" "femalePerson_idle.png", SPRITE_SCALING_PLAYER) self.player_sprite.center_x = 50 self.player_sprite.center_y = 50 self.player_list.append(self.player_sprite) # List of points the enemy will travel too. position_list = [[50, 50], [700, 50], [700, 500], [50, 500]] # Create the enemy enemy = Enemy(":resources:images/animated_characters/robot/robot_idle.png", SPRITE_SCALING_ENEMY, position_list) # Set initial location of the enemy at the first point enemy.center_x = position_list[0][0] enemy.center_x = position_list[0][1] # Add the enemy to the enemy list self.enemy_list.append(enemy) def on_draw(self): """ Draw everything """ self.clear() self.enemy_list.draw() self.player_list.draw() def on_mouse_motion(self, x, y, dx, dy): """ Handle Mouse Motion """ # Move the center of the player sprite to match the mouse x, y self.player_sprite.center_x = x self.player_sprite.center_y = y def on_update(self, delta_time): """ Movement and game logic """ self.enemy_list.update() def main(): """ Main function """ window = MyGame() window.setup() arcade.run() if __name__ == "__main__": main() |