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:
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:
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:
Todas elas pertencendo a Game_CharacterBase:
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:
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:
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:
A distância entre os pontos é a hipotenusa do teorema, sendo assim podemos calcular como:
Nosso método pode ser o retorno desse calculo, ficando mais ou menos assim:
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:
Agora posso criar condições para meus eventos que tenham a trigger distância. Vamos criar um evento para testar essas condições:
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:
#============================================================================== # ** 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 #============================================================================ 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!