"""这是一个毛胚程序,作为一个作品关卡选择器。
多关卡界面,运行本程序会显示两个按钮,单击不同的按钮会进入不同的界面。
"""
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()