From 7fbc1b38c2c164f54c0f866f8c348e76640ca593 Mon Sep 17 00:00:00 2001 From: shiva404 Date: Fri, 20 Feb 2026 04:02:51 +0300 Subject: [PATCH] slop-commit. check out all code, test and take a look at notes in main, need to clean up it --- __pycache__/eb_engine.cpython-314.pyc | Bin 21829 -> 22724 bytes __pycache__/eb_objects.cpython-314.pyc | Bin 3661 -> 5608 bytes eb_engine.py | 119 ++++++++++++++++--------- eb_objects.py | 49 +++++++++- 4 files changed, 124 insertions(+), 44 deletions(-) diff --git a/__pycache__/eb_engine.cpython-314.pyc b/__pycache__/eb_engine.cpython-314.pyc index 27c024e1981b3c511f80e0560e69eace8f09df69..4c908b31c2d2229bc88e2e2b18d37ddd1574b933 100644 GIT binary patch delta 5289 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 Qg)0n2QTwHY7R7=79}KT)1poj5 delta 4668 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 delta 1003 zcmaKr%TE(g6vof(%(O#m3kU_l63Rnh1ObIs6eMC}5Fe8;Xo(w4r8Q}!kK7qFu4tkm ztkmS1xNu|Kb*J$kaBbqsm6Nz~V_XrsAaUjWW<+B`yo=v_bMEPx@1A@5ee_czHX4hD zNv=2IW$~x>E_PW9)|pwSy11>4vBvvtt;$%x*bipdn3xScF_SXctZRHiKKUeY8aM+? z14*C<=musEkdUIGNo>G4EKM;>?W7IeiCUTy%aYS< z1qa9oi4S_u+B%a(4i>aRq&I?6)X1U%;=NM(Hu|Kpkuv0)>6g-N&hSFc+2n=s&1yd9 z6o!#L2*9=2)jRHvOHrdWve*(`VO6!4vT7f#9?dG#@?%(8DhGT;WCf%*h2z~|u70mr z&fj^Mdt@4l8(goHN|iESkb7>E3|1?}vSS;XD22PDh}vk$kX+(b_;}(ZB5e{i`l=6n z>FRrZ;;s6*E48COjfrR4{SY6Ln>-^{TL(vsfU9m4ZO2vf#dXIB@KNlIp#;42*Zf1D z5+7T8*;(RSAlDQ30w!zOuh(A0p8`Opwbdv z*Dv}8<`4vusA|uPc-!Q$J(X$EyN0PSipp=7ghI%u)Tuy6TcsD0vrZ z@^h$_1pbcLGF}19q#csjriM;hlb^GUk{43{lx)gW%1*9WF7W@754+l8=T$fyiz^s@;Tm5x@Bhg`>K+ diff --git a/eb_engine.py b/eb_engine.py index d5cd630..94499ac 100644 --- a/eb_engine.py +++ b/eb_engine.py @@ -27,6 +27,7 @@ class Cell: item_obj: None = None creature_obj: None = None is_target: bool = False + render_offset: tuple = (0.0, 0.0) @dataclass class Map: @@ -36,7 +37,7 @@ class Map: cells: dict = field(default_factory = dict) color: str = "gray57" target_color: str = "gold" - size: int = 150 + cell_size: int = 150 bord: int = 3 scale: float = 1 cam_x: int = 0 @@ -88,8 +89,8 @@ class Map: """Возвращает индексы клетки (row, col) по позиции мыши или None если вне карты""" mx, my = mouse_pos # Переводим экранные координаты в координаты карты с учетом камеры и масштаба - map_x = (mx - self.cam_x * self.scale) / self.scale / self.size - map_y = (my - self.cam_y * self.scale) / self.scale / self.size + map_x = (mx - self.cam_x * self.scale) / self.scale / self.cell_size + map_y = (my - self.cam_y * self.scale) / self.scale / self.cell_size # Получаем индексы ближайшей клетки col = int(map_x) @@ -102,38 +103,65 @@ class Map: return (row, col) - def draw_map(self, screen, current_frame, grid = True): + def update_map(self, time_delta): + for j in range(len(self.cells)): + for cell in self.cells[j]: + if cell.creature_obj and cell.creature_obj.current_target: + cell.creature_obj.update(time_delta, self.cell_size, self) # self! + + + + 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]): - dd = {"x": int((i * self.size + self.cam_x) * self.scale), - "y": int((j * self.size + self.cam_y) * self.scale), - "w": int(self.size * self.scale - self.cell_dist), - "h": int(self.size * self.scale - self.cell_dist), - "spr_up": current_frame % self.sprites_refresh, - "sprites": self.sprites, "scale": self.scale, - "screen": screen} - - cell.terrain_obj.draw(dd) - - if cell.item_obj: - cell.item_obj.draw(dd) + 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: - cell.creature_obj.draw(dd) - - if grid: - if cell.is_target: - pygame.draw.rect(screen, self.target_color, pygame.Rect(dd["x"], dd["y"], dd["w"], dd["h"]), self.bord) - else: - pygame.draw.rect(screen, self.color, pygame.Rect(dd["x"], dd["y"], dd["w"], dd["h"]), self.bord) - - def update_map(self, current_frame): + 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]): - if cell.creature_obj is not None and len(cell.creature_obj.waypoints) > 1 and current_frame % 57 == 0: - del cell.creature_obj.waypoints[0] - self.move_obj("creature_obj", (j, i), (cell.creature_obj.waypoints[0])) - + 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) + + + @dataclass class Engine: @@ -251,7 +279,7 @@ class Engine: global_counter = 0 global_counter_cap = 100000 - active_cell = [] + active_cell = None # profiling @@ -305,7 +333,7 @@ class Engine: # fill the screen with a color to wipe away anything from last frame #self.screen.fill("chartreuse4") self.screen.blit(background, (0, 0)) - easy_map.update_map(global_counter) + easy_map.update_map(time_delta) easy_map.draw_map(self.screen, current_frame + 1) manager.draw_ui(self.screen) @@ -330,25 +358,34 @@ class Engine: self.spr_scale -= self.scale_step self.scale_sprites() - if event.type == pygame.MOUSEBUTTONDOWN and event.button == 1: # Левая кнопка + if event.type == pygame.MOUSEBUTTONDOWN and event.button == 1: mouse_pos = pygame.mouse.get_pos() console_rect = console_window.get_abs_rect() if not console_rect.collidepoint(mouse_pos): cell_coords = easy_map.get_cell_at_mouse(mouse_pos) if cell_coords: - if active_cell: - easy_map.cells[active_cell[0]][active_cell[1]].is_target = False - active_cell = cell_coords - easy_map.cells[active_cell[0]][active_cell[1]].is_target = True + # Сбрасываем предыдущую цель + if active_cell is not None: + row, col = active_cell + if row in easy_map.cells and col < len(easy_map.cells[row]): + easy_map.cells[row][col].is_target = False + + active_cell = cell_coords # Теперь кортеж (row, col) + row, col = active_cell + easy_map.cells[row][col].is_target = True if event.type == pygame.MOUSEBUTTONDOWN and event.button == 3: mouse_pos = pygame.mouse.get_pos() - cell_coords = easy_map.get_cell_at_mouse(mouse_pos) console_rect = console_window.get_abs_rect() - if not console_rect.collidepoint(mouse_pos) and easy_map.cells[active_cell[0]][active_cell[1]].creature_obj is not None: - easy_map.cells[active_cell[0]][active_cell[1]].creature_obj.move(easy_map.cells, (active_cell[0], active_cell[1]), (cell_coords[0], cell_coords[1])) - + if (not console_rect.collidepoint(mouse_pos) and + active_cell is not None and + easy_map.cells[active_cell[0]][active_cell[1]].creature_obj is not None): + cell_coords = easy_map.get_cell_at_mouse(mouse_pos) + if cell_coords: + print(f"Движение: {active_cell} -> {cell_coords}") + easy_map.cells[active_cell[0]][active_cell[1]].creature_obj.move( + easy_map.cells, active_cell, cell_coords) if keys[pygame.K_ESCAPE]: running = False @@ -364,6 +401,6 @@ class Engine: if global_counter % 10 == 0: current_fps = clock.get_fps() - print(f"Current FPS: {current_fps:.2f}") + #print(f"Current FPS: {current_fps:.2f}") pygame.quit() \ No newline at end of file diff --git a/eb_objects.py b/eb_objects.py index eaf6527..ef54ad9 100644 --- a/eb_objects.py +++ b/eb_objects.py @@ -36,12 +36,55 @@ class Creature(Object): tasks: list = field(default_factory = list) inventory: dict = field(default_factory = dict) - def update(self): - pass + move_progress: float = 0.0 # 0.0 = старт клетки, 1.0 = конец клетки + current_target: tuple = None # (row, col) следующая клетка + move_speed: float = 0.02 # пикселей/кадр (настройте) + render_offset: tuple = (0.0, 0.0) + start_pos: tuple = None # (row, col) начальная позиция сегмента пути + def move(self, cells, start, goal): from common import find_way - self.waypoints = find_way(cells, start, goal) + self.start_pos = start + path = find_way(cells, start, goal) + if path and len(path) > 1: + self.waypoints = path[1:] # Убираем текущую позицию + self.current_target = self.waypoints[0] + self.move_progress = 0.0 + self.start_pos = start # ★ ТУТ - текущая позиция как стартовая для первого шага ★ + self.render_offset = (0.0, 0.0) + + + def update(self, time_delta, cell_size, map_obj): + if self.current_target is None or not self.waypoints: + self.render_offset = (0.0, 0.0) + return + + self.move_progress += self.move_speed * time_delta * 60 + self.move_progress = min(self.move_progress, 1.0) + + if self.move_progress >= 1.0: + map_obj.move_obj('creature_obj', self.start_pos, self.current_target) + + self.waypoints.pop(0) + if self.waypoints: + self.start_pos = self.current_target # Новая клетка как старт + self.current_target = self.waypoints[0] + self.move_progress = 0.0 + self.render_offset = (0.0, 0.0) # ← ДОБАВИТЬ! + else: + self.current_target = None + self.render_offset = (0.0, 0.0) + return + + # ★ ТОЛЬКО интерполяция offset ★ + start_row, start_col = self.start_pos or (0, 0) + target_row, target_col = self.current_target + offset_x = (target_col - start_col) * cell_size * self.move_progress + offset_y = (target_row - start_row) * cell_size * self.move_progress + self.render_offset = (offset_x, offset_y) + + @dataclass