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.walkable_matrix = self.walkable_matrix
|
||||||
cell.creature_obj.rocks_matrix = self.rocks_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):
|
def move_obj(self, type, start, goal):
|
||||||
"""Перемещает объект типа 'terrain_obj', 'item_obj' или 'creature_obj'
|
"""Перемещает объект типа 'terrain_obj', 'item_obj' или 'creature_obj'
|
||||||
@@ -156,54 +165,54 @@ class Map:
|
|||||||
if cell.terrain_obj and cell.terrain_obj.sprite_name == "rock_small":
|
if cell.terrain_obj and cell.terrain_obj.sprite_name == "rock_small":
|
||||||
self.rocks_matrix[r][c] = True
|
self.rocks_matrix[r][c] = True
|
||||||
|
|
||||||
# def draw_map(self, screen, current_frame, grid=True):
|
def OLDSTABLE_draw_map(self, screen, current_frame, grid=True):
|
||||||
# terrain_list = []
|
terrain_list = []
|
||||||
# creature_list = []
|
creature_list = []
|
||||||
#
|
|
||||||
# # ★ 1 ПАСС: собираем terrain и creatures ★
|
# ★ 1 ПАСС: собираем terrain и creatures ★
|
||||||
# for j in range(len(self.cells)):
|
for j in range(len(self.cells)):
|
||||||
# for i, cell in enumerate(self.cells[j]):
|
for i, cell in enumerate(self.cells[j]):
|
||||||
# base_x = i * self.cell_size + self.cam_x
|
base_x = i * self.cell_size + self.cam_x
|
||||||
# base_y = j * self.cell_size + self.cam_y
|
base_y = j * self.cell_size + self.cam_y
|
||||||
#
|
|
||||||
# # Terrain данные
|
# Terrain данные
|
||||||
# terrain_dd = {
|
terrain_dd = {
|
||||||
# "x": int(base_x * self.scale), "y": int(base_y * self.scale),
|
"x": int(base_x * self.scale), "y": int(base_y * self.scale),
|
||||||
# "w": int(self.cell_size * self.scale - self.cell_dist),
|
"w": int(self.cell_size * self.scale - self.cell_dist),
|
||||||
# "h": 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,
|
"spr_up": current_frame % self.sprites_refresh,
|
||||||
# "sprites": self.sprites, "scale": self.scale, "screen": screen
|
"sprites": self.sprites, "scale": self.scale, "screen": screen
|
||||||
# }
|
}
|
||||||
# terrain_list.append((cell.terrain_obj, terrain_dd))
|
terrain_list.append((cell.terrain_obj, terrain_dd))
|
||||||
#
|
|
||||||
# # Creature данные (если есть)
|
# Creature данные (если есть)
|
||||||
# if cell.creature_obj:
|
if cell.creature_obj:
|
||||||
# offset_x, offset_y = cell.creature_obj.render_offset
|
offset_x, offset_y = cell.creature_obj.render_offset
|
||||||
# creature_dd = terrain_dd.copy()
|
creature_dd = terrain_dd.copy()
|
||||||
# creature_dd["x"] = int((base_x + offset_x) * self.scale)
|
creature_dd["x"] = int((base_x + offset_x) * self.scale)
|
||||||
# creature_dd["y"] = int((base_y + offset_y) * self.scale)
|
creature_dd["y"] = int((base_y + offset_y) * self.scale)
|
||||||
# creature_list.append((cell.creature_obj, creature_dd))
|
creature_list.append((cell.creature_obj, creature_dd))
|
||||||
#
|
|
||||||
# # ★ 2 ПАСС: рисуем terrain ★
|
# ★ 2 ПАСС: рисуем terrain ★
|
||||||
# for obj, dd in terrain_list:
|
for obj, dd in terrain_list:
|
||||||
# obj.draw(dd)
|
obj.draw(dd)
|
||||||
#
|
|
||||||
# # ★ 3 ПАСС: рисуем ВСЕХ creatures ПОСЛЕ terrain ★
|
# ★ 3 ПАСС: рисуем ВСЕХ creatures ПОСЛЕ terrain ★
|
||||||
# for obj, dd in creature_list:
|
for obj, dd in creature_list:
|
||||||
# obj.draw(dd)
|
obj.draw(dd)
|
||||||
#
|
|
||||||
# # ★ 4 ПАСС: grid поверх всего ★
|
# ★ 4 ПАСС: grid поверх всего ★
|
||||||
# for j in range(len(self.cells)):
|
for j in range(len(self.cells)):
|
||||||
# for i, cell in enumerate(self.cells[j]):
|
for i, cell in enumerate(self.cells[j]):
|
||||||
# base_x = i * self.cell_size + self.cam_x
|
base_x = i * self.cell_size + self.cam_x
|
||||||
# base_y = j * self.cell_size + self.cam_y
|
base_y = j * self.cell_size + self.cam_y
|
||||||
# grid_rect = pygame.Rect(
|
grid_rect = pygame.Rect(
|
||||||
# int(base_x * self.scale), int(base_y * self.scale),
|
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)
|
int(self.cell_size * self.scale - self.cell_dist)
|
||||||
# )
|
)
|
||||||
# color = self.target_color if cell.is_target else self.color
|
color = self.target_color if cell.is_target else self.color
|
||||||
# pygame.draw.rect(screen, color, grid_rect, self.bord)
|
pygame.draw.rect(screen, color, grid_rect, self.bord)
|
||||||
|
|
||||||
def draw_map(self, screen, current_frame, grid=True):
|
def draw_map(self, screen, current_frame, grid=True):
|
||||||
screen_rect = screen.get_rect()
|
screen_rect = screen.get_rect()
|
||||||
@@ -251,11 +260,11 @@ class Map:
|
|||||||
|
|
||||||
# ★ 2 ПАСС: рисуем terrain ★
|
# ★ 2 ПАСС: рисуем terrain ★
|
||||||
for obj, dd in terrain_list:
|
for obj, dd in terrain_list:
|
||||||
obj.draw(dd)
|
self.draw_obj(obj, dd)
|
||||||
|
|
||||||
# ★ 3 ПАСС: рисуем ВСЕХ creatures ПОСЛЕ terrain ★
|
# ★ 3 ПАСС: рисуем ВСЕХ creatures ПОСЛЕ terrain ★
|
||||||
for obj, dd in creature_list:
|
for obj, dd in creature_list:
|
||||||
obj.draw(dd)
|
self.draw_obj(obj, dd)
|
||||||
|
|
||||||
# ★ 4 ПАСС: grid только для видимых ячеек ★
|
# ★ 4 ПАСС: grid только для видимых ячеек ★
|
||||||
for j in range(min_row, max_row):
|
for j in range(min_row, max_row):
|
||||||
@@ -268,7 +277,7 @@ class Map:
|
|||||||
grid_rect = pygame.Rect(
|
grid_rect = pygame.Rect(
|
||||||
int(base_x * self.scale), int(base_y * self.scale),
|
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) # ИСПРАВЛЕНО
|
int(self.cell_size * self.scale - self.cell_dist)
|
||||||
)
|
)
|
||||||
color = self.target_color if cell.is_target else self.color
|
color = self.target_color if cell.is_target else self.color
|
||||||
pygame.draw.rect(screen, color, grid_rect, self.bord)
|
pygame.draw.rect(screen, color, grid_rect, self.bord)
|
||||||
|
|||||||
@@ -25,21 +25,8 @@ class Object:
|
|||||||
sprite_state: int = 0
|
sprite_state: int = 0
|
||||||
grid_pos: tuple = None
|
grid_pos: tuple = None
|
||||||
# current_map
|
# current_map
|
||||||
# pos
|
|
||||||
# weight
|
# weight
|
||||||
# effects = {}
|
# effects = {}
|
||||||
|
|
||||||
def draw(self, draw_data):
|
|
||||||
if draw_data["spr_up"] == 0:
|
|
||||||
if self.sprite_state == len(draw_data["sprites"][self.sprite_name]) - 1:
|
|
||||||
self.sprite_state = 0
|
|
||||||
else:
|
|
||||||
self.sprite_state += 1
|
|
||||||
|
|
||||||
sp = draw_data["sprites"][self.sprite_name][self.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 update(self):
|
def update(self):
|
||||||
pass
|
pass
|
||||||
|
|
||||||
@@ -49,15 +36,13 @@ class Terrain(Object):
|
|||||||
|
|
||||||
@dataclass
|
@dataclass
|
||||||
class Creature(Object):
|
class Creature(Object):
|
||||||
direction: int = 0 # tuple?
|
#direction: int = 0 # tuple?
|
||||||
move_progress: float = 0.0 # 0.0 = старт клетки, 1.0 = конец клетки
|
move_progress: float = 0.0 # 0.0 = старт клетки, 1.0 = конец клетки
|
||||||
current_target: tuple = None # (row, col) следующая клетка
|
current_target: tuple = None # (row, col) следующая клетка
|
||||||
final_goal: tuple = None
|
final_goal: tuple = None
|
||||||
move_speed: float = 0.02 # пикселей/кадр
|
move_speed: float = 0.02 # пикселей/кадр
|
||||||
render_offset: tuple = (0.0, 0.0)
|
render_offset: tuple = (0.0, 0.0)
|
||||||
start_pos: tuple = None # (row, col) начальная позиция сегмента пути
|
start_pos: tuple = None # (row, col) начальная позиция сегмента пути
|
||||||
replan_counter: int = 0
|
|
||||||
REPLAN_INTERVAL: int = 30000
|
|
||||||
waypoints: list = field(default_factory = list)
|
waypoints: list = field(default_factory = list)
|
||||||
walkable_matrix: list = field(default_factory = list)
|
walkable_matrix: list = field(default_factory = list)
|
||||||
rocks_matrix: list = field(default_factory = list)
|
rocks_matrix: list = field(default_factory = list)
|
||||||
@@ -92,12 +77,6 @@ class Creature(Object):
|
|||||||
self.render_offset = (0.0, 0.0)
|
self.render_offset = (0.0, 0.0)
|
||||||
return
|
return
|
||||||
|
|
||||||
#self.replan_counter += 1
|
|
||||||
#if self.replan_counter >= self.REPLAN_INTERVAL:
|
|
||||||
# self.replan_counter = 0
|
|
||||||
# self.replan(map_obj.cells, self.start_pos)
|
|
||||||
|
|
||||||
|
|
||||||
if self.current_target is None: return
|
if self.current_target is None: return
|
||||||
|
|
||||||
#target_row, target_col = self.current_target
|
#target_row, target_col = self.current_target
|
||||||
@@ -258,16 +237,12 @@ class Creature(Object):
|
|||||||
self.grid_pos[1] + area))
|
self.grid_pos[1] + area))
|
||||||
self.move(cells, goal)
|
self.move(cells, goal)
|
||||||
|
|
||||||
|
|
||||||
def move_rand(self, cells, area_start, area_end):
|
def move_rand(self, cells, area_start, area_end):
|
||||||
goal = (random.randint(area_start, area_end), random.randint(area_start, area_end))
|
goal = (random.randint(area_start, area_end), random.randint(area_start, area_end))
|
||||||
while goal == self.grid_pos:
|
while goal == self.grid_pos:
|
||||||
goal = (random.randint(area_start, area_end), random.randint(area_start, area_end))
|
goal = (random.randint(area_start, area_end), random.randint(area_start, area_end))
|
||||||
self.move(cells, goal)
|
self.move(cells, goal)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@dataclass
|
@dataclass
|
||||||
class Item(Object):
|
class Item(Object):
|
||||||
# passive_abilities = {}
|
# passive_abilities = {}
|
||||||
|
|||||||
20
main.py
20
main.py
@@ -10,36 +10,18 @@ if __name__ == "__main__":
|
|||||||
main()
|
main()
|
||||||
# todo:
|
# todo:
|
||||||
# прокрутка баг консоль и карта
|
# прокрутка баг консоль и карта
|
||||||
# ОПТИМИЗАЦИИ
|
|
||||||
# перепроверять путь пореже, или только после столкновения, или локальный поиск
|
|
||||||
# очередь задач и задача рандомного патруля
|
|
||||||
# устроить краш тест поиску пути, запустив много объектов на маленьком поле, успел заметить баги
|
# устроить краш тест поиску пути, запустив много объектов на маленьком поле, успел заметить баги
|
||||||
# добавить функцию движения за каким-то объектом
|
# добавить функцию движения за каким-то объектом
|
||||||
# сделать, чтобы в случае отменненого движения не телепортировался назад, а плавно
|
# сделать, чтобы в случае отменненого движения не телепортировался назад, а плавно
|
||||||
# приступаем к логике
|
# приступаем к логике
|
||||||
# сделать по аналогии с текущей клеткой текущий объект
|
# сделать по аналогии с текущей клеткой текущий объект
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
# посмотреть как в clock = pygame.time.Clock() работает фпс
|
# посмотреть как в clock = pygame.time.Clock() работает фпс
|
||||||
# перемещать оъект в другую клетку при половине офсета
|
# перемещать оъект в другую клетку при половине офсета
|
||||||
|
|
||||||
# техдолг Егору
|
# техдолг Егору
|
||||||
# убрать cells и mapobject creature - перенести нужную логику в методы Map
|
# убрать cells и mapobject creature - перенести нужную логику в методы Map
|
||||||
# система имен спрайтов и Action - реализовать
|
# система имен спрайтов и Action - реализовать
|
||||||
# рисовать группой спрайтов как в перпл
|
# рисовать группой спрайтов
|
||||||
# нужен ли теперь start_pos? grid_pos?
|
# нужен ли теперь start_pos? grid_pos?
|
||||||
# class Task с проверками выполнения экшонов
|
# class Task с проверками выполнения экшонов
|
||||||
|
|
||||||
#вернуть назад апдейт. вернул - работает, сравнить с новым и решить
|
|
||||||
#final_goal = None - check all!
|
|
||||||
#рефактор goal = (random.randint(self.grid_pos[0] - area,
|
|
||||||
# self.grid_pos[0] + area),
|
|
||||||
# random.randint(self.grid_pos[1] - area,
|
|
||||||
# self.grid_pos[1] + area))
|
|
||||||
|
|
||||||
# отловить баг - иногда всё равно встают - похоже из-за реплана и коллизий с эльфами
|
|
||||||
# вроде починил, добавив final_goal = None в реплан, проверить
|
|
||||||
|
|
||||||
# совет ксюши - не считать коллизии с объектами, только при перемещении в клетку проверять
|
|
||||||
1
plan.txt
1
plan.txt
@@ -1,4 +1,5 @@
|
|||||||
1. Доработка системы задач: класс Task, новые задачи, проработка старых;
|
1. Доработка системы задач: класс Task, новые задачи, проработка старых;
|
||||||
|
|
||||||
2. Доработка движка и приведение его структуры в порядок:
|
2. Доработка движка и приведение его структуры в порядок:
|
||||||
- вынос всех функций карты в карту, объекты знают свою позицию и им этого хватит.
|
- вынос всех функций карты в карту, объекты знают свою позицию и им этого хватит.
|
||||||
взаимодействия с картой и другими объектами должно происходить только в методе движения, остальные методы должны абстрагироваться от карты;
|
взаимодействия с картой и другими объектами должно происходить только в методе движения, остальные методы должны абстрагироваться от карты;
|
||||||
|
|||||||
Reference in New Issue
Block a user