From a0e8d6a6bac939b9f2df8b3881347a0e7ec42bf7 Mon Sep 17 00:00:00 2001 From: dvorakmortonxd Date: Fri, 12 Jun 2026 08:00:28 +0200 Subject: [PATCH] might aswell add the last changes before I unfinished the jam --- levels.py | 22 ++++++++++++---------- main.py | 36 +++++++++++++++++++++++++++++++++++- sprites.png | Bin 7632 -> 8457 bytes sprites.pxo | Bin 9114 -> 9687 bytes 4 files changed, 47 insertions(+), 11 deletions(-) diff --git a/levels.py b/levels.py index 2334c55..90f8feb 100644 --- a/levels.py +++ b/levels.py @@ -2,6 +2,9 @@ from render import load_sprite # this makes it so our function for rendering spr import pygame tickd = 0 dialognum = 0 +playerx,playery = 596, 245 +oldpx, oldpy = 596, 245 +playerXc, playerYc = 0,0 DIALOGTEXT = "UNDEFINED" def level1(screen, sheet, screen_width, screen_height, lastclickpos, basicfont, mouse, click, big_text, level, tick, slightfont, pygamemixer): # the function for our first level, ignore the unused variables here, you can use them when you edit it global tickd @@ -13,7 +16,7 @@ def level1(screen, sheet, screen_width, screen_height, lastclickpos, basicfont, screen.blit(overlay, (0, 0)) elif tickd > 450: tickd = 0 - mainmenu_text = slightfont.render("THE DESTROYER OF CITIES", True, (210, 210, 210)) + mainmenu_text = slightfont.render("THE LARVAE", True, (210, 210, 210)) playb_collision = pygame.Rect(315, 200, 285, 105) exitb_collision = pygame.Rect(315, 350, 285, 105) if playb_collision.collidepoint(mouse.get_pos()): @@ -38,10 +41,10 @@ def level1(screen, sheet, screen_width, screen_height, lastclickpos, basicfont, screen.blit(load_sprite(sheet, 57, 0, 19, 7, 285, 105), (315, 350)) exit_text = basicfont.render("Exit", True, (255,255,255)) screen.blit(exit_text, (414, 380)) - screen.blit(mainmenu_text, (45, 65)) + screen.blit(mainmenu_text, (255, 65)) return level # this returns the change we made to the level so that it updates in main.py def level2(blip, screen, sheet, screen_width, screen_height, lastclickpos, basicfont, mouse, click, big_text, level, tick, slightfont, pygamemixer): # the function for our first level, ignore the unused variables here, you can use them when you edit it - global tickd, dialognum, DIALOGTEXT + global tickd, dialognum, DIALOGTEXT, playerx, playery if dialognum not in [9, 11]: tickd += 1 else: @@ -106,7 +109,7 @@ def level2(blip, screen, sheet, screen_width, screen_height, lastclickpos, basic if dialognum == 12: DIALOGTEXT = "I'm the parasite..." screen.blit(load_sprite(sheet, 0, 37, 57,36, 912, 576), (0,0)) - screen.blit(load_sprite(sheet,57,40,6,28, 60, 280), (600, 290)) + screen.blit(load_sprite(sheet,57,40,6,28, 60, 280), (playerx, playery)) dialog_square = pygame.surface.Surface((800, 68), pygame.SRCALPHA) dialog_square.fill((0, 0, 0)) screen.blit(dialog_square, (56, 500)) @@ -114,7 +117,7 @@ def level2(blip, screen, sheet, screen_width, screen_height, lastclickpos, basic DIALOGTEXT = "" tickd = 0 screen.blit(load_sprite(sheet, 0, 37, 57,36, 912, 576), (0,0)) - screen.blit(load_sprite(sheet,57,15,8,25, 80, 250), (660, 290)) + screen.blit(load_sprite(sheet,57,40,6,28, 60, 280), (600, 290)) level = 3 dialog = basicfont.render(DIALOGTEXT, True, transparency) if len(DIALOGTEXT) < 16: @@ -136,10 +139,10 @@ def level2(blip, screen, sheet, screen_width, screen_height, lastclickpos, basic return level # returns the current level set def level3(blip, screen, sheet, screen_width, screen_height, lastclickpos, basicfont, mouse, click, big_text, level, tick, slightfont, pygamemixer): # the function for our first level, ignore the unused variables here, you can use them when you edit it - global tickd + global tickd, playerx, playery tickd += 1 screen.blit(load_sprite(sheet, 0, 37, 57, 36, 912, 576), (0, 0)) - screen.blit(load_sprite(sheet,57,15,8,25, 80, 250), (660, 290)) + screen.blit(load_sprite(sheet,57,40,6,28, 60, 280), (playerx, playery)) square = pygame.surface.Surface((812, 476), pygame.SRCALPHA) square.fill((0, 0, 0)) if tickd < 255: @@ -162,8 +165,7 @@ def level3(blip, screen, sheet, screen_width, screen_height, lastclickpos, basic return level def level4(blip, screen, sheet, screen_width, screen_height, lastclickpos, basicfont, mouse, click, big_text, level, tick, slightfont, pygamemixer): # the function for our first level, ignore the unused variables here, you can use them when you edit it - global tickd - tickd += 1 + global tickd,playerx,playery, playerXc, playerYc screen.blit(load_sprite(sheet, 0, 37, 57, 36, 912, 576), (0, 0)) - screen.blit(load_sprite(sheet,57,15,8,25, 80, 250), (660, 290)) + screen.blit(load_sprite(sheet,57,40,6,28, 60, 280), (playerx, playery)) return level \ No newline at end of file diff --git a/main.py b/main.py index 05634e0..d29fd6f 100644 --- a/main.py +++ b/main.py @@ -13,7 +13,7 @@ def main(fps=window_fps): # the main function screen_width = 912 # the screen width screen_height = 576 # the screen height # THE SCREEN IS 19:12 RATIO - title = "The Destroyer of Cities" # the title of the window obviously + title = "The Larvae" # the title of the window obviously lastclickpos = [0, 0] # last position that was clicked, this changes every time you click somewhere on the game window screen = pygame.display.set_mode((screen_width, screen_height)) # this initializes the display with the screen_width and screen_height variables pygame.display.set_caption(title) # this actually sets the title of the window from the title variable @@ -28,6 +28,7 @@ def main(fps=window_fps): # the main function level = 1 # the level variable, this also gets changed during the "gameplay" running = True # this variable starts the game loop while running: # game loop + levels.oldpx, levels.oldpy = levels.playerx, levels.playery screen.fill((0, 0, 0)) # fills the screen with black, so the sprites loaded previously dont overlap and this clears the last frame every "tick" for event in pygame.event.get(): # this checks for stuff like key presses and mouse clicks if event.type == pygame.QUIT: # what happens when you click the X button on the window @@ -41,6 +42,17 @@ def main(fps=window_fps): # the main function if level == 3: tickd = 0 level = 4 + + if level > 3: + if event.key == pygame.K_w: + levels.playerYc = -3 + if event.key == pygame.K_a: + levels.playerXc = -3 + if event.key == pygame.K_s: + levels.playerYc = +3 + if event.key == pygame.K_d: + levels.playerXc = +3 + if event.key == pygame.K_h: if levels.dialognum == 9: levels.tickd = 0 @@ -49,6 +61,16 @@ def main(fps=window_fps): # the main function if levels.dialognum == 11: levels.tickd = 0 levels.dialognum = 12 + if event.type == pygame.KEYUP: + if level > 3: + if event.key == pygame.K_w: + playerYc = 0 + if event.key == pygame.K_a: + playerXc = 0 + if event.key == pygame.K_s: + playerYc = 0 + if event.key == pygame.K_d: + playerXc = 0 if event.type == pygame.MOUSEBUTTONDOWN: # what happens when you press down a mouse button click = True # sets the click variable to True so level function in levels.py can see print(pygame.mouse.get_pos()) # prints out where the mouse is during the click for debugging purposes @@ -67,6 +89,18 @@ def main(fps=window_fps): # the main function level = levels.level4(blip, screen, sheet, screen_width, screen_height, lastclickpos, basicfont, pygame.mouse, click, bigfont, level, tick, slightly_smaller_than_bigfont, pygame.mixer.music) fps_text = sysfont.render(str(int(clock.get_fps())), True, (0, 255, 0)) # defines a thing that renders your fps in the top left corner #screen.blit(fps_text, (5, 5)) # this actually renders "ftp_text" on the screen at the position (5, 5) which is the top left corner + if 180 > levels.playerx: + levels.playerx = 180 + if 615 < levels.playerx: + levels.playerx = 615 + if 165 > levels.playery: + levels.playery = 165 + if 275 < levels.playery: + levels.playery = 275 + levels.playerx += levels.playerXc + levels.playery += levels.playerYc + + pygame.display.flip() # this updates the display so it displays all the new stuff we added clock.tick(fps) # this makes sure the game loop runs at the fps we set it to before pygame.quit() #this quits our game when the game loop somehow ends, for example by pressing escape or the X button on the window diff --git a/sprites.png b/sprites.png index 36c8befb24743671b16f22410cf8d0165ecb85af..feb4287443fe16298ffdc96c54100cc3215651fa 100644 GIT binary patch literal 8457 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 e{I6{O|JiXz?dy~rso7}+-d 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 }hcU>9li-}D=cDZw7a_nl?j;4gP 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

e2FXhT;{+ItOQ<)ej3y06ATRb5s8y zS48g#Rwu9&$618u1+F)AgBf(X+o-(#TrBIW(&aS4MYL8P6DnIfYz$**b%6s89D$%-ncwtKRy~-@lgPbTG(4x+YcVcgM*XJ)xIGCfXzR*_Rf8P=Kj=*;Wz9aA* zf$s=>N8mdG-x2tZz;^`x`w^(Z_a#^=Rz#ScfDm2%-*51Lg@sjn{(bkrHQ}sw#p+hE z*{}v>Ls|t-@e*fB#^sU&pdmR+bzlgP< zHvMzw!?#l3Zg}|G3wly4h5yg?hi?VH{owh(f+pxri~r>LSC79{^et%rtH}J9|E%a6 Y2<@%sC|<{5=Ai!_sK;keF%0H^00|yvxc~qF literal 9114 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 A+W-In