def __init__(self): """Initialize all variables needed to run the game. """ pygame.mixer.pre_init(44100, -16, 2, 2048) pygame.mixer.init() pygame.init() self.screen = pygame.display.set_mode((W_SIZE, H_SIZE), 0, 32) pygame.display.set_caption("Flashlight 0.1") pygame.font.init() music_url = resource_path('assets/sound/Keep Searching.mp3') self.music = True pygame.mixer.music.load(music_url) pygame.mixer.music.play(loops=-1) self.sfx = True self.clock = pygame.time.Clock() background_url = resource_path('assets/imgs/menu_background.jpg') self.menu_background = pygame.image.load(background_url).convert() self.grid_size = 40 self.bound = W_SIZE / self.grid_size, H_SIZE / self.grid_size self.state = None self.game = None self.editor = None self.delete_field = None self.change_delete_menu = False self.level = Level() self.level_list = self.level.get_all_levels()
def __init__(self, level, bound, sfx): """Initialize all variables, pygame surfaces and menus.""" self.level = Level(name=level) self.player = Player(self.level.get_start_tuple()) background_url = resource_path('assets/imgs/asphalt.jpg') self.background = pygame.image.load(background_url).convert() mask_url = resource_path('assets/imgs/mask.png') self.mask = pygame.image.load(mask_url).convert_alpha() letter_t_url = resource_path('assets/imgs/letter_t.png') self.letter_t = pygame.image.load(letter_t_url).convert_alpha() self.bound = bound self.sfx = sfx self._sound_library = {} self.goal_reached = False self.done = False self.direction_pressed = 0 # ------------------------------------------------------------------------- # Create Theme: # ------------------------------------------------------------------------- pause_theme = pygame_menu.themes.THEME_DARK.copy() pause_theme.background_color = (20, 20, 20, 255) self.pause_menu = pygame_menu.Menu(300, 400, 'Pause', theme=pause_theme) self.pause_menu.add_button('Continue', self.cont) self.pause_menu.add_vertical_margin(30) self.pause_menu.add_button('Main Menu', self.main_menu) self.pause_menu.toggle()
def __init__(self, grid_size): """Initialize all variables, pygame surfaces and menus.""" self.grid_size = grid_size background_url = resource_path('assets/imgs/asphalt.jpg') self.background = pygame.image.load(background_url).convert() # ------------------------------------------------------------------------- # Create Theme: # ------------------------------------------------------------------------- pause_theme = pygame_menu.themes.THEME_DARK.copy() pause_theme.background_color=(20, 20, 20, 255) # ------------------------------------------------------------------------- # Create Menu: Pause Menu # ------------------------------------------------------------------------- self.pause_menu = pygame_menu.Menu(300, 400, 'Pause', theme=pause_theme) self.pause_menu.add_text_input('Name: ', onchange=self.store, maxchar=15, align=pygame_menu.locals.ALIGN_LEFT) self.pause_menu.add_button('Save', self.save) self.pause_menu.add_vertical_margin(30) self.pause_menu.add_button('Main Menu', self.main_menu) self.pause_menu.toggle() # ------------------------------------------------------------------------- # Create Menu: Prompt # ------------------------------------------------------------------------- self.prompt = pygame_menu.Menu(300, 400, 'Pause', theme=pygame_menu.themes.THEME_ORANGE) self.prompt.add_label('You need to at least') self.prompt.add_label('place a start and a goal!') self.prompt.add_button('Back', self.prompt.toggle) self.prompt.toggle() self.stored_name = '' self.new_level = None self.done = False self.level = Level() self.mouse_pos = (0,0) self.mouse_pressed = False self.d_pressed = False self.active = 1 self.current_tile = Start(self.mouse_pos) self.first_placed = None occupied_url = resource_path('assets/imgs/red_cross.png') self.occupied_tile = pygame.image.load(occupied_url).convert_alpha() delete_url = resource_path('assets/imgs/delete_mask.png') self.delete_mask = pygame.image.load(delete_url).convert_alpha() self.moved_after_place = True
def activate(self): if self.pressed: return False else: self.pressed = True surf_url = resource_path('assets/imgs/green_button.png') self.surf = pygame.image.load(surf_url).convert_alpha() return True
def save(self, name): for obj in self.boxes_list.values(): obj.del_surf() folder = resource_path(os.path.join("assets/levels", name)) if not os.path.exists(folder): os.mkdir(folder) file = os.path.join(folder, name + '.pkl') with open(file, 'wb') as output: pickle.dump([self.get_objects()], output, protocol=pickle.HIGHEST_PROTOCOL) else: print('level already exists!')
def load_map(self, name): folder = resource_path(os.path.join("assets/levels", name)) if os.path.exists(folder): file = os.path.join(folder, name + '.pkl') with open(file, 'rb') as input: data = pickle.load(input) self.boxes_list, = data for obj in self.boxes_list.values(): obj.add_surf() else: print('level does not exist')
def play_sound(self, path): """If not already done, initialize a sound and then play it.""" path = os.path.join('assets/sound/SFX/', path) path = resource_path(path) sound = self._sound_library.get(path) if sound == None: canonicalized_path = path.replace('/', os.sep).replace('\\', os.sep) sound = pygame.mixer.Sound(canonicalized_path) self._sound_library[path] = sound if self.sfx: sound.play()
def delete_level(self, name): import shutil folder = resource_path(os.path.join("assets/levels", name)) shutil.rmtree(folder) pass
def get_all_levels(self): list_names = [] folder = resource_path("assets/levels") list_names = [element for element in os.listdir(folder) if os.path.isdir(os.path.join(folder, element))] return list_names
def run(self): """Run the game.""" # ------------------------------------------------------------------------- # Create Theme: # ------------------------------------------------------------------------- mytheme = pygame_menu.themes.THEME_DARK.copy() mytheme.background_color=(0, 0, 0, 0) # ------------------------------------------------------------------------- # Create menus: Choose Level # ------------------------------------------------------------------------- self.play_menu = pygame_menu.Menu(480, 640, 'Chose Level', theme=mytheme) self.fill_play_menu(new_level=1) # ------------------------------------------------------------------------- # Create menus: Delete Level # ------------------------------------------------------------------------- self.delete_menu = pygame_menu.Menu(480, 640, 'Delete Level', theme=mytheme) self.delete_menu.add_text_input('Level: ', onchange=self.text_input, onreturn=self.delete, maxchar=15, align=pygame_menu.locals.ALIGN_LEFT) self.label_widget = self.delete_menu.add_label("Press 'Enter' to delete", align=pygame_menu.locals.ALIGN_LEFT, label_id='label') self.v_margin = self.delete_menu.add_vertical_margin(30) self.delete_menu.add_button('Back', pygame_menu.events.RESET, button_id='back') # ------------------------------------------------------------------------- # Create menus: Editor Help # ------------------------------------------------------------------------- editorhelp_menu = pygame_menu.Menu(480, 640, 'Editor Help', theme=mytheme) editorhelp_menu.add_label('Left-click for placing active object') editorhelp_menu.add_label('Right-click to abort placing') editorhelp_menu.add_label('Press 1 - 5 to access all objects') editorhelp_menu.add_label('Press \'d\' for deleting objects') editorhelp_menu.add_label('Press \'ESC\' to save the level') editorhelp_menu.add_vertical_margin(30) editorhelp_menu.add_button('Back', editorhelp_menu.reset, 1) # ------------------------------------------------------------------------- # Create menus: Editor # ------------------------------------------------------------------------- editor_menu = pygame_menu.Menu(480, 640, 'Editor', theme=mytheme) editor_menu.add_button('New Level', self.start_editor) editor_menu.add_button('Delete Level', self.delete_menu) editor_menu.add_button('Help', editorhelp_menu) editor_menu.add_button('Back', pygame_menu.events.RESET) # ------------------------------------------------------------------------- # Create menus: Help # ------------------------------------------------------------------------- help_menu = pygame_menu.Menu(480, 640, 'Help', theme=mytheme) help_menu.add_label('To finish a level you must reach the goal:') im_url = resource_path('assets/imgs/goal_help.png') help_menu.add_image(im_url) help_menu.add_label('Move with the arrow keys') help_menu.add_label('Pause the game with \'ESC\'') help_menu.add_vertical_margin(30) help_menu.add_label('Build your own levels in the editor') help_menu.add_vertical_margin(30) help_menu.add_button('Back', pygame_menu.events.RESET, align=pygame_menu.locals.ALIGN_CENTER) # ------------------------------------------------------------------------- # Create menus: Settings Menu # ------------------------------------------------------------------------- settings_menu = pygame_menu.Menu(480, 640, 'Settings', theme=mytheme) settings_menu.add_selector('Music ', [('ON', True), ('OFF', False)], onchange=self.change_music) settings_menu.add_selector('Sound FX ', [('ON', True), ('OFF', False)], onchange=self.change_sfx) settings_menu.add_button('Back', pygame_menu.events.RESET) # ------------------------------------------------------------------------- # Create menus: Main Menu # ------------------------------------------------------------------------- self.main_menu = pygame_menu.Menu(480, 640, 'Main Menu', theme=mytheme) self.main_menu.add_button('Play', self.play_menu) self.main_menu.add_button('Help', help_menu) self.main_menu.add_button('Settings', settings_menu) self.main_menu.add_button('Editor', editor_menu) self.main_menu.add_button('Quit', pygame_menu.events.EXIT) while True: self.clock.tick(FPS) events = pygame.event.get() for event in events: if event.type == QUIT: pygame.quit() exit() if self.main_menu.is_enabled(): self.screen.blit(self.menu_background, (0,0)) self.main_menu.draw(self.screen) self.main_menu.update(events) if self.change_delete_menu: self.main_menu.draw(self.screen) pygame.display.flip() time.sleep(1.0) self.update_delete_menu() elif self.state == 'game': done = self.game.update(events, self.screen) if done: self.state = None self.main_menu.toggle() elif self.state == 'edit': done, new_level = self.editor.update(events, self.screen) if done: self.state = None self.main_menu.toggle() if new_level is not None: self.fill_play_menu(new_level) pygame.display.flip()
def add_surf(self): surf_url = resource_path('assets/imgs/red_button.png') self.surf = pygame.image.load(surf_url).convert_alpha()
def activate(self): self.open = True surf_url = resource_path('assets/imgs/green_block.png') self.surf = pygame.image.load(surf_url).convert_alpha()