Fixed leaky abstraction Map - draw - Object.
This commit is contained in:
111
eb_engine.py
111
eb_engine.py
@@ -77,7 +77,16 @@ class Map:
|
||||
cell.creature_obj.walkable_matrix = self.walkable_matrix
|
||||
cell.creature_obj.rocks_matrix = self.rocks_matrix
|
||||
|
||||
def draw_obj(self, obj, draw_data):
|
||||
if draw_data["spr_up"] == 0:
|
||||
if obj.sprite_state == len(draw_data["sprites"][obj.sprite_name]) - 1:
|
||||
obj.sprite_state = 0
|
||||
else:
|
||||
obj.sprite_state += 1
|
||||
|
||||
sp = draw_data["sprites"][obj.sprite_name][obj.sprite_state]
|
||||
rect = sp.get_rect(center = (draw_data["x"] + draw_data["w"] /2, draw_data["y"] + draw_data["h"]/ 2))
|
||||
draw_data["screen"].blit(sp, rect)
|
||||
|
||||
def move_obj(self, type, start, goal):
|
||||
"""Перемещает объект типа 'terrain_obj', 'item_obj' или 'creature_obj'
|
||||
@@ -156,54 +165,54 @@ class Map:
|
||||
if cell.terrain_obj and cell.terrain_obj.sprite_name == "rock_small":
|
||||
self.rocks_matrix[r][c] = True
|
||||
|
||||
# def draw_map(self, screen, current_frame, grid=True):
|
||||
# terrain_list = []
|
||||
# creature_list = []
|
||||
#
|
||||
# # ★ 1 ПАСС: собираем terrain и creatures ★
|
||||
# for j in range(len(self.cells)):
|
||||
# for i, cell in enumerate(self.cells[j]):
|
||||
# base_x = i * self.cell_size + self.cam_x
|
||||
# base_y = j * self.cell_size + self.cam_y
|
||||
#
|
||||
# # Terrain данные
|
||||
# terrain_dd = {
|
||||
# "x": int(base_x * self.scale), "y": int(base_y * self.scale),
|
||||
# "w": int(self.cell_size * self.scale - self.cell_dist),
|
||||
# "h": int(self.cell_size * self.scale - self.cell_dist),
|
||||
# "spr_up": current_frame % self.sprites_refresh,
|
||||
# "sprites": self.sprites, "scale": self.scale, "screen": screen
|
||||
# }
|
||||
# terrain_list.append((cell.terrain_obj, terrain_dd))
|
||||
#
|
||||
# # Creature данные (если есть)
|
||||
# if cell.creature_obj:
|
||||
# offset_x, offset_y = cell.creature_obj.render_offset
|
||||
# creature_dd = terrain_dd.copy()
|
||||
# creature_dd["x"] = int((base_x + offset_x) * self.scale)
|
||||
# creature_dd["y"] = int((base_y + offset_y) * self.scale)
|
||||
# creature_list.append((cell.creature_obj, creature_dd))
|
||||
#
|
||||
# # ★ 2 ПАСС: рисуем terrain ★
|
||||
# for obj, dd in terrain_list:
|
||||
# obj.draw(dd)
|
||||
#
|
||||
# # ★ 3 ПАСС: рисуем ВСЕХ creatures ПОСЛЕ terrain ★
|
||||
# for obj, dd in creature_list:
|
||||
# obj.draw(dd)
|
||||
#
|
||||
# # ★ 4 ПАСС: grid поверх всего ★
|
||||
# for j in range(len(self.cells)):
|
||||
# for i, cell in enumerate(self.cells[j]):
|
||||
# base_x = i * self.cell_size + self.cam_x
|
||||
# base_y = j * self.cell_size + self.cam_y
|
||||
# grid_rect = pygame.Rect(
|
||||
# int(base_x * self.scale), int(base_y * self.scale),
|
||||
# int(self.cell_size * self.scale - self.cell_dist),
|
||||
# int(self.cell_size * self.scale - self.cell_dist)
|
||||
# )
|
||||
# color = self.target_color if cell.is_target else self.color
|
||||
# pygame.draw.rect(screen, color, grid_rect, self.bord)
|
||||
def OLDSTABLE_draw_map(self, screen, current_frame, grid=True):
|
||||
terrain_list = []
|
||||
creature_list = []
|
||||
|
||||
# ★ 1 ПАСС: собираем terrain и creatures ★
|
||||
for j in range(len(self.cells)):
|
||||
for i, cell in enumerate(self.cells[j]):
|
||||
base_x = i * self.cell_size + self.cam_x
|
||||
base_y = j * self.cell_size + self.cam_y
|
||||
|
||||
# Terrain данные
|
||||
terrain_dd = {
|
||||
"x": int(base_x * self.scale), "y": int(base_y * self.scale),
|
||||
"w": int(self.cell_size * self.scale - self.cell_dist),
|
||||
"h": int(self.cell_size * self.scale - self.cell_dist),
|
||||
"spr_up": current_frame % self.sprites_refresh,
|
||||
"sprites": self.sprites, "scale": self.scale, "screen": screen
|
||||
}
|
||||
terrain_list.append((cell.terrain_obj, terrain_dd))
|
||||
|
||||
# Creature данные (если есть)
|
||||
if cell.creature_obj:
|
||||
offset_x, offset_y = cell.creature_obj.render_offset
|
||||
creature_dd = terrain_dd.copy()
|
||||
creature_dd["x"] = int((base_x + offset_x) * self.scale)
|
||||
creature_dd["y"] = int((base_y + offset_y) * self.scale)
|
||||
creature_list.append((cell.creature_obj, creature_dd))
|
||||
|
||||
# ★ 2 ПАСС: рисуем terrain ★
|
||||
for obj, dd in terrain_list:
|
||||
obj.draw(dd)
|
||||
|
||||
# ★ 3 ПАСС: рисуем ВСЕХ creatures ПОСЛЕ terrain ★
|
||||
for obj, dd in creature_list:
|
||||
obj.draw(dd)
|
||||
|
||||
# ★ 4 ПАСС: grid поверх всего ★
|
||||
for j in range(len(self.cells)):
|
||||
for i, cell in enumerate(self.cells[j]):
|
||||
base_x = i * self.cell_size + self.cam_x
|
||||
base_y = j * self.cell_size + self.cam_y
|
||||
grid_rect = pygame.Rect(
|
||||
int(base_x * self.scale), int(base_y * self.scale),
|
||||
int(self.cell_size * self.scale - self.cell_dist),
|
||||
int(self.cell_size * self.scale - self.cell_dist)
|
||||
)
|
||||
color = self.target_color if cell.is_target else self.color
|
||||
pygame.draw.rect(screen, color, grid_rect, self.bord)
|
||||
|
||||
def draw_map(self, screen, current_frame, grid=True):
|
||||
screen_rect = screen.get_rect()
|
||||
@@ -251,11 +260,11 @@ class Map:
|
||||
|
||||
# ★ 2 ПАСС: рисуем terrain ★
|
||||
for obj, dd in terrain_list:
|
||||
obj.draw(dd)
|
||||
self.draw_obj(obj, dd)
|
||||
|
||||
# ★ 3 ПАСС: рисуем ВСЕХ creatures ПОСЛЕ terrain ★
|
||||
for obj, dd in creature_list:
|
||||
obj.draw(dd)
|
||||
self.draw_obj(obj, dd)
|
||||
|
||||
# ★ 4 ПАСС: grid только для видимых ячеек ★
|
||||
for j in range(min_row, max_row):
|
||||
@@ -268,7 +277,7 @@ class Map:
|
||||
grid_rect = pygame.Rect(
|
||||
int(base_x * self.scale), int(base_y * self.scale),
|
||||
int(self.cell_size * self.scale - self.cell_dist),
|
||||
int(self.cell_size * self.scale - self.cell_dist) # ИСПРАВЛЕНО
|
||||
int(self.cell_size * self.scale - self.cell_dist)
|
||||
)
|
||||
color = self.target_color if cell.is_target else self.color
|
||||
pygame.draw.rect(screen, color, grid_rect, self.bord)
|
||||
|
||||
Reference in New Issue
Block a user