From b867506b569ced9d48324298dfebd75e2e22395e Mon Sep 17 00:00:00 2001 From: dvorakmortonxd Date: Sun, 31 May 2026 17:55:23 +0200 Subject: [PATCH] made a huge progress on how the game is gonna go (in code, basically level2 finished) --- levels.py | 77 ++++++++++++++++++++++++++++++++++++++++++++++++++-- main.py | 13 +++++---- sprites.png | Bin 5687 -> 6626 bytes sprites.pxo | Bin 7141 -> 8031 bytes 4 files changed, 81 insertions(+), 9 deletions(-) diff --git a/levels.py b/levels.py index 06d538b..7fa7078 100644 --- a/levels.py +++ b/levels.py @@ -1,25 +1,96 @@ import pygame from render import load_sprite # this makes it so our function for rendering sprites from sprites.png is available in here -def level1(screen, sheet, screen_width, screen_height, lastclickpos, basicfont, mouse, click, big_text, level): # the function for our first level, ignore the unused variables here, you can use them when you edit it +def level1(screen, sheet, screen_width, screen_height, lastclickpos, basicfont, mouse, click, big_text, level, tick): # the function for our first level, ignore the unused variables here, you can use them when you edit it screen.blit(load_sprite(sheet, 0, 0, 48, 36, screen_width, screen_height), (0, 0)) # this renders a button I made in the sprites.png, its purely for visual purposes so it doesnt matter where you click rn mainmenu_text = big_text.render("Revival Inc.", True, (0, 0, 0)) playb_collision = pygame.Rect(250, 250, 253, 110) exitb_collision = pygame.Rect(250, 400, 253, 110) if playb_collision.collidepoint(mouse.get_pos()): screen.blit(load_sprite(sheet, 24, 36, 23, 10, 253, 110), (250, 250)) + play_text = basicfont.render("Play", True, (255,255,255)) if click: level = 2 else: screen.blit(load_sprite(sheet, 0, 36, 23, 10, 253, 110), (250, 250)) + play_text = basicfont.render("Play", True, (0,0,0)) + + screen.blit(play_text, (300, 260)) + if exitb_collision.collidepoint(mouse.get_pos()): screen.blit(load_sprite(sheet, 24, 36, 23, 10, 253, 110), (250, 400)) + exit_text = basicfont.render("Exit", True, (255,255,255)) if click: level = 0 else: screen.blit(load_sprite(sheet, 0, 36, 23, 10, 253, 110), (250, 400)) + exit_text = basicfont.render("Exit", True, (0,0,0)) + screen.blit(exit_text, (300, 410)) screen.blit(mainmenu_text, (195, 35)) return level # this returns the change we made to the level so that it updates in main.py -def level2(screen, sheet, lastclickpos, basicfont, mouse, click, level): # function for level 2 - print("ur done") # prints out "ur done" +def level2(screen, sheet, screen_width, screen_height, lastclickpos, basicfont, mouse, click, big_text, level, tick, smalltext): # function for level 2 + screen.blit(load_sprite(sheet, 0, 46, 48, 36, screen_width, screen_height), (0,0)) + screen.blit(load_sprite(sheet, 8, 82, 12, 12, 96, 96) , (645, 214)) # ZOMBIE + screen.blit(load_sprite(sheet, 20, 82, 7, 12, 49,74), (274, 342)) # MILK CARTON + print(tick) + dialog_square = pygame.surface.Surface((700, 68), pygame.SRCALPHA) + dialog_square.fill((0, 0, 0)) + if 60 <= tick <= 400: + if tick < 186: + dialog = basicfont.render("Hey...", True, (0+tick*2-120, 0+tick*2-120, 0+tick*2-120)) + else: + dialog = basicfont.render("Hey...", True, (255, 255, 255)) + dialog_square.blit(load_sprite(sheet, 0, 82, 8, 8, 48, 48), (15, 10)) + dialog_square.blit(dialog, (78, 15)) + screen.blit(dialog_square, (34, 500)) + elif 401 <= tick <= 750: + if tick < 525: + dialog = smalltext.render("ur probably wondering where u are.", True, (0+(tick-401)*2, 0+(tick-401)*2, 0+(tick-401)*2)) + else: + dialog = smalltext.render("ur probably wondering where u are.", True, (255, 255, 255)) + dialog_square.blit(load_sprite(sheet, 0, 82, 8, 8, 48, 48), (15, 10)) + dialog_square.blit(dialog, (78, 15)) + screen.blit(dialog_square, (34, 500)) + elif 751 <= tick <= 1000: + if tick < 876: + dialog = smalltext.render("you are inside the dungeons.", True, (0+(tick-751)*2, 0+(tick-751)*2, 0+(tick-751)*2)) + else: + dialog = smalltext.render("you are inside the dungeons.", True, (255, 255, 255)) + dialog_square.blit(load_sprite(sheet, 0, 82, 8, 8, 48, 48), (15, 10)) + dialog_square.blit(dialog, (78, 15)) + screen.blit(dialog_square, (34, 500)) + elif 1001 <= tick <= 1300: + if tick < 1126: + dialog = smalltext.render("see that milk?", True, (0+(tick-1001)*2, 0+(tick-1001)*2, 0+(tick-1001)*2)) + else: + dialog = smalltext.render("see that milk?", True, (255, 255, 255)) + dialog_square.blit(load_sprite(sheet, 0, 82, 8, 8, 48, 48), (15, 10)) + dialog_square.blit(dialog, (78, 15)) + screen.blit(dialog_square, (34, 500)) + elif 1301 <= tick <= 1600: + if tick < 1426: + dialog = smalltext.render("no its not for drinking", True, (0+(tick-1301)*2, 0+(tick-1301)*2, 0+(tick-1301)*2)) + else: + dialog = smalltext.render("no its not for drinking", True, (255, 255, 255)) + dialog_square.blit(load_sprite(sheet, 0, 82, 8, 8, 48, 48), (15, 10)) + dialog_square.blit(dialog, (78, 15)) + screen.blit(dialog_square, (34, 500)) + elif 1601 <= tick <= 1900: + if tick < 1626: + dialog = smalltext.render("see that dead zombie?", True, (0+(tick-1601)*2, 0+(tick-1601)*2, 0+(tick-1601)*2)) + else: + dialog = smalltext.render("see that dead zombie?", True, (255, 255, 255)) + dialog_square.blit(load_sprite(sheet, 0, 82, 8, 8, 48, 48), (15, 10)) + dialog_square.blit(dialog, (78, 15)) + screen.blit(dialog_square, (34, 500)) + elif 1901 <= tick <= 2200: + if tick < 2026: + dialog = smalltext.render("well guess what", True, (0+(tick-1901)*2, 0+(tick-1901)*2, 0+(tick-1901)*2)) + else: + dialog = smalltext.render("well guess what", True, (255, 255, 255)) + dialog_square.blit(load_sprite(sheet, 0, 82, 8, 8, 48, 48), (15, 10)) + dialog_square.blit(dialog, (78, 15)) + screen.blit(dialog_square, (34, 500)) + elif tick <= 2201: + level = 3 return level # returns the current level set \ No newline at end of file diff --git a/main.py b/main.py index a51e698..725ab16 100644 --- a/main.py +++ b/main.py @@ -7,12 +7,14 @@ def main(fps=window_fps): # the main function pygame.init() # initalizes pygame screen_width = 768 # the screen width screen_height = 576 # the screen height + tick = 0 # for sprites 48x36 title = "Revival Inc." # 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 initalizes 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 - basicfont = pygame.font.SysFont(None, 50) # this sets a basic font for now, we can change this to anything later onvariable + smalltext = pygame.font.Font('Monocraft.ttf', 25) + basicfont = pygame.font.Font('Monocraft.ttf', 50) # this sets a basic font for now, we can change this to anything later onvariable bigtext = pygame.font.Font('Monocraft.ttf', 50) clock = pygame.time.Clock() # this is used to control the fps of the game if you scroll down the code a bit click = False # variable I use to check if u clicked with the mouse when calling level function from levels. @@ -33,18 +35,17 @@ def main(fps=window_fps): # the main function lastclickpos = pygame.mouse.get_pos() # sets the variable to the position you last clicked if event.type == pygame.MOUSEBUTTONUP: # what happens when you release a mouse button click = False # sets the click variable to False so level function in levels.py can see again - if level == 0: running = False elif level == 1: # what happens when the level variable is equal to 1 - level = levels.level1(screen, sheet, screen_width, screen_height, lastclickpos, basicfont, pygame.mouse, click, bigtext, level) # runs the level1 function from levels.py - + level = levels.level1(screen, sheet, screen_width, screen_height, lastclickpos, basicfont, pygame.mouse, click, bigtext, level, tick) # runs the level1 function from levels.py # THE REASON WE CALL IT LIKE THIS INSTEAD OF NORMALLY IS SO WE CAN CHANGE THE LEVEL VARIABLE elif level == 2: # what happens when the level variable is equal to 2 ofc - level = levels.level2(screen, sheet, lastclickpos, basicfont, pygame.mouse, click, level) # runs the level2 function from levels.py - fps_text = basicfont.render(str(int(clock.get_fps())), True, (0, 255, 0)) # defines a thing that renders your fps in the top left corner + tick += 1 + level = levels.level2(screen, sheet, screen_width, screen_height, lastclickpos, basicfont, pygame.mouse, click, bigtext, level, tick, smalltext) # runs the level2 function from levels.py + fps_text = smalltext.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 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 diff --git a/sprites.png b/sprites.png index 6a08f3d3c9d464b2a2ca8bf08a6bbd387889fe89..1d89cfd6987c397afb6c210c72df05fcd3cfbe43 100644 GIT binary patch literal 6626 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 WN9~$iN7mu*J~{OJl&*u>RsRF%43kv= diff --git a/sprites.pxo b/sprites.pxo index 8b03b49de0e0df4fbadca43b96b90d5939364ca7..9ca390b5a052a8f144deed7b0b6860133a95f659 100644 GIT binary patch delta 2879 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 delta 1825 zcmZ8idsGu=77qvkS_E2Mx_}b<*is(^Dgw3$k!sN{E^0N&g7R27CA%Px1tCZt!}fuD z>ej%C5iF1Bp=)*tl9iP5NWySf5h{dPDoI4a;1QUWKn96 zd*|HyyWce?&Byy6OWokLnL_dPrPS8k@~3%u*4Bt4y^;cIYrxYm9rh^ppir2e;`3hn zfK8z6V(#IgrtbLo;74&mf8a$M&GLg!nrhNJ?3df?y^dU-nG6+9oajmJt^U&|1Ao!p z9j@)3HWPz_U)iDeA#zv#MpQjy_e6Jck6T@9IDU>Jk=)7K_ zLZ6}id+H7TYBQ8^ujRcme&Z$ktwBbZC(vnMNd3Oqxlgty?!Ia6Vdszjev5@WdMzz5 z{nO%4Z(TOon@)!Eu1fDoAE$s8OsZRbC1H6=v!_@wqj<7avh3^-KTc68v3g{a>9b3q z#@1gh)Ml2~oQIsCcW~_SQxqV`o+$ z_E1;}MixjWFSd8Nt*19aTI{|S)Bv4mFB~WZg#rh(w!A=_4@ucpIhzSZcggzpclR#E z{uOz;2zQQezwSr*Wx~PJ+rLc?3fU|+QX_zg-@Wre5H*MM5!FliZ2I4Me@?G^J;HpW ztNde0A&A3hdPKt*p)MM(G&xAjS?pNfsVlEYYGBpS5}D14n)p{@;g*;hMNPxc)Au}JNsoU zRW=+*Tr+ReqnrXW*okFp8Aogcn?iY2E^ze<%CVybsIi$=Qt2ShW`kMfHZ_9n)Z^JH zdoM(rPxJ_r^pWdy<{gNK9i7J;oT`c{H%Si2>%#I;^gaD7yUWQhY&kTdkoVy_c0ZtS zlTm5PyV#Sunc;Wr?5p6n?2#^XQFGsrmavacfF-YH+8~hYOc1iP8`^gR?z7)ny_p(@ zUGUQR89kJ)K4qZA2-S?m6iT&VW(~i!mj{kMEjBDox^m5mg@Cs6 zU$rU3xdaSQxUZE}jp>+F=}i|+w2L9P4+~T3P?Z&9WX}cLHzSmILG141e%!!0dAe>3{3oJ|KzrD2oYX-<&{7f$jx{5xk2& zQ@xZzPJBJrisu(y%V*MBKS;f1iV$+#4 z4|h=swEC+CJhy^q#j>zBMUc&TVXXgj!Z9o3BU>OsDyjgN4=MD<;VK-^t!^1y3ITK) zxuF+1-X3)fCySP-Y?m75;Sc%cMLBGX$gupJdDHKYEn(}S$5t!GpD=@^&0!7Fx1+!2 z_?;`&f+qN-v~M4go?_!jsnGh!7j|(O7LAH^GjeaDkhojolW9I0!b^}U%o5{8MJ_`J z2tQXFUI-X&iQOc>#GGAC|@A=X|haw2x;1xCw02?gsiRY}3{5 z?&fe(2t8lW73^4?E@CXM5V7OCOVEDhm1~Wuz83PI2L{`NjXH-s(Wz7$bxt|Nf?ruk zN)ypYsZ1yTqqWPebKN~r%o=v0;q9cQ&1^GqHHCyNwM4PkW?XO35x9) zfI6P_4238P4?ught$TV`P^CHP8rJ zH@&{S)HE+wVr;|M+^+0qE7(Vt-BCsR5eE;fx1Hrh7hrRM@_3+eqcSJZ+astNc<{vm zQkj%wJX%g0eXvGpK1jot{4C6~1DJ^w$HYQuMKBj?nMN0fB7pRz6t za=UI$Z}H=;!D5u^BX)%Quamz)Jb&6ifTa4~e!+VAO${Z;zY%{z3!;ib$+Q0fT?UuH