Forums » RPG Maker VX Ace

Detecção de Posicionamento e Distância de Eventos - Parte 1

    • 206 posts
    29 de maio de 2015 20h38min29s ART

    Introdução

    Ola!

    Resolvi criar uma série de tutoriais ensinando um pouco de programação de games. Meu objetivo não é disponibilizar códigos e sim mostrar como podemos resolver os problemas usando uma mistura de programação de eventos com a programação em ruby. Nesta primeira sequência vou trabalhar um pouco com detecções, rotinas e pincelar sobre Steering Behaviors e inteligência artificial.

    Detecção de Posicionamento e Distância de Eventos - Parte 1

    Quando produzia os sistemas de Raven's Den e estava a trabalhar na construção dos monstros, a principio utilizava as funções do próprio editor em especial as variáveis e switches. Mas essa forma me deixava encucado, afinal, não seria possível fazer com que os próprios eventos fizessem essa verificação sem que eu precisasse definir isso manualmente e não perdesse tempo criando situações de detecção?

    Pois bem, vamos dar uma olhada no que exatamente eu gostaria de fazer:

    Imagem Postada

    Obviamente eu poderia fazer o simples e usar as próprias variáveis do editor, mas existe sempre uma chance de bugar ou ter que fazer várias condições. E eu de fato gostaria de simplificar as páginas de eventos.

    Para detectar essas condições eu precisaria saber de algumas informações:

    Coordenadas X e Y de cada Evento
    Coordenadas X e Y do personagem Herói



    Apenas com essas informações eu já poderia fazer minhas condições por scripts e simplificar meu futuro trabalho. Agora precisava saber aonde exatamente alterar. Olhando para as classes de RPG Maker, temos algumas que podem nos dar pistas do que precisamos alterar/criar:

    Imagem Postada

    Todas elas pertencendo a Game_CharacterBase:

    Imagem Postada

    Certo, já sabemos aonde encontrar as variáveis. Agora precisamos criar métodos de detecção. Como essas funções são ações e verificações dos nossos eventos, criaremos métodos dentro da Classe Game_Event. Para facilitar e não alterar as classes do RPG Maker, crie uma nova classe lá abaixo de ▼ Materials:

    Imagem Postada

    Começamos então o nosso querido código. Primeiro, precisamos definir uma variável para a distância e fazer ela iniciar junto com o evento. Para isso precisamos fazer um alias.

    Citar

    alias 
    Comando usado para criar um apelido para um método. Muito útil para acrescentar ações em métodos sem a necessidade de reescreve-los por completo


    Nosso código deve ficar mais ou menos assim:

    Imagem Postada

    Com a variável criada, podemos criar o método de definição e retorno de distância entre o evento e outro objeto.  O calculo para definir distância entre dois pontos é um velho grego conhecido, pitagoras, vejamos o porque:

    Imagem Postada

    A distância entre os pontos é a hipotenusa do teorema, sendo assim podemos calcular como:

    Distancia² = (X do herói - X do evento)² + (Y do herói - Y do evento)²



    Nosso método pode ser o retorno desse calculo, ficando mais ou menos assim:

    Imagem Postada

    Ok, agora já tenho meu método para checar a distância entre personagens. Porém, para usar-lo como condição nos eventos preciso tornar visível ao interpretador de eventos. A classe que faz isso é a Game Interpreter. Façamos o seguinte código:

    Imagem Postada

    Agora posso criar condições para meus eventos que tenham a trigger distância. Vamos criar um evento para testar essas condições:

    Imagem Postada
    Imagem Postada

    E um vídeo do funcionamento dessa primeira colisão:

    http://www.youtube.com/watch?v=sk04cV6t45s

    Assim Resolvi a primeira parte dos meus problemas, detecção de distância entre evento e herói.

     

    Materiais

    Códigos:

    Spoiler 
    Game_Event

    #==============================================================================
    # ** Game_Event
    # - Métodos Criados para detecção de eventos
    #==============================================================================
    
    class Game_Event < Game_Character
      #--------------------------------------------------------------------------
      # * Inicialização dos Objetos
      #--------------------------------------------------------------------------
      # Crio um alias para o antigo initialize.
      alias :antigo_initialize :initialize
      # Método de inicialização de Classe
      def initialize(map_id, event)
        # Variável para definir a distância entre eventos
        @distancia = 0
        # Chamo a inicialização padrão através do alias criado
        antigo_initialize(map_id, event)
      end
      #--------------------------------------------------------------------------
      # * Calculo para definir distancia  
      # - destino_x | Posição X válida de um character
      # - destino_y | Posição y válida de um character
      #--------------------------------------------------------------------------
      def define_distancia(destino_x, destino_y)
        # Calculo de distância
        # Define a primeira parte do calculo - (X do herói - X do evento)²
        @distancia =  ((@x - destino_x) * (@x - destino_x))
        # Define a segunda parte do calculo - (Y do herói - Y do evento)²
        @distancia += ((@y - destino_y) * (@y - destino_y))
        # Realiza a raiz quadrada
        @distancia = Math.sqrt(@distancia)
        # Retorna a distância
        return @distancia
      end
    end

    Game_Interpreter

    #============================================================================
    # ** Game_Interpreter
    #============================================================================
    class Game_Interpreter
      #--------------------------------------------------------------------------
      # * Retorna o tamanho da distancia
      #--------------------------------------------------------------------------	
    	def distancia
        # Verifica se o evento de fato existe
    		if $game_map.events[@event_id] # Leia a nota 1
          # x do herói
          x = $game_player.x
          # y do herói
          y = $game_player.y
          # Chamamos o método para definir distância
    			return $game_map.events[@event_id].define_distancia(x, y)
    		else
    			return false
    		end
    	end
      # ----------------
      # - Nota 1
      #
      #   $game_map é a variavel que gerencia os mapas.
      #   Ela contem uma lista de eventos do mapa que 
      #   são acessados através da sua id.
      #
      #   @event_id é a variavel que armazena a id do evento
      #   que chamou o interpretador
      # ----------------
    end



    Link para download do Projeto.

     

    No próximo tutorial trataremos as demais detecções e iniciaremos a trabalhar rotinas de eventos baseados nessas condições.

    Até o próximo tutorial da série!