From 687eb842eec44f03f05ffa9276e50f7330cfc07e Mon Sep 17 00:00:00 2001 From: Skullheadx <94652084+Skullheadx@users.noreply.github.com> Date: Sat, 9 Jul 2022 01:56:28 -0400 Subject: [PATCH] Created level editor --- Actors.py | 4 +- Assets/world/blocks/NONE.png | Bin 0 -> 4678 bytes LevelCreator.py | 341 +++++++++++++++++++++++++++++++++++ Levels/Level1.txt | 1 + Levels/Level2.txt | 1 + Player.py | 3 - main.py | 31 ++-- 7 files changed, 361 insertions(+), 20 deletions(-) create mode 100644 Assets/world/blocks/NONE.png create mode 100644 LevelCreator.py create mode 100644 Levels/Level1.txt create mode 100644 Levels/Level2.txt diff --git a/Actors.py b/Actors.py index 8468580..59e5e0b 100644 --- a/Actors.py +++ b/Actors.py @@ -6,10 +6,10 @@ from Block import Block class Actor: width, height = 50, 100 colour = (76, 82, 92) - speed = 0.2 + speed = 0.5 jump_strength = 1 gravity = 0.098 - friction = 0.9 + friction = 0.2 def __init__(self, pos, collision_layer, collision_mask): self.position = pg.Vector2(pos) diff --git a/Assets/world/blocks/NONE.png b/Assets/world/blocks/NONE.png new file mode 100644 index 0000000000000000000000000000000000000000..835725e168400a48ff39496d9d4875354f5e94ff GIT binary patch literal 4678 zcmeAS@N?(olHy`uVBq!ia0y~yU=RRd4mJh`2Kmqb6B!tozEy=plmsP~D-;yvr)B1( zDwI?fq$;FVWTr7NRNQ(yJ-6tN0#Doj;x0KxPma#V2?oY{9sBQ#|GD@^ZD!iCpOFAM@9Uuro*B zz7^W`SK{|pA$z;Tvc-injqdiPpZ|Vx!rpZsl+Wy*;POT1C5OYa_T~_uoUg21n?qM{ z{ZgrMYig;PviyhIst-O-=Ur6)q^>cEzp~+h;mn_M_ERR;&H1w-=+CjuTW)`DzVoE) z6k@3f0N@<;E4X=lgKR4{C1ij6tiH9p?br-ef04iEL?1nhjO0k3G~0FyL(8#H_gz9YTc2kai3(hqns%Hi z`wpM*>`Rf+iK3rbbOSjp#Ue36LW1r~32@MWsRJ>*`GL#nl^x{Eq;)#u!70gUQ zPx~}1J5vr6&fE8~@8YG@r_Mdb+zKH^+omxGu&%D$u&_?YGHb=EjG(J)maTKmo;GLG zvpKrw53ipUVYD?TE$`^6ZuRi>1<56)meJs>^uIQ?0Jey>mMBx-)V5MmK{Vmy|dlUzvAo9+{=qv zTr=_x&%B~>qb@h(+bLGlxgzzSwO_qY{;}%O=?loPKK%q+oy~*#GasbAE1lG)|I9RF zU|?*?baoE#basa200xGNIkgjQJq|m_9F4#16{@9FCQx`HV6IL_mxY&Tcf!IgqEV#= zJHK$xGEvdg>ubtBc(DKIs^;#^>-g3+Dg0o3^y0~q7fP!C^fkA1e0;D&{{1`KclQ{b z79R>RHeg&aD|N{uL&Mq8qRs0$7O^w77$_J9`!5kU{vZ?o{lmwvdZ#w;Ise!4*OWac z8RmP~94|SnbWdU4%`GM8ejiB;niFiHlPwT=x+a^7;IxBc&V++e90ma2_Mp_#L zmWC=Hb?N$+EcY+*_lpi<;HsXMd|v6mX?* z7iAWdWaj57fXqxx$}cUkRZ`+oP*8vxUXfei>kBtNuNWE%$@#hZ6^RA-9N6XP^XL*pb}!<1wbT@#}u16@mtq zq~yeuBuh&qqdfD9OA_;vQ$a>mq)ZEy_z`)4F%*e#Vz#O3{EVZaOGd~Yx zs-c0NkqKA^6fsu*MVYC2C5fPvYO7=j7O%)HuyQU+O)SYT3dzsUu~h;&O2J6a&;Xpk z6>K2U;*nWgl3!G52Ts%AoD-Z{2;o68K~5%EN;R}oROH9 zo|8W`owo2}qxdmX~C}=&pI&os)%E$9Z1$ zbp{3oSx* 0: + current_frame_zoom *= 1.25 + self.zoom *= 1.25 + if event.type == pg.KEYUP: + if event.key in [pg.K_a, pg.K_s, pg.K_LEFT, pg.K_DOWN]: + self.current_texture = (self.current_texture - 1) % len(self.textures) + elif event.key in [pg.K_d, pg.K_w, pg.K_RIGHT, pg.K_UP]: + self.current_texture = (self.current_texture + 1) % len(self.textures) + + mouse_pressed = pg.mouse.get_pressed(3) + if mouse_pressed[0]: + mouse_rel = pg.mouse.get_rel() + self.total_offset += pg.Vector2(mouse_rel[0] / self.zoom, mouse_rel[1] / self.zoom) + if mouse_pressed[2]: + self.add_block(pg.mouse.get_pos(), self.blocks[self.collision_layer], self.textures[self.current_texture], + self.current_layer) + + self.translation_matrix = np.array([[1, 0, self.total_offset.x], + [0, 1, self.total_offset.y], + [0, 0, 1]]) + self.translation_back_matrix = np.array([[1, 0, -self.total_offset.x], + [0, 1, -self.total_offset.y], + [0, 0, 1]]) + + self.calculate_transformations(current_frame_zoom) + + self.grid.update(delta, self.world_transform, self.inv_world_transform, self.total_offset, self.zoom) + + for mask in self.blocks.values(): + for layer in mask: + for block in layer: + block.update(delta, self.world_transform, self.total_offset) + + prev_x = 0 + for button in self.buttons: + button.update(delta, dx=prev_x) + prev_x += button.width + 10 + + def get_canvas_layers(self): + out = [[] for _ in range(self.canvas_layers)] + for mask in self.blocks.values(): + for i, layer in enumerate(mask): + out[i] += layer + return out + + def draw(self, surf): + surf.fill((0, 0, 0)) + if self.show_grid: + self.grid.draw(surf) + + for i, layer in enumerate(self.get_canvas_layers()): + if i <= self.current_layer: + for block in layer: + block.draw(surf) + if self.show_hitboxes: + block.show_hitbox(surf, self.blocks["world"]) + + display_img = EditorBlock.textures[self.textures[self.current_texture]].copy() + display_img.set_alpha(100) + surf.blit(pg.transform.scale(display_img, self.apply_rect_transformations(display_img.get_rect()).size), + self.apply_transformations(self.fit_to_grid(pygame.mouse.get_pos()))) + for button in self.buttons: + button.draw(surf) + + +class Grid: + thickness = 2 + colour = (100, 100, 100) + + def __init__(self): + self.zoom = 1 + self.world_transform = np.identity(3) + self.inv_world_transform = np.linalg.inv(self.world_transform) + self.total_offset = pg.Vector2(0, 0) + self.translation_matrix = np.array([[1, 0, self.total_offset.x], + [0, 1, self.total_offset.y], + [0, 0, 1]]) + self.translation_back_matrix = np.array([[1, 0, -self.total_offset.x], + [0, 1, -self.total_offset.y], + [0, 0, 1]]) + + def update(self, delta, world_transform, inv_world_transform, total_offset, zoom): + self.zoom = zoom + self.world_transform = world_transform + self.inv_world_transform = inv_world_transform + self.total_offset = total_offset + self.translation_matrix = np.array([[1, 0, self.total_offset.x], + [0, 1, self.total_offset.y], + [0, 0, 1]]) + self.translation_back_matrix = np.array([[1, 0, -self.total_offset.x], + [0, 1, -self.total_offset.y], + [0, 0, 1]]) + + def apply_transformations(self, pt): + point = pg.Vector2(pt) + point = np.array([point.x, point.y, 1]) + return pg.Vector2(tuple((self.world_transform @ self.translation_matrix @ point)[0:2])) + + def reverse_transformations(self, pt): + point = pg.Vector2(pt) + point = np.array([point.x, point.y, 1]) + return pg.Vector2(tuple((self.translation_back_matrix @ self.inv_world_transform @ point)[0:2])) + + def draw(self, surf): + start = self.reverse_transformations((0, 0)) + end = self.reverse_transformations(dimensions) + + start = pg.Vector2(start.x // EditorBlock.width, start.y // EditorBlock.width) + end = pg.Vector2(end.x // EditorBlock.height, end.y // EditorBlock.height) + + for i in range(math.floor(start.x), math.floor(end.x) + 1): + pg.draw.line(surf, self.colour, + self.apply_transformations((i * EditorBlock.width, start.y * EditorBlock.height)), + self.apply_transformations((i * EditorBlock.width, (end.y + 1) * EditorBlock.height)), + math.ceil(self.thickness * self.zoom)) + for i in range(math.floor(start.y), math.floor(end.y) + 1): + pg.draw.line(surf, self.colour, + self.apply_transformations((start.x * EditorBlock.width, i * EditorBlock.height)), + self.apply_transformations(((end.x + 1) * EditorBlock.width, i * EditorBlock.height)), + math.ceil(self.thickness * self.zoom)) + + +class EditorBlock: + textures = {file[:file.index(".")]: pg.transform.scale( + pg.image.load(path.join("Assets/world/blocks", file)), (50, 50)) for + file in listdir("Assets/world/blocks")} + width, height = textures["PLACEHOLDER"].get_size() + + def __init__(self, pos, collision_layer, texture="PLACEHOLDER"): + self.position = pg.Vector2(pos) + self.texture = self.textures[texture] + + self.collision_layer = collision_layer + + self.world_transform = np.identity(3) + self.total_offset = pg.Vector2(0, 0) + self.translation_matrix = np.array([[1, 0, self.total_offset.x], + [0, 1, self.total_offset.y], + [0, 0, 1]]) + + def update(self, delta, world_transform, total_offset): + self.world_transform = world_transform + self.total_offset = total_offset + self.translation_matrix = np.array([[1, 0, self.total_offset.x], + [0, 1, self.total_offset.y], + [0, 0, 1]]) + + def apply_transformations(self, rect): + top_left = np.array([rect.left, rect.top, 1]) + bottom_right = np.array([rect.right, rect.bottom, 1]) + + top_left = pg.Vector2(tuple((self.world_transform @ self.translation_matrix @ top_left)[0:2])) + bottom_right = pg.Vector2(tuple((self.world_transform @ self.translation_matrix @ bottom_right)[0:2])) + + return pg.Rect(top_left, bottom_right - top_left) + + def get_display_rect(self): + return self.apply_transformations(pg.Rect(self.position, (self.width, self.height))) + + def draw(self, surf): + display_rect = self.get_display_rect() + surf.blit(pg.transform.scale(self.texture, display_rect.size), display_rect) + + def show_hitbox(self, surf, collision_layer): + if collision_layer == self.collision_layer: + pg.draw.rect(surf, (255, 0, 0), self.get_display_rect(), 3) + + +class Button: + + def __init__(self, pos, msg, func): + self.position = pg.Vector2(pos) + self.text, self.rect = createText(self.position.x * 2, self.position.y, 20, (200, 200, 200), "Regular", msg) + self.width, self.height = self.text.get_size() + self.func = func + self.msg = msg + self.cooldown = 500 + + def upd_text(self, pos, msg): + self.position = pg.Vector2(pos) + self.text, self.rect = createText(self.position.x * 2, self.position.y, 20, (200, 200, 200), "Regular", msg) + self.width, self.height = self.text.get_size() + self.msg = msg + + def update(self, delta, dx): + self.upd_text((dx, self.position.y), self.msg) + mouse_pos = pg.mouse.get_pos() + if self.cooldown == 0: + if pg.mouse.get_pressed(3)[0]: + if (self.position.x <= mouse_pos[0] <= self.position.x + self.width and + self.position.y <= mouse_pos[1] <= self.position.y + self.height): + self.func() + self.cooldown = 500 + self.cooldown = max(self.cooldown - delta, 0) + + def draw(self, surf): + pg.draw.rect(surf, (80, 80, 80), pg.Rect(self.position, self.text.get_size()), border_radius=3) + pg.draw.rect(surf, (120, 120, 120), pg.Rect(self.position, self.text.get_size()), 1, border_radius=3) + surf.blit(self.text, self.rect) diff --git a/Levels/Level1.txt b/Levels/Level1.txt new file mode 100644 index 0000000..934467b --- /dev/null +++ b/Levels/Level1.txt @@ -0,0 +1 @@ +[[, , , , , , , , , , , , , , , , , ], [], [], [], []] \ No newline at end of file diff --git a/Levels/Level2.txt b/Levels/Level2.txt new file mode 100644 index 0000000..d022992 --- /dev/null +++ b/Levels/Level2.txt @@ -0,0 +1 @@ +[[, , , , , , , , , , , , , , , , , , , ], [], [], [], []] \ No newline at end of file diff --git a/Player.py b/Player.py index fc44fc5..7da81c6 100644 --- a/Player.py +++ b/Player.py @@ -20,10 +20,7 @@ class Player(Actor): width, height = idle_frames[0].get_size() colour = (52, 94, 235) - speed = 0.2 jump_strength = 0.9 - gravity = 0.098 - friction = 0.7 def __init__(self, pos, collision_layer, collision_mask, can_hurt): super().__init__(pos, collision_layer, collision_mask) diff --git a/main.py b/main.py index 7f5847f..bbebc13 100644 --- a/main.py +++ b/main.py @@ -1,13 +1,14 @@ from Setup import * from Game import Game from Test import Test +from LevelCreator import LevelCreator from MainMenu import Menu delta = 1000//fps is_running = True # scene = Menu() -scene = Game() +scene = LevelCreator() old_level = 0 level = 1 @@ -15,20 +16,20 @@ while is_running: if pg.event.peek(pg.QUIT): is_running = False - if level <= 1: - level = scene.level - - if level == -1: - level = old_level - old_level = 0 - - if old_level != level: - match level: - case 0: - scene = Menu() - case 1: - scene = Game() - old_level = level + # if level <= 1: + # level = scene.level + # + # if level == -1: + # level = old_level + # old_level = 0 + # + # if old_level != level: + # match level: + # case 0: + # scene = Menu() + # case 1: + # scene = Game() + # old_level = level scene.update(delta) scene.draw(screen) -- 2.54.0