""" 子弹类和角色类例子,本程序演示如何新建角色,按鼠标键发射激光射击金币。 """ import random import arcade import os SPRITE_SCALING_PLAYER = 0.5 SPRITE_SCALING_COIN = 0.2 SPRITE_SCALING_LASER = 0.8 COIN_COUNT = 50 SCREEN_WIDTH = 800 SCREEN_HEIGHT = 600 SCREEN_TITLE = "arcade子弹类和角色类例子,译:李兴球" BULLET_SPEED = 5 class MyGame(arcade.Window): """ Main application class. """ def __init__(self): """ Initializer """ # Call the parent class initializer super().__init__(SCREEN_WIDTH, SCREEN_HEIGHT, SCREEN_TITLE) # Set the working directory (where we expect to find files) to the same # directory this .py file is in. You can leave this out of your own # code, but it is needed to easily run the examples using "python -m" # as mentioned at the top of this program. file_path = os.path.dirname(os.path.abspath(__file__)) os.chdir(file_path) # 角色列表定义 self.player_list = None self.coin_list = None self.bullet_list = None # 角色定义 self.player_sprite = None self.score = 0 # 不显示鼠标指针 self.set_mouse_visible(False) # 加载音效,声音从from kenney.nl self.gun_sound = arcade.sound.load_sound("sounds/laser1.wav") self.hit_sound = arcade.sound.load_sound("sounds/phaseJump1.wav") arcade.set_background_color(arcade.color.AMAZON) def setup(self): """ Set up the game and initialize the variables. """ # 实例化角色列有 self.player_list = arcade.SpriteList() self.coin_list = arcade.SpriteList() self.bullet_list = arcade.SpriteList() # 设置玩家的得分 self.score = 0 # 图像从 kenney.nl中来 self.player_sprite = arcade.Sprite("images/character.png", SPRITE_SCALING_PLAYER) self.player_sprite.center_x = 50 self.player_sprite.center_y = 70 self.player_list.append(self.player_sprite) # 生成一些金币 for i in range(COIN_COUNT): # 创建金币图像从 kenney.nl中来 coin = arcade.Sprite("images/coin_01.png", SPRITE_SCALING_COIN) # 设定金币坐标 coin.center_x = random.randrange(SCREEN_WIDTH) coin.center_y = random.randrange(120, SCREEN_HEIGHT) # 增加到金币列表 self.coin_list.append(coin) # 设置背景颜色 arcade.set_background_color(arcade.color.AMAZON) def on_draw(self): """ 渲染屏幕 """ # 画角色之前此命令要调用在先 arcade.start_render() # 画所有角色 self.coin_list.draw() self.bullet_list.draw() self.player_list.draw() # 画文本 arcade.draw_text(f"Score: {self.score}", 10, 20, arcade.color.WHITE, 14) def on_mouse_motion(self, x, y, dx, dy): """ 鼠标移动事件 """ self.player_sprite.center_x = x def on_mouse_press(self, x, y, button, modifiers): """ 按鼠标键时调用此方法 """ # 播放射击声 arcade.sound.play_sound(self.gun_sound) # 创建一个子弹 bullet = arcade.Sprite("images/laserBlue01.png", SPRITE_SCALING_LASER) # 图像方向朝右所以要旋转. bullet.angle = 90 # 给子弹垂直速度 bullet.change_y = BULLET_SPEED # 设定坐标到角色这里 bullet.center_x = self.player_sprite.center_x bullet.bottom = self.player_sprite.top # 所有子弹加到列表 self.bullet_list.append(bullet) def update(self, delta_time): """ 移动与游戏逻辑,一般在这里做碰撞检测""" # 所有子弹更新坐标 self.bullet_list.update() # 遍历每颗子弹 for bullet in self.bullet_list: # 检测此颗子弹看看它有没有碰到 金币 hit_list = arcade.check_for_collision_with_list(bullet, self.coin_list) # 如果碰到了就把它删除 if len(hit_list) > 0: bullet.kill() # 碰到的每个金币也删除,并加分 for coin in hit_list: coin.kill() self.score += 1 # 射中的声音 arcade.sound.play_sound(self.hit_sound) # 子弹离屏,删除它 if bullet.bottom > SCREEN_HEIGHT: bullet.kill() def main(): window = MyGame() window.setup() arcade.run() if __name__ == "__main__": main()