From d596101bd252f1428257d9aa0287904454901fe5 Mon Sep 17 00:00:00 2001 From: shiva404 Date: Sat, 14 Feb 2026 00:57:26 +0300 Subject: [PATCH] Add grid drawing, scaling, camera movements --- __pycache__/eb_engine.cpython-314.pyc | Bin 5622 -> 7071 bytes eb_engine.py | 58 ++++++++++++++++---------- main.py | 6 +-- 3 files changed, 40 insertions(+), 24 deletions(-) diff --git a/__pycache__/eb_engine.cpython-314.pyc b/__pycache__/eb_engine.cpython-314.pyc index b004bc4f771ac46b0e8e63dbc9e1adc1dc14843c..9ac088680ad239fb8c42b8009977d6f5ec182137 100644 GIT binary patch literal 7071 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 GTKo^c4+JIv delta 2743 zcmb_eU2Ggz6}~fj=V$-_e`9;?xK6Uk+O88PX-R`prE#&-xXY;7Mat6EW_KKKyIF7U zj7eN1Y~Z0uF-gNMYATSDK16C!ffpnS5)X(M`T!Ct)aH_xN+9uoREI{}ipmC4H4N$T#D)vZyU7-X2dE6o-t1K&i@CaYf- zl$i}%Py?`_32K?`IiXq&W||%0JHNo1wZ=kwfeGn~kd|P-^@=IH&N>b)y!9Se#8~5V z)w5ia_dm@-cz_olHioB!VQLKntdM(p=!XBAe@)N)PS4y*y;uJ6xgVT+Kl;A?;poh- zr$5rm4?vCZmUK&D85~W>&-z#nM(>i@f|q|oKB5l5jD`5mj zZe#)e`6`^c;Unq3mFd4zNvTMiVIoQ2B#u)@m#3t?%Q4%NA`8S&3<=UC+0;#(;jvXn zmS#{VS)McXZlf1la8Af}s(dm&uM+7v%LwD7OgeZsN2=RNE0faJ;?9>x=zv7|I34oS z$(~VH;pgaxr0}oPw5E=MJIMc~cw%f1*p-zkhSd?sa?hlQk?Ki=Ow|bKYW!oGR5U{_ z=6F7l(xFHdxSGbZNQ&9ypp@PqEXuz>Y7h~nf}=(Sp_)3R$d5rAxrZO!6NmHiy_SIBxIv+CvV zs72+WN|HIgrd~XLUm?j6D1==j*Tb7p6572M9Qv1qwenv2}lM@_gYv__(HdYo!-&$W!O4{sDSxiAc z>3g02F_L)TA=!R_Fu;d~6abF`Cz*@7(83#`6$_$d1V>=bl{KG|M`eFz1FlL&Y| zJAhC`7zJ=U?2voEaa=`+;Z6d;X|ad0Um4lVd6eV^0dTu(oc}VkU)sa}7Mce-JR2@7 zS59;wcCPHiiwfm(t7*>*b>3`Un77#!Xh1nZnX!7UyI>U*x164Xb#?{;HP|eGg=umq z$h{vvLWECsEdRsVYKvDGlZ^)SovKqPx42EKrAx0}|G z40*Cw5?!gfee)Nkt%l2!Dn;JqwMY>9cY^lGB|m>VvXAGyDgHqu=*R3jQi>pXOL2ZF znoD&(hNnwkBweMtqmbaE(KPQy3$!ekvY)lyZ*8e)Pyc ziE6`ISt}tseo7v(806X5xHQbCV*@hW{9Canfdh0HeGr?_hR}UkkO-_qOpe)=l>emv{JI|md0tL2vy z8GN>rro$LEHBZW((oz2HWdD#>L^kM2S2-n}{vmlZ+E4H^kpb1v;g`V6KS}=9aC+&5 zDdBI-*O|@CMa!IQ6`^`se}z(+E%ZBmB9ty`b?n}+E>f4!nk}o_t}hAQGVR*Mg{H~e z%H~@7xOot+Am|s*PQTzVWLtP%HkX9|0;qPGX<24dcuvwEQC74R>V;gtlF)v zpmwYAvY?k1TXv6)g>KfZrP{@Mm&N!m(wRLzyoAZH!`M0JR5;0UN!MXqhje)=GnjXH z;0<`&3VE0yiS+AVyL08k_~TdgdwTF{eU(3#ndY}M9p#};5;@+N9bC@68Td}%j_1z# zyZRp@`@S1k569n_dUNLH%vw1A`*40e^8Z%=whzW{%wC&a3*`AIj2kHz_8oc$Y&&oOiW diff --git a/eb_engine.py b/eb_engine.py index c705e22..76bbee8 100644 --- a/eb_engine.py +++ b/eb_engine.py @@ -12,38 +12,47 @@ class Cell: #creature_obj: any is_target: bool = False - def draw(self, screen, bord_color, x, y, size, bord_size): - pygame.draw.rect(screen, bord_color, pygame.Rect(x, y, size, size), bord_size) - +@dataclass class Map: - def __init__(self, name, cell_color = "gray57", active_cell_color = "gray57"): - self.name = name + name: str + cells: dict = None + color: str = "gray57" + target_color: str = "gold" + size: int = 150 + bord: int = 5 + scale: float = 1 + cam_x: int = 0 + cam_y: int = 0 + cell_dist: int = 2 + + def __post_init__(self): self.cells = {} with open(self.name, 'r') as file: buff = json.load(file) - for line in range(len(buff)): self.cells[line] = [] for cell in buff[str(line)]: final_cell = Cell(cell_classes[cell["type"]](**cell["cell"]["terrain_obj"])) self.cells[line].append(deepcopy(final_cell)) - self.cell_color = cell_color - - def draw(self, scale_size): - for line in range(len(self.cells)): - for cell in line: - pass + def draw(self, screen): + for l in range(len(self.cells)): + for i, cell in enumerate(self.cells[l]): + x = int((i * self.size + self.cam_x) * self.scale) + y = int((l * 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) + pygame.draw.rect(screen, self.color, pygame.Rect(x, y, w, h), self.bord) + class Engine: def __init__(self, width, height, scale_size = 5, camera_pos = pygame.Vector2(0, 0)): self.width = width self.height = height self.scale_size = scale_size - self.camera_pos = camera_pos - def main_loop(self): + def main_loop(self): ''' #o = eb_terrain.Ground(1, 1, 1) #c = eb_creatures.Unit(1, 1, 1) @@ -52,8 +61,7 @@ class Engine: #print(isinstance(c, eb_objects.Terrain)) ''' - easy_map = Map("def_map.json", "gray57") - print(1) + easy_map = Map("def_map.json") # pygame setup pygame.init() @@ -61,6 +69,8 @@ class Engine: clock = pygame.time.Clock() running = True dt = 0 + camera_step = 10 + scale_step = 0.1 player_pos = pygame.Vector2(screen.get_width() / 2, screen.get_height() / 2) @@ -74,19 +84,24 @@ class Engine: # fill the screen with a color to wipe away anything from last frame screen.fill("chartreuse4") - #pygame.draw.circle(screen, "gray57", player_pos, 40) + easy_map.draw(screen) keys = pygame.key.get_pressed() if keys[pygame.K_w]: - player_pos.y -= 300 * dt + easy_map.cam_y -= camera_step if keys[pygame.K_s]: - player_pos.y += 300 * dt + easy_map.cam_y += camera_step if keys[pygame.K_a]: - player_pos.x -= 300 * dt + easy_map.cam_x -= camera_step if keys[pygame.K_d]: - player_pos.x += 300 * dt + easy_map.cam_x += camera_step + if keys[pygame.K_q]: + easy_map.scale += scale_step + if keys[pygame.K_e]: + easy_map.scale -= scale_step # flip() the display to put your work on screen + #pygame.time.wait(20) pygame.display.flip() # limits FPS to 60 @@ -94,4 +109,5 @@ class Engine: # independent physics. dt = clock.tick(60) / 1000 + pygame.quit() \ No newline at end of file diff --git a/main.py b/main.py index 47b345d..b5846a4 100644 --- a/main.py +++ b/main.py @@ -1,13 +1,13 @@ import eb_engine def main(): - e = eb_engine.Engine(1280, 720) + e = eb_engine.Engine(1600, 900) e.main_loop() if __name__ == "__main__": # pydantic instead of dataclasses? - # Отрисовка голой сетки, прокрутка - # Отрисовка спрайтов, масштаб + # Отрисовка голой сетки, прокрутка, масштаб + + # Отрисовка спрайтов # Начало гуя - кнопка, строка ввода, клик # Поиск пути # Редактор карты