"""
子弹类和角色类例子,本程序演示如何新建角色,按鼠标键发射激光射击金币。
"""
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()