def __init__(self): global SCREENHEIGHT, SCREENWIDTH os.environ['SDL_VIDEO_CENTERED'] = '1' pygame.init() info = pygame.display.Info() if info.current_h != -1: SCREENWIDTH = info.current_w SCREENHEIGHT = info.current_h self._screen = pygame.display.set_mode((SCREENWIDTH, SCREENHEIGHT), pygame.DOUBLEBUF | pygame.FULLSCREEN) self._background = pygame.Surface(self._screen.get_size()) self._background.fill(BLACK) self._background = self._background.convert() self._window = pygame.Surface(WINDOWSIZE) self._window = self._window.convert() self._clock = pygame.time.Clock() self._fps = FPS self._debugfont = pygame.font.SysFont('courier', 11) self._buttonfont = pygame.font.SysFont('sans', 14) self._debug = False self._is_viewing = False self._view_x, self._view_y = (0, 0) self._key_input = None self._init_buttons() self._map = Map('resources/maps/area01/new.tmx', PLAYERLAYER, *WINDOWSIZE) self._player = [] # lijst van hero sprite classes, incl rect voor visuele locatie i = 0 for hero_raw in Output.HERO_SORT: hero = data.heroes[hero_raw] if hero in data.party: self._player.append(Hero((336 + i * 32, 272 + i * 32), hero.BMP)) # vul in de map de lijst van rects van alle heroes self._map.add_rect_to_list(self._player[i].rect, self._map.heroes) self._map.add_rect_to_list(self._player[i].rect, self._map.obstacles) i += 1 self._pointer = Pointer(POINTERLAYER) self._moverange = MoveRange(MOVERANGESIZE, MOVERANGELAYER) # speler 0 alagos is de eerste cu self._cu = 0 self._start_of_turn() self._map.add_sprite_to_map_layer_group(self._moverange) # voeg de LIJST van hero sprites toe aan de visuele groep self._map.add_sprite_to_map_layer_group(self._player) self._map.add_sprite_to_map_layer_group(self._pointer)
class BattleWindow(object): def __init__(self): global SCREENHEIGHT, SCREENWIDTH os.environ['SDL_VIDEO_CENTERED'] = '1' pygame.init() info = pygame.display.Info() if info.current_h != -1: SCREENWIDTH = info.current_w SCREENHEIGHT = info.current_h self._screen = pygame.display.set_mode((SCREENWIDTH, SCREENHEIGHT), pygame.DOUBLEBUF | pygame.FULLSCREEN) self._background = pygame.Surface(self._screen.get_size()) self._background.fill(BLACK) self._background = self._background.convert() self._window = pygame.Surface(WINDOWSIZE) self._window = self._window.convert() self._clock = pygame.time.Clock() self._fps = FPS self._debugfont = pygame.font.SysFont('courier', 11) self._buttonfont = pygame.font.SysFont('sans', 14) self._debug = False self._is_viewing = False self._view_x, self._view_y = (0, 0) self._key_input = None self._init_buttons() self._map = Map('resources/maps/area01/new.tmx', PLAYERLAYER, *WINDOWSIZE) self._player = [] # lijst van hero sprite classes, incl rect voor visuele locatie i = 0 for hero_raw in Output.HERO_SORT: hero = data.heroes[hero_raw] if hero in data.party: self._player.append(Hero((336 + i * 32, 272 + i * 32), hero.BMP)) # vul in de map de lijst van rects van alle heroes self._map.add_rect_to_list(self._player[i].rect, self._map.heroes) self._map.add_rect_to_list(self._player[i].rect, self._map.obstacles) i += 1 self._pointer = Pointer(POINTERLAYER) self._moverange = MoveRange(MOVERANGESIZE, MOVERANGELAYER) # speler 0 alagos is de eerste cu self._cu = 0 self._start_of_turn() self._map.add_sprite_to_map_layer_group(self._moverange) # voeg de LIJST van hero sprites toe aan de visuele groep self._map.add_sprite_to_map_layer_group(self._player) self._map.add_sprite_to_map_layer_group(self._pointer) def _init_buttons(self): self._button_view = Button((SCREENWIDTH-200, SCREENHEIGHT-300), "V") self._button_up = Button((SCREENWIDTH-150, SCREENHEIGHT-300), "Up") self._button_down = Button((SCREENWIDTH-150, SCREENHEIGHT-250), "Down") self._button_left = Button((SCREENWIDTH-200, SCREENHEIGHT-250), "Left") self._button_right = Button((SCREENWIDTH-100, SCREENHEIGHT-250), "Right") self._button_cancel = Button((SCREENWIDTH-100, SCREENHEIGHT-200), "C") self._buttons = [self._button_view, self._button_up, self._button_down, self._button_left, self._button_right, self._button_cancel] self._keys = [pygame.K_v, pygame.K_UP, pygame.K_DOWN, pygame.K_LEFT, pygame.K_RIGHT, pygame.K_c] def _start_of_turn(self): # de rect van de player die aan de beurt is weer verwijderen en ken de start_pos toe self._map.del_rect_from_list(self._player[self._cu].rect, self._map.heroes) self._map.del_rect_from_list(self._player[self._cu].rect, self._map.obstacles) self._map.add_rect_to_list(self._player[self._cu].rect, self._map.start_pos) self._moverange.update(self._player[self._cu].rect.center) def _end_of_turn(self): self._moverange.update(CLEARPOS) self._player[self._cu].align_to_grid(GRIDSIZE) # voeg de betreffende rect toe aan de lists en verwijder de rect van start_pos self._map.add_rect_to_list(self._player[self._cu].rect, self._map.heroes) self._map.add_rect_to_list(self._player[self._cu].rect, self._map.obstacles) self._map.start_pos = [] # van waar tot waar moet je scrollen start_x, start_y = self._player[self._cu].rect.center self._cu += 1 if self._cu > len(data.party) - 1: self._cu = 0 end_x, end_y = self._player[self._cu].rect.center self._scroll_map(start_x, start_y, end_x, end_y) self._reset_vars() self._start_of_turn() def _reset_vars(self): self._is_viewing = False self._view_x, self._view_y = self._player[self._cu].rect.center def run(self): game_over = False while not game_over: self._clock.tick(self._fps) self._key_input = pygame.key.get_pressed() for event in pygame.event.get(): if event.type == pygame.MOUSEBUTTONDOWN: for button in self._buttons: self._key_input = button.handle_event() # if 'down' in self._button_up.handleEvent(event): # pipo = list(pygame.key.get_pressed()) # pipo[pygame.K_UP] = pygame.K_UP # self._player[self._cu].handle_movement(pipo) if event.type == pygame.QUIT: game_over = True elif event.type == pygame.KEYDOWN: if event.key == pygame.K_ESCAPE: game_over = True if event.key == pygame.K_F10: self._map.show_grid() if event.key == pygame.K_F11: self._map.show_info(1) if event.key == pygame.K_F12: if self._debug: self._debug = False else: self._debug = True if event.key == pygame.K_SPACE: self._player[self._cu].align_to_grid(GRIDSIZE) if event.key == pygame.K_v: if self._is_viewing: self._is_viewing = False self._scroll_map(self._view_x, self._view_y, *self._player[self._cu].rect.center) else: self._is_viewing = True self._view_x, self._view_y = self._player[self._cu].rect.center if event.key == pygame.K_c: if self._is_viewing: self._is_viewing = False self._scroll_map(self._view_x, self._view_y, *self._player[self._cu].rect.center) else: self._end_of_turn() if self._is_viewing: self._view_map(self._key_input) else: if self._key_input is None: continue self._player[self._cu].set_speed(self._key_input) self._player[self._cu].set_fallback() self._player[self._cu].handle_movement(self._key_input) self._check_obstacle() self._pointer.update(self._player[self._cu].rect.center) self._map.center_window(self._player[self._cu].rect.center) self._draw() pygame.quit() def _draw(self): self._show_buttons() self._map.show_info(0) self._map.draw_group(self._window) self._screen.blit(self._window, WINDOWPOS) if self._debug: self._show_debug() pygame.display.flip() self._screen.blit(self._background, (0, 0)) def _show_buttons(self): for count, key in enumerate(self._keys): if self._key_input[key]: self._buttons[count].bgcolor = DARKGRAY else: self._buttons[count].bgcolor = BLACK for button in self._buttons: button.draw(self._background) def _show_debug(self): # noinspection PyProtectedMember text = ("FPS: {}".format(int(self._clock.get_fps())), "press_up: {}".format(self._player[self._cu]._press_up), "press_down: {}".format(self._player[self._cu]._press_down), "press_left: {}".format(self._player[self._cu]._press_left), "press_right: {}".format(self._player[self._cu]._press_right), "direction: {}".format(self._player[self._cu]._direction), "movespeed: {}".format(self._player[self._cu]._movespeed), "cu: {}".format(self._cu), "start_pos.x: {}".format(self._map.start_pos[0].left if self._map.start_pos != [] else "None"), "start_pos.y {}".format(self._map.start_pos[0].top if self._map.start_pos != [] else "None"), "player.x: {}".format(self._player[self._cu].rect.left), "player.y: {}".format(self._player[self._cu].rect.top), "view.x: {}".format(self._view_x), "view.y: {}".format(self._view_y), "step_count: {}".format(self._player[self._cu]._step_count), "step_animation: {}".format(self._player[self._cu]._step_animation), "step_delay: {}".format(self._player[self._cu]._step_delay), "is_viewing: {}".format(self._is_viewing), ) for count, line in enumerate(text): self._screen.blit(self._debugfont.render(line, True, WHITE), (0, count * 10)) def _view_map(self, keys): if keys[pygame.K_UP]: self._view_y -= VIEWSPEED if keys[pygame.K_DOWN]: self._view_y += VIEWSPEED if keys[pygame.K_LEFT]: self._view_x -= VIEWSPEED if keys[pygame.K_RIGHT]: self._view_x += VIEWSPEED if self._view_x < 0: self._view_x = 0 if self._view_y < 0: self._view_y = 0 if self._view_x > self._map.width: self._view_x = self._map.width if self._view_y > self._map.height: self._view_y = self._map.height self._pointer.update((self._view_x, self._view_y)) self._map.center_window((self._view_x, self._view_y)) def _scroll_map(self, start_x, start_y, end_x, end_y): step_x = (start_x - end_x) / SCROLLSPEED step_y = (start_y - end_y) / SCROLLSPEED tmp_x = start_x tmp_y = start_y for _ in range(SCROLLSPEED): self._clock.tick(self._fps) tmp_x -= step_x tmp_y -= step_y self._pointer.update((tmp_x, tmp_y)) self._map.center_window((tmp_x, tmp_y)) self._draw() def _check_obstacle(self): # loop tegen de rand van een obstacle aan # er mag maar 1 obstacle in deze lijst zijn if len(self._player[self._cu].rect.collidelistall(self._map.obstacles)) == 1: # obj_nr is het nummer van de betreffende obstacle obj_nr = self._player[self._cu].rect.collidelist(self._map.obstacles) self._player[self._cu].move_side(self._map.obstacles[obj_nr]) # loop tegen de rand van een low obstacle aan, bijv water if len(self._player[self._cu].rect.collidelistall(self._map.low_obst)) == 1: obj_nr = self._player[self._cu].rect.collidelist(self._map.low_obst) self._player[self._cu].move_side(self._map.low_obst[obj_nr]) # loop tegen de rand van je moverange if pygame.sprite.collide_mask(self._player[self._cu], self._moverange): self._player[self._cu].fallback() # loop tegen een obstacle of low_obst aan while self._player[self._cu].rect.collidelist(self._map.obstacles) > -1 or \ self._player[self._cu].rect.collidelist(self._map.low_obst) > -1: self._player[self._cu].move_back()