forked from InfoProjekt/game
		
	 218eb2ea7e
			
		
	
	
		218eb2ea7e
		
	
	
	
	
		
			
			added character collisions (not great yet tho) some simple background elements added and testet WIP
		
			
				
	
	
		
			230 lines
		
	
	
		
			No EOL
		
	
	
		
			8.4 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			230 lines
		
	
	
		
			No EOL
		
	
	
		
			8.4 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
| import pygame
 | |
| 
 | |
| pygame.font.init()
 | |
| fonts = {
 | |
|     'medieval': 'medieval.ttf',
 | |
|     'minecraft': 'Minecraft Evenings.otf',
 | |
|     '3dpixel': '3D-Pixel.ttf',
 | |
|     '8bit': '8bitlim.ttf',
 | |
|     '8bito': '8blimro.ttf',
 | |
|     'arcade': 'ARCADECLASSIC.ttf',
 | |
|     'modern_game': 'astron boy video.otf',
 | |
|     'modern': 'astron boy.otf',
 | |
|     'wonder': 'Beyond Wonderland.ttf',
 | |
|     'curved': 'Digitag.ttf',
 | |
|     'simple': 'DisposableDroidBB.ttf',
 | |
|     'rounded': 'dpcomic.ttf',
 | |
|     'playfull': 'Endalian Script.ttf',
 | |
|     'blocky': 'FREAKSOFNATURE.ttf',
 | |
|     'catchy': 'Future TimeSplitters.otf',
 | |
|     'simple_wide': 'Halo3.ttf',
 | |
|     'simple_fat': 'INVASION2000.ttf',
 | |
|     'very_gamy': 'ka1.ttf',
 | |
|     'simple_round': 'Karma Suture.otf',
 | |
|     'mono': 'manaspc.ttf',
 | |
|     'damaged': 'Merchant Copy.ttf',
 | |
|     'big_natural': 'MorialCitadel.TTF',
 | |
|     'spacy': 'nasalization-rg.otf',
 | |
|     'sci-fi': 'neuropol.otf',
 | |
|     'hollow_big_edge': 'papercut.ttf',
 | |
|     'space_shuttle': 'pdark.ttf',
 | |
|     'thin': 'PixelFJVerdana12pt.ttf',
 | |
|     'random': 'Seattle Avenue.ttf',
 | |
|     'pixel': 'yoster.ttf'
 | |
| }
 | |
| 
 | |
| class Button():
 | |
|     def __init__(self, x, y, width, height, font, font_size, buttonText='Button', onclickFunction=None, onePress=False):
 | |
|         self.font = pygame.font.Font(f'fonts/{fonts[font]}', font_size)
 | |
|         self.x = x
 | |
|         self.y = y
 | |
|         self.width = width
 | |
|         self.height = height
 | |
|         self.onclickFunction = onclickFunction
 | |
|         self.onePress = onePress
 | |
|         self.alreadyPressed = False
 | |
| 
 | |
|         with open('art/images/textbox.png', 'r') as tb:
 | |
|             self.box = pygame.image.load(tb)
 | |
|             self.box = pygame.transform.scale(self.box, (width, height))
 | |
| 
 | |
| 
 | |
|         self.buttonRect = pygame.Rect(self.x, self.y, self.width, self.height)
 | |
| 
 | |
|         self.buttonSurf = self.font.render(buttonText, True, '#baab80')
 | |
| 
 | |
|     def process(self, screen, clock, running, background, isblack, WIDTH, HEIGHT):
 | |
|         mousePos = pygame.mouse.get_pos()
 | |
|         if self.buttonRect.collidepoint(mousePos):
 | |
|             if pygame.mouse.get_pressed(num_buttons=3)[0]:
 | |
|                 if self.onePress:
 | |
|                     self.onclickFunction()
 | |
|                 elif not self.alreadyPressed:
 | |
|                     if 'play' in str(self.onclickFunction):
 | |
|                         self.onclickFunction(screen, clock, running, background, isblack, WIDTH, HEIGHT)
 | |
|                         self.alreadyPressed = True
 | |
|                     else:
 | |
