Example #1
0
class Start_Screen(Scene):
    def __init__(self):
        Scene.__init__(self)
        self.add(
            Sprite(image=pyglet.resource.image('background.png'),
                   position=(self.anchor_x,
                             self.anchor_y)))  # Background Image

        black_fade = ColorLayer(0, 0, 0, 0)
        black_fade.opacity = 120
        self.add(black_fade)

        menu = Menu("TETRIS")
        menu.position = (0, -60)
        menu.font_title["font_name"] = "Tetrominoes"
        menu.font_title["color"] = (214, 178, 152, 255)
        menu.font_item["font_name"] = "Ravie"
        menu.font_item_selected["font_name"] = "Ravie"

        menu_items = [
            MenuItem('Start Game',
                     game_controller.game_controller.init_new_game),
            MenuItem('Ranking', self.show_ranking),
            MenuItem('Quit', game_controller.game_controller.close_scene)
        ]
        menu.menu_hmargin = 10
        menu.create_menu(menu_items)

        menu.on_quit = self.on_quit

        self.menu_lyr = Layer()
        self.menu_lyr.add(menu)
        self.rank = Ranking()
        self.multi_layer = MultiplexLayer(self.menu_lyr, self.rank)
        self.add(self.multi_layer)

    def show_ranking(self):
        self.multi_layer.switch_to(1)
        self.rank.show_rank()

    def on_rank_exit(self):
        self.multi_layer.switch_to(0)

    def on_quit(self):  # ao pressionar ESC executa este metodo
        game_controller.game_controller.close_scene()
