arcade关卡选择界面

"""这是一个毛胚程序,作为一个作品关卡选择器。
多关卡界面,运行本程序会显示两个按钮,单击不同的按钮会进入不同的界面。
"""

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