|                         self.onclickFunction()
 | |
|                         self.alreadyPressed = True
 | |
|             else:
 | |
|                 self.alreadyPressed = False
 | |
|         self.box.blit(self.buttonSurf, [
 | |
|             self.buttonRect.width/2 - self.buttonSurf.get_rect().width/2,
 | |
|             self.buttonRect.height/2 - self.buttonSurf.get_rect().height/2
 | |
|         ])
 | |
|         screen.blit(self.box, self.buttonRect)
 | |
| 
 | |
| 
 | |
| class DropDown():
 | |
|     def __init__(self, x, y, width, height, font, font_size, color_menu, color_option, main, options):
 | |
|         self.rect = pygame.Rect(x, y, width, height)
 | |
|         self.font = pygame.font.Font(f'fonts/{fonts[font]}', font_size)
 | |
|         self.main = main
 | |
|         self.options = options
 | |
|         self.draw_menu = False
 | |
|         self.menu_active = False
 | |
|         self.active_option = -1
 | |
| 
 | |
|         with open('art/images/textbox.png', 'r') as tb:
 | |
|             self.box = pygame.image.load(tb)
 | |
|             self.box = pygame.transform.scale(self.box, (width, height))
 | |
| 
 | |
|     def draw(self, screen):
 | |
|         #pygame.draw.rect(screen, self.color_menu[self.menu_active], self.rect, 0)
 | |
|         surface = self.font.render(self.main, 1, (0, 0, 0))
 | |
|         self.box.blit(surface, [
 | |
|             self.rect.width/2 - surface.get_rect().width/2,
 | |
|             self.rect.height/2 - surface.get_rect().height/2
 | |
|         ])
 | |
|         screen.blit(self.box, surface.get_rect(center = self.rect.center))
 | |
| 
 | |
|         if self.draw_menu:
 | |
|             for i, text in enumerate(self.options):
 | |
|                 rect = self.rect.copy()
 | |
|                 rect.y += (i+1) * self.rect.height
 | |
|                 rect.x = self.rect.x
 | |
|                 #pygame.draw.rect(screen, self.color_option[1 if i == self.active_option else 0], rect, 0)
 | |
|                 #msg = self.font.render(text, 1, (0, 0, 0))
 | |
|                 #screen.blit(msg, msg.get_rect(center = rect.center))
 | |
|                 surface = self.font.render(text, 1, (0, 0, 0))
 | |
|                 self.box.blit(surface, [
 | |
|                     rect.width/2 - surface.get_rect().width/2,
 | |
|                     rect.height/2 - surface.get_rect().height/2
 | |
|                 ])
 | |
|                 screen.blit(self.box, rect)
 | |
| 
 | |
|     def update(self, event_list):
 | |
|         mpos = pygame.mouse.get_pos()
 | |
|         self.menu_active = self.rect.collidepoint(mpos)
 | |
|         self.active_option = -1
 | |
|         for i in range(len(self.options)):
 | |
|             rect = self.rect.copy()
 | |
|             rect.y += (i+1) * self.rect.height
 | |
|             if rect.collidepoint(mpos):
 | |
|                 self.active_option = i
 | |
|                 break
 | |
| 
 | |
|         if not self.menu_active and self.active_option == -1:
 | |
|             self.draw_menu = False
 | |
|         #self.draw_menu = True
 | |
|         #return -1
 | |
|         if pygame.mouse.get_pressed(num_buttons=3)[0]:
 | |
|             if self.menu_active:
 | |
|                 self.draw_menu = not self.draw_menu
 | |
|             elif self.draw_menu and self.active_option >= 0:
 | |
|                 self.draw_menu = False
 | |
|                 return self.active_option
 | |
|         return -1
 | |
| 
 | |
| 
 | |
| class GameObjects():
 | |
|     def __init__(self, name:str, _type:str, bg, objects:list, WIDTH, HEIGHT) -> None:
 | |
|         self.name = name
 | |
|         self.type = _type
 | |
|         self.background = bg
 | |
|         if bg != None:
 | |
|             with open(bg, 'r') as bg:
 | |
