import pygame from code.engine.common import Array2D from code.game_global import g class GameMap: """ 游戏地图 """ def __init__(self): self.btm_img = None # 地图背景图片 self.top_img = None # 地图遮挡层图片 self.walk_data = None # 行走层数据 self.redraw_data = None # 重绘层数据 self.enter_point = None # 地图切换点 self.w = 0 # 地图的长宽,16*16为一个单位 self.h = 0 self.size_w = 0 self.size_h = 0 self.x = 0 # 绘图坐标 self.y = 0 # self.npc_list = [] # npc列表 def load(self, map_id): """ 加载地图 """ self.btm_img = pygame.image.load(f'./resource/PicLib/all_map/{map_id}-1.jpg') self.top_img = pygame.image.load(f'./resource/PicLib/all_map/{map_id}-2.png').convert_alpha() self.w = int(self.btm_img.get_width() / 16) + 2 self.h = int(self.btm_img.get_height() / 16) + 2 self.size_w = self.btm_img.get_width() self.size_h = self.btm_img.get_height() self.walk_data = Array2D(self.w, self.h) self.redraw_data = Array2D(self.w, self.h) self.enter_point = Array2D(self.w, self.h) with open(f'./resource/PicLib/all_map/{map_id}.Walkmap') as file: for x in range(self.w): for y in range(self.h): self.walk_data[x][y] = int(file.readline()) with open(f'./resource/PicLib/all_map/{map_id}.Redrawmap') as file: for x in range(self.w): for y in range(self.h): self.redraw_data[x][y] = int(file.readline()) with open(f'./resource/PicLib/all_map/{map_id}.Enterpos', mode='rb') as file: data = file.read() for i in range(0, len(data), 12): chunk = data[i:i + 12] x = int.from_bytes(chunk[0:4], 'little') y = int.from_bytes(chunk[4:8], 'little') v = int.from_bytes(chunk[8:12], 'little') self.enter_point[x][y] = v g.audio_player.play_music(f"map{map_id}", -1) def roll(self, role_x, role_y, win_width=640, win_height=480): """ 地图滚动 :param role_x: 角色相对于地图的坐标 :param role_y: """ if role_x < win_width / 2: self.x = 0 elif role_x > self.size_w - win_width / 2: self.x = -(self.size_w - win_width) else: self.x = -(role_x - win_width / 2) if role_y < win_height / 2: self.y = 0 elif role_y > self.size_h - win_height / 2: self.y = -(self.size_h - win_height) else: self.y = -(role_y - win_height / 2) def calc_roll_pos(self, x, y, win_width=640, win_height=480): """ x,y:以地图左上角建立坐标系得到的坐标 计算镜头移动到目标点后地图坐标 """ if x < win_width / 2: map_x = 0 elif x > self.size_w - win_width / 2: map_x = -(self.size_w - win_width) else: map_x = -(x - win_width / 2) if y < win_height / 2: map_y = 0 elif y > self.size_h - win_height / 2: map_y = -(self.size_h - win_height) else: map_y = -(y - win_height / 2) return map_x, map_y def unload(self): pass