class PongHauKi: def __init__(self, playerA1, playerA2, playerB1, playerB2, tabuleiro, lights): self.window_width = 1280 self.window_height = 620 self.cube_obj = Loader("./resources/models/cube.obj") player1_obj = Loader("./resources/models/drone.obj") player2_obj = Loader("./resources/models/galinha.obj") galinha_texture = Texture("./resources/textures/galinha.png") mech_texture = Texture("./resources/textures/mech.png") self.camera = Camera(self.window_width, self.window_height) self.camera.view['position'] = [0.0, 1.0, 0.0] self.camera.orthogonal = True self.camera.update() self.nave = Object(player1_obj, self.camera, mech_texture) self.nave.scale(0.4, 0.4, 0.4) self.galinha = Object(player2_obj, self.camera, galinha_texture) self.nave.model['rotation'][2] += 5 self.galinha.model['rotation'][2] += 5 self.galinha_win = Label("Galinha Wins", "kashima", 40, [1, 1, 1], [-1.5, 0, 0], self.camera) self.nave_win = Label("Nave Wins", "kashima", 40, [1, 1, 1], [-1.5, 0, 0], self.camera) self.playerA1 = playerA1 self.playerA2 = playerA2 self.playerB1 = playerB1 self.playerB2 = playerB2 self.tabuleiro = tabuleiro self.light = lights[0] self.playerA1.model['translation'] = [-0.8, 0.2, 0.8] self.playerA2.model['translation'] = [-0.8, 0.2, -0.8] self.playerB1.model['translation'] = [0.8, 0.2, -0.8] self.playerB2.model['translation'] = [0.8, 0.2, 0.8] self.positions = [[0.8, 0.2, -0.8], [-0.8, 0.2, 0.8], [0.8, 0.2, 0.8], [-0.8, 0.2, -0.8], [0.0, 0.2, 0.0]] self.current_player = "playerA" self.selected_piece = self.playerA1 self.free_position = self.positions[4] self.winner = None self.plays_count = 0 self.can_move_tree = { str(self.positions[0]): { str(self.positions[0]): False, str(self.positions[1]): False, str(self.positions[2]): True, str(self.positions[3]): True, str(self.positions[4]): True }, str(self.positions[1]): { str(self.positions[0]): False, str(self.positions[1]): False, str(self.positions[2]): True, str(self.positions[3]): False, str(self.positions[4]): True }, str(self.positions[2]): { str(self.positions[0]): True, str(self.positions[1]): True, str(self.positions[2]): False, str(self.positions[3]): False, str(self.positions[4]): True }, str(self.positions[3]): { str(self.positions[0]): True, str(self.positions[1]): False, str(self.positions[2]): False, str(self.positions[3]): False, str(self.positions[4]): True }, str(self.positions[4]): { str(self.positions[0]): True, str(self.positions[1]): True, str(self.positions[2]): True, str(self.positions[3]): True, str(self.positions[4]): False } } self.fire_work1 = FireWork(self.camera, self.cube_obj) self.fire_work2 = FireWork(self.camera, self.cube_obj) self.fire_work3 = FireWork(self.camera, self.cube_obj) self.render_count = 0 def have_winner(self): if self.current_player == "playerA": return (not self.can_move(self.playerA1.model['translation'], self.free_position) and not self.can_move(self.playerA2.model['translation'], self.free_position)) elif self.current_player == "playerB": return (not self.can_move(self.playerB1.model['translation'], self.free_position) and not self.can_move(self.playerB2.model['translation'], self.free_position)) def can_move(self, from_position, to_position): return self.can_move_tree[str(from_position)][str(to_position)] def select_piece(self): self.light.color = [1, 1, 0.5] if self.selected_piece == self.playerA1: self.selected_piece = self.playerA2 elif self.selected_piece == self.playerA2: self.selected_piece = self.playerA1 elif self.selected_piece == self.playerB1: self.selected_piece = self.playerB2 elif self.selected_piece == self.playerB2: self.selected_piece = self.playerB1 def move_piece(self): current_position = self.selected_piece.model['translation'].copy() if (self.can_move(current_position, self.free_position)): self.selected_piece.target_position = self.free_position self.free_position = current_position previous_player = self.current_player if self.current_player == "playerA": self.current_player = "playerB" self.selected_piece = self.playerB1 elif self.current_player == "playerB": self.current_player = "playerA" self.selected_piece = self.playerA1 if self.have_winner(): self.winner = previous_player else: self.plays_count += 1 else: self.light.color = [1, 0, 0] def handle_event(self, event): if event.type == pygame.MOUSEBUTTONDOWN: if event.button == 1 or event.button == 3: self.select_piece() if event.type == pygame.KEYDOWN: if event.key == pygame.K_SPACE: self.move_piece() def restart(self): self.playerA1.model['translation'] = [-0.8, 0.2, 0.8] self.playerA1.target_position = None self.playerA2.model['translation'] = [-0.8, 0.2, -0.8] self.playerA2.target_position = None self.playerB1.model['translation'] = [0.8, 0.2, -0.8] self.playerB1.target_position = None self.playerB2.model['translation'] = [0.8, 0.2, 0.8] self.playerB2.target_position = None self.free_position = self.positions[4] self.winner = None self.current_player = "playerA" self.selected_piece = self.playerA1 self.plays_count = 0 self.render_count = 0 def update(self, renderer): self.light.set_position(self.selected_piece.model['translation']) self.playerA1.update() self.playerA2.update() self.playerB1.update() self.playerB2.update() if self.render_count > 35: self.fire_work1 = FireWork(self.camera, self.cube_obj) self.fire_work2 = FireWork(self.camera, self.cube_obj) self.fire_work3 = FireWork(self.camera, self.cube_obj) self.render_count = 0 if self.winner == "playerA": renderer.render_with_lights(self.nave) self.nave.model['rotation'][0] += 0.1 self.nave_win.render(renderer) self.fire_work1.render(renderer) self.fire_work2.render(renderer) self.fire_work3.render(renderer) self.render_count += 1 elif self.winner == "playerB": renderer.render_with_lights(self.galinha) self.galinha.model['rotation'][0] += 0.1 self.galinha_win.render(renderer) self.fire_work1.render(renderer) self.fire_work2.render(renderer) self.fire_work3.render(renderer) self.render_count += 1
class Gui: def __init__(self, window_width, window_height, app): self.app = app self.camera = Camera(window_width, window_height) self.camera.view['position'] = [0.0, 1.0, 0.0] self.camera.orthogonal = True self.camera.update() self.resize = 0 self.menu = True text = "Press Enter to Play" quad_obj = Loader("./resources/models/quad.obj") press_to_play = Font(text, "boston_traffic", 1, 1, 1) self.start_menu = Label("Press enter to play", "kashima", 30, [1, 1, 1], [0.5, 0, 0], self.camera) self.logo = Label("Pong Hau Ki", "kashima", 100, [1, 1, 1], [-0.5, 0, 0], self.camera) lx = str(round(app.lights[1].position[0], 2)) ly = str(round(app.lights[1].position[1], 2)) lz = str(round(app.lights[1].position[2], 2)) lr = str(round(app.lights[1].color[0] * 255, 2)) lg = str(round(app.lights[1].color[1] * 255, 2)) lb = str(round(app.lights[1].color[2] * 255, 2)) self.btn_light_1_x_l = Button(" < ", 10, [0, 0, 0], [2.7, 0, -3.4], self.camera) self.btn_light_1_x = Button(lx, 10, [0, 0, 0], [2.7, 0, -4.4], self.camera) self.btn_light_1_x_r = Button(" > ", 10, [0, 0, 0], [2.7, 0, -5.4], self.camera) self.btn_light_1_y_l = Button(" < ", 10, [0, 0, 0], [2.4, 0, -3.4], self.camera) self.btn_light_1_y = Button(ly, 10, [0, 0, 0], [2.4, 0, -4.4], self.camera) self.btn_light_1_y_r = Button(" > ", 10, [0, 0, 0], [2.4, 0, -5.4], self.camera) self.btn_light_1_z_l = Button(" < ", 10, [0, 0, 0], [2.1, 0, -3.4], self.camera) self.btn_light_1_z = Button(lz, 10, [0, 0, 0], [2.1, 0, -4.4], self.camera) self.btn_light_1_z_r = Button(" > ", 10, [0, 0, 0], [2.1, 0, -5.4], self.camera) self.btn_light_1_x_r_down = False self.btn_light_1_y_r_down = False self.btn_light_1_z_r_down = False self.btn_light_1_x_l_down = False self.btn_light_1_y_l_down = False self.btn_light_1_z_l_down = False self.btn_light_1_r_l = Button(" < ", 10, [0, 0, 0], [2.7 - 2, 0, -3.4], self.camera) self.btn_light_1_r = Button(lr, 10, [0, 0, 0], [2.7 - 2, 0, -4.4], self.camera) self.btn_light_1_r_r = Button(" > ", 10, [0, 0, 0], [2.7 - 2, 0, -5.4], self.camera) self.btn_light_1_g_l = Button(" < ", 10, [0, 0, 0], [2.4 - 2, 0, -3.4], self.camera) self.btn_light_1_g = Button(lg, 10, [0, 0, 0], [2.4 - 2, 0, -4.4], self.camera) self.btn_light_1_g_r = Button(" > ", 10, [0, 0, 0], [2.4 - 2, 0, -5.4], self.camera) self.btn_light_1_b_l = Button(" < ", 10, [0, 0, 0], [2.1 - 2, 0, -3.4], self.camera) self.btn_light_1_b = Button(lb, 10, [0, 0, 0], [2.1 - 2, 0, -4.4], self.camera) self.btn_light_1_b_r = Button(" > ", 10, [0, 0, 0], [2.1 - 2, 0, -5.4], self.camera) self.btn_light_1_r_l_down = False self.btn_light_1_r_r_down = False self.btn_light_1_g_l_down = False self.btn_light_1_g_r_down = False self.btn_light_1_b_l_down = False self.btn_light_1_b_r_down = False def game_start(self): self.menu = False def pump_menu(self): if self.start_menu.quad.model['scale'][0] > 2: self.resize = -0.001 if self.start_menu.quad.model['scale'][0] <= 1.5: self.resize = 0.001 self.start_menu.quad.model['scale'] = [ self.start_menu.quad.model['scale'][0] + self.resize * 7, self.start_menu.quad.model['scale'][1], self.start_menu.quad.model['scale'][2] + self.resize ] def handle_event(self, event): if (event.type == pygame.MOUSEBUTTONDOWN): self.btn_light_1_x_r_down = self.btn_light_1_x_r.click( event, self.app) self.btn_light_1_y_r_down = self.btn_light_1_y_r.click( event, self.app) self.btn_light_1_z_r_down = self.btn_light_1_z_r.click( event, self.app) self.btn_light_1_x_l_down = self.btn_light_1_x_l.click( event, self.app) self.btn_light_1_y_l_down = self.btn_light_1_y_l.click( event, self.app) self.btn_light_1_z_l_down = self.btn_light_1_z_l.click( event, self.app) self.btn_light_1_r_r_down = self.btn_light_1_r_r.click( event, self.app) self.btn_light_1_g_r_down = self.btn_light_1_g_r.click( event, self.app) self.btn_light_1_b_r_down = self.btn_light_1_b_r.click( event, self.app) self.btn_light_1_r_l_down = self.btn_light_1_r_l.click( event, self.app) self.btn_light_1_g_l_down = self.btn_light_1_g_l.click( event, self.app) self.btn_light_1_b_l_down = self.btn_light_1_b_l.click( event, self.app) if (event.type == pygame.MOUSEBUTTONUP): pos_x = 6 * (event.pos[0] / self.app.window_width * 2 - 1) pos_y = 3 * (-(event.pos[1] / self.app.window_height * 2 - 1)) if (self.btn_light_1_x_r.click(event, self.app)): self.btn_light_1_x_r_down = False if (self.btn_light_1_y_r.click(event, self.app)): self.btn_light_1_y_r_down = False if (self.btn_light_1_z_r.click(event, self.app)): self.btn_light_1_z_r_down = False if (self.btn_light_1_x_l.click(event, self.app)): self.btn_light_1_x_l_down = False if (self.btn_light_1_y_l.click(event, self.app)): self.btn_light_1_y_l_down = False if (self.btn_light_1_z_l.click(event, self.app)): self.btn_light_1_z_l_down = False if (self.btn_light_1_r_r.click(event, self.app)): self.btn_light_1_r_r_down = False if (self.btn_light_1_g_r.click(event, self.app)): self.btn_light_1_g_r_down = False if (self.btn_light_1_b_r.click(event, self.app)): self.btn_light_1_b_r_down = False if (self.btn_light_1_r_l.click(event, self.app)): self.btn_light_1_r_l_down = False if (self.btn_light_1_g_l.click(event, self.app)): self.btn_light_1_g_l_down = False if (self.btn_light_1_b_l.click(event, self.app)): self.btn_light_1_b_l_down = False def update_lights(self): if self.btn_light_1_x_r_down: self.btn_light_1_x.set_caption( str(round(self.app.lights[1].position[0], 2))) self.app.lights[1].position[0] += 0.1 self.app.lights[1].sphere.model['translation'][0] += 0.1 if self.btn_light_1_y_r_down: self.btn_light_1_y.set_caption( str(round(self.app.lights[1].position[1], 2))) self.app.lights[1].position[1] += 0.1 self.app.lights[1].sphere.model['translation'][1] += 0.1 if self.btn_light_1_z_r_down: self.btn_light_1_z.set_caption( str(round(self.app.lights[1].position[2], 2))) self.app.lights[1].position[2] += 0.1 self.app.lights[1].sphere.model['translation'][2] += 0.1 if self.btn_light_1_x_l_down: self.btn_light_1_x.set_caption( str(round(self.app.lights[1].position[0], 2))) self.app.lights[1].position[0] += -0.1 self.app.lights[1].sphere.model['translation'][0] += -0.1 if self.btn_light_1_y_l_down: self.btn_light_1_y.set_caption( str(round(self.app.lights[1].position[1], 2))) self.app.lights[1].position[1] += -0.1 self.app.lights[1].sphere.model['translation'][1] += -0.1 if self.btn_light_1_z_l_down: self.btn_light_1_z.set_caption( str(round(self.app.lights[1].position[2], 2))) self.app.lights[1].position[2] += -0.1 self.app.lights[1].sphere.model['translation'][2] += -0.1 if self.btn_light_1_r_r_down: self.btn_light_1_r.set_caption( str(round(self.app.lights[1].color[0] * 255, 2))) self.app.lights[1].color[0] += 0.01 self.app.lights[1].sphere.color[0] += 0.01 if self.btn_light_1_g_r_down: self.btn_light_1_g.set_caption( str(round(self.app.lights[1].color[1] * 255, 2))) self.app.lights[1].color[1] += 0.01 self.app.lights[1].sphere.color[1] += 0.01 if self.btn_light_1_b_r_down: self.btn_light_1_b.set_caption( str(round(self.app.lights[1].color[2] * 255, 2))) self.app.lights[1].color[2] += 0.01 self.app.lights[1].sphere.color[2] += 0.01 if self.btn_light_1_r_l_down: self.btn_light_1_r.set_caption( str(round(self.app.lights[1].color[0] * 255, 2))) self.app.lights[1].color[0] += -0.01 self.app.lights[1].sphere.color[0] += -0.01 if self.btn_light_1_g_l_down: self.btn_light_1_g.set_caption( str(round(self.app.lights[1].color[1] * 255, 2))) self.app.lights[1].color[1] += -0.01 self.app.lights[1].sphere.color[1] += -0.01 if self.btn_light_1_b_l_down: self.btn_light_1_b.set_caption( str(round(self.app.lights[1].color[2] * 255, 2))) self.app.lights[1].color[2] += -0.01 self.app.lights[1].sphere.color[2] += -0.01 def render(self, renderer): self.update_lights() if self.menu: self.logo.render(renderer) self.start_menu.render(renderer) self.pump_menu() else: self.btn_light_1_x_l.render(renderer) self.btn_light_1_x.render(renderer) self.btn_light_1_x_r.render(renderer) self.btn_light_1_y_l.render(renderer) self.btn_light_1_y.render(renderer) self.btn_light_1_y_r.render(renderer) self.btn_light_1_z_l.render(renderer) self.btn_light_1_z.render(renderer) self.btn_light_1_z_r.render(renderer) self.btn_light_1_r_l.render(renderer) self.btn_light_1_r.render(renderer) self.btn_light_1_r_r.render(renderer) self.btn_light_1_g_l.render(renderer) self.btn_light_1_g.render(renderer) self.btn_light_1_g_r.render(renderer) self.btn_light_1_b_l.render(renderer) self.btn_light_1_b.render(renderer) self.btn_light_1_b_r.render(renderer)