|                 self.background = pygame.transform.scale(pygame.image.load(bg), [WIDTH, HEIGHT])
 | |
|         self.objects = objects
 | |
| 
 | |
| 
 | |
| class Scene(GameObjects):
 | |
|     def __init__(self, name:str, _type:str, bg, objects:list | None, WIDTH, HEIGHT, level:list) -> None:
 | |
|         super().__init__(name, _type, bg, objects, WIDTH, HEIGHT)
 | |
|         self.level = level
 | |
|         self.current_level = 0
 | |
| 
 | |
|     def update(self, change:bool):
 | |
|         if change:
 | |
|             self.current_level += 1
 | |
|         self.level[self.current_level].update()
 | |
|         if isinstance(self.objects, list):
 | |
|             for obj in self.objects:
 | |
|                 obj.update()
 | |
|         
 | |
|     def draw(self, screen):
 | |
|         if isinstance(self.objects, list):
 | |
|             for obj in self.objects:
 | |
|                 obj.draw(screen)
 | |
|         self.level[self.current_level].draw(screen)
 | |
|         
 | |
| 
 | |
| class Stage(GameObjects):
 | |
|     def __init__(self, name: str, _type: str, bg, objects: list, WIDTH, HEIGHT, stage:str, rooms:list) -> None:
 | |
|         super().__init__(name, _type, bg, objects, WIDTH, HEIGHT)
 | |
|         self.stage = stage
 | |
|         self.rooms = rooms
 | |
|         self.current = 0
 | |
|     
 | |
|     def update(self):
 | |
|         for room in self.rooms:
 | |
|             if room.id == self.current:
 | |
|                 room.update()
 | |
|         keys = pygame.key.get_pressed()
 | |
|         if keys[pygame.K_RIGHT]:
 | |
|             self.current += 1
 | |
|         if self.current >= len(self.rooms):
 | |
|             return 1
 | |
| 
 | |
|     def draw(self, screen):
 | |
|         for room in self.rooms:
 | |
|             if room.id == self.current:
 | |
|                 room.draw(screen)
 | |
| 
 | |
| class Room(GameObjects):
 | |
|     def __init__(self, name:str, _type:str, bg, objects:list, WIDTH, HEIGHT, exits:list, id:int) -> None:
 | |
|         super().__init__(name, _type, bg, objects, WIDTH, HEIGHT)
 | |
|         self.exits = exits
 | |
|         self.id = id
 | |
|         if self.type == 'normal' or self.type == 'boss':
 | |
|             self.locked = True
 | |
|         else:
 | |
|             self.locked = False
 | |
| 
 | |
|         self.objects.append(self.genWalls(WIDTH, HEIGHT))
 | |
|         
 | |
|     def genWalls(self, WIDTH, HEIGHT):
 | |
|         walls = []
 | |
|         walls.append(pygame.Rect(0, 0, 4, HEIGHT))
 | |
|         walls.append(pygame.Rect(WIDTH - 4, 0, 4, HEIGHT))
 | |
|         walls.append(pygame.Rect(0, 0, WIDTH, 4))
 | |
|         walls.append(pygame.Rect(0, HEIGHT - 4, WIDTH, 4))
 | |
|         return walls
 | |
| 
 | |
|     def update(self):
 | |
|         pass
 | |
| 
 | |
|     def draw(self, screen):
 | |
|         screen.blit(self.background, (32, 32))
 | |
|         if isinstance(self.objects, list):
 | |
|             for obj in self.objects[0]:
 | |
|                 obj.draw(screen)
 | |
| 
 | |
| class Obstacle(GameObjects):
 | |
|     def __init__(self, name: str, _type: str, bg, collision: bool, x: int, y: int, hidden: bool=False, objects: list = None, WIDTH=None, HEIGHT=None) -> None:
 | |
|         super().__init__(name, _type, bg, objects, WIDTH, HEIGHT)
 | |
|         self.collision = collision
 | |
|         self.rect = pygame.Rect((x, y), self.background.get_size())
 | |
|     
 | |
|     def draw(self, screen):
 | |
|         screen.blit(self.background, self.rect) |