From 95e5e9f9f3abc62173353c1f2b956e701e2185e0 Mon Sep 17 00:00:00 2001 From: dvorakmortonxd Date: Sun, 31 May 2026 21:50:01 +0200 Subject: [PATCH] made some basic zombie ai and basically finished level 3/4 in the code --- levels.py | 79 ++++++++++++++++++++++++++++++++++++++++++++++++++-- main.py | 4 ++- sprites.png | Bin 6626 -> 6831 bytes sprites.pxo | Bin 8031 -> 8154 bytes 4 files changed, 80 insertions(+), 3 deletions(-) diff --git a/levels.py b/levels.py index b9a0621..7e960f6 100644 --- a/levels.py +++ b/levels.py @@ -1,7 +1,10 @@ -import pygame +import pygame, random from render import load_sprite # this makes it so our function for rendering sprites from sprites.png is available in here milk_pos_x, milk_pos_y = 274, 342 +zombie_dx, zombie_dy = 1, 1 +zombie_x, zombie_y = 645, 214 +zombie_timer = 0 holding_milk = False 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 @@ -109,6 +112,7 @@ def level3(screen, sheet, screen_width, screen_height, lastclickpos, basicfont, milk_collision = pygame.Rect(milk_pos_x-20, milk_pos_y-50, 49, 74) 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 + zombie_collision = pygame.Rect(645,214,96,96) msx, msy = pygame.mouse.get_pos() if milk_collision.collidepoint(mouse.get_pos()): if click: @@ -117,8 +121,79 @@ def level3(screen, sheet, screen_width, screen_height, lastclickpos, basicfont, holding_milk = False if holding_milk: milk_pos_x, milk_pos_y = msx, msy + if zombie_collision.collidepoint(milk_pos_x, milk_pos_y): + level = 4 screen.blit(load_sprite(sheet, 20, 82, 7, 12, 49, 74), (milk_pos_x-20, milk_pos_y-50)) # MILK CARTON - print(milk_collision) dialog_square = pygame.surface.Surface((700, 68), pygame.SRCALPHA) dialog_square.fill((0, 0, 0)) + return level +def level4(screen, sheet, screen_width, screen_height, lastclickpos, basicfont, mouse, click, big_text, level, tick, smalltext): # function for level 2 + global zombie_x, zombie_y, zombie_timer, zombie_dx, zombie_dy + milk_collision = pygame.Rect(milk_pos_x-20, milk_pos_y-50, 49, 74) + screen.blit(load_sprite(sheet, 0, 46, 48, 36, screen_width, screen_height), (0, 0)) + zombie_timer += 1 + if zombie_timer > 60: # change direction every ~1 sec + zombie_dx = random.choice([-2, -1, 1, 2]) + zombie_dy = random.choice([-2, -1, 1, 2]) + zombie_timer = 0 + zombie_x += zombie_dx + zombie_y += zombie_dy + zombie_x = max(0, min(zombie_x, screen_width - 96)) + zombie_y = max(0, min(zombie_y, screen_height - 96)) + screen.blit(load_sprite(sheet, 27, 82, 7, 12, 56, 96), (zombie_x, zombie_y)) # ZOMBIE + dialog_square = pygame.surface.Surface((700, 68), pygame.SRCALPHA) + dialog_square.fill((0, 0, 0)) + + # dialogs here + + if 60 <= tick <= 270: + if tick < 186: + dialog = basicfont.render("see????", True, (0+tick*2-120, 0+tick*2-120, 0+tick*2-120)) + else: + dialog = basicfont.render("see????", 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 271 <= tick <= 500: + if tick < 390: + dialog = smalltext.render("the milk brought him back!", True, (0+(tick-271)*2, 0+(tick-271)*2, 0+(tick-271)*2)) + else: + dialog = smalltext.render("the milk brought him back!", 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 501 <= tick <= 750: + if tick < 626: + dialog = smalltext.render("I mean sure hes a little dumb", True, (0+(tick-501)*2, 0+(tick-501)*2, 0+(tick-501)*2)) + else: + dialog = smalltext.render("I mean sure hes a little dumb", 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("but hes ressurected!!!", True, (0+(tick-751)*2, 0+(tick-751)*2, 0+(tick-751)*2)) + else: + dialog = smalltext.render("but hes ressurected!!!", 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 <= 1250: + if tick < 1126: + dialog = smalltext.render("now you know the basics", True, (0+(tick-1001)*2, 0+(tick-1001)*2, 0+(tick-1001)*2)) + else: + dialog = smalltext.render("now you know the basics", 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 1251 <= tick <= 1500: + if tick < 1376: + dialog = smalltext.render("so go on!", True, (0+(tick-1251)*2, 0+(tick-1251)*2, 0+(tick-1251)*2)) + else: + dialog = smalltext.render("so go on!", 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 > 1500: + level = 5 return level \ No newline at end of file diff --git a/main.py b/main.py index cd05efe..15cf0b5 100644 --- a/main.py +++ b/main.py @@ -52,7 +52,9 @@ def main(fps=window_fps): # the main function level = 3 elif level == 3: level = levels.level3(screen, sheet, screen_width, screen_height, lastclickpos, basicfont, pygame.mouse, click, bigtext, level, tick, smalltext) # runs the level2 function from levels.py - + elif level == 4: + tick += 1 + level = levels.level4(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 diff --git a/sprites.png b/sprites.png index 1d89cfd6987c397afb6c210c72df05fcd3cfbe43..6f57033d0d0aaefbc8c6918261fcf3cabc6c15b0 100644 GIT binary patch delta 3001 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