"""这是一个毛胚程序,作为一个作品关卡选择器。 多关卡界面,运行本程序会显示两个按钮,单击不同的按钮会进入不同的界面。 """ import arcade SCREEN_WIDTH = 600 # 常量定义,屏幕宽度 SCREEN_HEIGHT = 480 # 常量定义,屏幕高度 SCREEN_TITLE = " arcade关卡选择界面by lixingqiu" # 常量定义,屏幕标题 SPRITE_SCALING = 0.5 SPRITE_PIXEL_SIZE = 32 def point_in_sprite(x,y,sprite): """ 判断点是否角色的矩形内,x,y:坐标点,left:最左边x坐标,right:最右边x坐标,top:最上边y坐标,bottom:最下边y坐标。 """ left = sprite.left right = sprite.right top = sprite.top bottom = sprite.bottom return x > left and x < right and y < top and y > bottom class MyGame(arcade.Window): """ 继承自窗口类的游戏类,在具体的游戏中,重写以下方法,删除不需要重写的方法。 """ button_index = None def __init__(self, width, height, title): super().__init__(width, height, title) # 调用父类的初始化方法新建一个窗口 arcade.set_background_color(arcade.color.AMAZON) # 设置背景颜色为亚马逊绿 def load_level(self,mapfile): """根据单击不同的关卡按钮,加载不同的tmx地图文件""" # 加载 地图 my_map = arcade.read_tiled_map(mapfile, SPRITE_SCALING) # 读取不可移动的平台数据阵列'ground'是一图层的名称 map_array = my_map.layers_int_data['ground'] # 从墙生成地图列表 self.wall_list = arcade.generate_sprites(my_map, 'ground', SPRITE_SCALING) self.wall_list.move(SPRITE_PIXEL_SIZE ,0) # 水平方向和垂直方向移动 # 读取key阵列, picked是地图中的一个层,这个层里是可拾取的道具。 keys_array = my_map.layers_int_data['picked'] # 生成key列表,在地图设计中,可增加多个key self.key_list = arcade.generate_sprites(my_map, 'picked', SPRITE_SCALING) self.key_list.move(SPRITE_PIXEL_SIZE ,0) def setup(self): """ 这个方法是在实例化Mygame后对游戏进行一些设置。 """ self.button_list = arcade.SpriteList() self.button1 = arcade.Sprite("button.png") self.button1.left = 100 self.button1.bottom = 300 self.button_list.append(self.button1) self.button2 = arcade.Sprite("button.png") self.button2.left = 100 self.button2.bottom = 100 self.button_list.append(self.button2) def on_draw(self): """ 渲染屏幕 ,帧率为60左右,即每60份之一秒会自动调用此方法 """ arcade.start_render() # 此命令会用背景色填充屏幕, if MyGame.button_index == None: self.button_list.draw() # 重画 else: self.wall_list.draw() self.key_list.draw() def update(self, delta_time): """ 所有的角色移动等游戏逻辑都在这里编写代码 """ self.button_list.update() def on_mouse_press(self, x, y, button, key_modifiers): """ 当按鼠标键时会自动地调用此方法 """ if MyGame.button_index != None:return if point_in_sprite(x,y,self.button1): print("单击到按钮1") self.load_level(f"house_1.tmx") MyGame.button_index = 1 if point_in_sprite(x,y,self.button2): print("单击到按钮2") self.load_level(f"house_2.tmx") MyGame.button_index = 2 def on_mouse_motion(self, x, y, delta_x, delta_y): """ 当鼠标移动时会自动地调用此方法 """ def main(): """主要的函数""" game = MyGame(SCREEN_WIDTH, SCREEN_HEIGHT, SCREEN_TITLE) # 实例化一个游戏 game.setup() # 对游戏进行设置 arcade.run() # 进入选关卡循环 if __name__ == "__main__": main()