Example #2
0
class Main_Game(Scene):
    is_event_handler = True
    def __init__(self):
        Scene.__init__(self)
        self.anchor = Vector2()


    def start(self):
        #variaveis a serem resetadas com u jogo novo
        self.is_game_over = False
        self.is_colliding_left = False
        self.is_colliding_right = False
        self.is_colliding_base = False
        self.currentScore = 0        
        self.game_time = 0

        self.c_manager =  game_controller.game_controller.c_manager# obtem instancia do gerenciador de colisao

        self.keybd_input = Keyboard_Input()# iniciaiza o layer de input do teclado
        self.wall_limits = Wall_Limits()# iniciaiza o layer para as delimitacoes do jogo
        self.pieces_wall = Pieces_Wall()# iniciaiza o layer de bloco de pecas
        self.game_info_layer = Game_Info()# iniciaiza o layer de informacoes do jogo (informacoes no canto direito)
        self.game_over_lyr = Ranking(is_game_over=True)# iniciaiza o layer de game over para mostrar ranking
        self.pause_lyr = Pause()# iniciaiza o layer de pause do game
        # iniciaiza o layer multiplo para alternar entre layer do input,mostrar o game over e pause
        self.multi_layer = MultiplexLayer(Layer(), self.game_over_lyr, self.pause_lyr)

        self.add(self.wall_limits)# adiciona layer
        self.add(self.game_info_layer)# adiciona layer
        self.add(self.pieces_wall)# adiciona a a layer
        self.add(self.keybd_input)# adiciona layer
        self.add(self.multi_layer)# adiciona layer

        self.add_next_piece()# inicializa a primeira peca

        self.start_timer()
        

    def start_timer(self):
        self.schedule_interval(self.count_time, 1)#inicia timer para contagem do tempo
    def stop_timer(self):
        self.unschedule(self.count_time)#remove contagem do tempo

    def game_over(self):
        self.is_game_over = True
        self.c_manager.clear()# limpa lista de objetos com colisao
        self.unschedule(self.count_time)
        self.multi_layer.switch_to(1)
        self.game_over_lyr.show_rank()


    def add_next_piece(self):
        self.currPiece = self.game_info_layer.obtain_next_piece() # obtem peca inicial(a primeira proxima peca...)
        self.currPiece.position = POS_NEW_PIECE
        self.pieces_wall.add(self.currPiece)# adiciona peca na layer de pecas e blocos 

        self.currPiece.start_fall()
        for (_, block) in self.currPiece.children:# adiciona peca atual ao gerenciador de colisao
            self.c_manager.add(block)    


    def sum_score(self, amount): # soma no score a quantidade passada
        self.currentScore += amount
        self.game_info_layer.update_score(self.currentScore)

    def count_time(self, time_elapsed):# metodo chamado com o tempo que passou (1s), entao guarda e atualiza na layer o tempo atual do jogo
        self.game_time += time_elapsed
        self.game_info_layer.update_time(self.game_time) 


    def piece_must_stop(self):# executa o necessario para parar a peca e adicionar ao bloco de pecas

        self.currPiece.stop_fall()# para a peca
        self.currPiece.update_blk_cshape()# atualiiza a colisao para a ultima posicao da peca apos terminar de cair

        if(self.currPiece.y >= 525):# finaliza a partida quando nao consegue adicionar mais pecas ao topo
            self.game_over()
            return

        self.sum_score(27)# adiciona o score de uma peca
        
        self.pieces_wall.process_piece(self.currPiece)
        self.add_next_piece()
        
    def on_pause(self):
        self.pause()
        self.stop_timer()
        self.currPiece.stop_fall()
        self.multi_layer.switch_to(2)
        
    def on_unpause(self):
        self.resume()
        self.start_timer()
        self.currPiece.start_fall()
        self.multi_layer.switch_to(0)

    def on_rank_exit(self):
        if(self.is_game_over):
            game_controller.game_controller.close_scene()



    def on_exit(self):
        self.remove(self.wall_limits)# adiciona layer
        self.remove(self.game_info_layer)# adiciona layer
        self.remove(self.pieces_wall)# adiciona a a layer
        self.remove(self.keybd_input)# adiciona layer
        self.remove(self.multi_layer)# adiciona layer
        self.c_manager.clear()# limpa lista de objetos com colisao

        if(self.is_game_over):# quando acontece um game over adiciona a pontuacao ao rank
            score = self.currentScore
            plyr_name = self.game_over_lyr.player_name
            time_str = self.game_info_layer.get_time_str()
            self.game_over_lyr.add_rank({score:(plyr_name, time_str)})

        return super().on_exit()

    def on_enter(self):
        self.start()
        return super().on_enter()

    ''' KEYS INPUT '''
    def key_action(self, time_elapsed, key_string):# para cada tecla executa a acao especifica
        
        if(key_string ==  'P' or key_string ==  'ESCAPE'):
            self.on_pause()

        if(not self.is_colliding_base and key_string == 'DOWN'):
            self.unschedule(self.currPiece.do_fall)
            self.schedule_interval(self.currPiece.do_fall, 0.03)

        if(not self.is_colliding_left and key_string == 'LEFT'):
            self.currPiece.move(Vector2(-25,0))

        if(not self.is_colliding_right and key_string == 'RIGHT'):
            self.currPiece.move(Vector2(25,0))

        if(key_string == 'SPACE'):
            self.currPiece.rotate()


    def time_delay(self, time_elapsed, key_string):# executado depois de um certo delay
        self.unschedule(self.time_delay)
        self.schedule_interval(self.key_action, 0.1, key_string)# move a peca a cada 100ms enquanto a tecla ainda estiver pressionada

    def on_key_press(self, key, modifiers):
        key_string = symbol_string(key)# obtem o valor em string da tecla pressionada 

        self.key_action(0, key_string)#executa uma acao da tecla quando pressionado
        self.schedule_interval(self.time_delay, 0.3, key_string)# espera 300ms antes de comecar a mover a peca rapidamente

    def on_key_release(self, key, modifiers):# quando a tecla deixa de ser pressionada ele para de mover a peca rapidamente
        self.unschedule(self.key_action)
        self.unschedule(self.time_delay)