Ejemplo n.º 1
0
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
Ejemplo n.º 2
0
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)