Como atirar projéteis no Arc Engine



Introdução:
Decidi criar alguns tutoriais com referência ao Arc Engine (que na minha opinião é a melhor e mais completa engine que simula um jogo de plataforma no RM) e na aula de hoje iremos aprender a criar um projétil para o personagem utilizando o Arc Engine.
Lembrando que este tutorial/sistema só irá funcionar com o Arc Engine! Segue a receita:

Ingredientes:
Você irá precisar do Arc Engine  e do script de colisão compatível com o Arc Engine:


#==============================================================================
# Arc Engine - Detectar posição/colisão
# Criado por Fogomax (Arc Engine por Khas)
#-----------------------------------------------------------------------------
# Permite criar uma colisão com eventos mais realista. O script deve ser
# utilizado com a Arc Engine do Khas.
#==============================================================================
 
module AEDC_F
  #----------------------------------------------------------------------------
  # Início da configuração
  #----------------------------------------------------------------------------
 
  # Tamanho padrão da colisão
  Default_CWH = 50
 
  #----------------------------------------------------------------------------
  # Fim da configuração
  #----------------------------------------------------------------------------
end

class Game_Interpreter
  def colisao?(direction, id, distance=AEDC_F::Default_CWH)
    x = $game_map.events[@event_id].ax; y = $game_map.events[@event_id].ay
    ax = id == 0 ? $game_player.ax - x : $game_map.events[id].ax - x
    ay = id == 0 ? $game_player.ay - y : $game_map.events[id].ay - y
    case direction
    when 4
      ay <= distance && ay >= 0  && ax > -24 && ax <= 0 # 24
    when 2
      ax >= distance * -1 && ax <= 0 && ay > -30 && ay <= 0
    when 3
      ax <= distance && ax >= 0 && ay > -30 && ay <= 0
    when 1
      ay >= distance * -1 && ay <= 0  && ax > -30 && ax < 20 #24
    end
  end
 
  def colisao_lados?(id, distance=AEDC_F::Default_CWH)
    return true if colisao?(1, id, distance, distance)
    return true if colisao?(2, id, distance, distance)
    return true if colisao?(3, id, distance, distance)
    return true if colisao?(4, id, distance, distance)
  end
 
  def colisao_frente?(id, distance=AEDC_F::Default_CWH)
    case $game_map.events[@event_id].direction
    when 2; return true if colisao?(4, id, distance)
    when 4; return true if colisao?(2, id, distance)
    when 6; return true if colisao?(3, id, distance)
    when 8; return true if colisao?(1, id, distance)
    end
  end
 
  def colisao_atras?(id, distance=AEDC_F::Default_CWH)
    case $game_map.events[@event_id].direction
    when 2; return true if colisao?(1, id, distance)
    when 4; return true if colisao?(3, id, distance)
    when 6; return true if colisao?(4, id, distance)
    when 8; return true if colisao?(4, id, distance)
    end
  end
end

Modo de preparo:

Posicionando o projetil:
Primeiramente vá ao editor de scripts (F11) e cole abaixo do Arc Engine esse pequeno script:


class Game_Character
attr_accessor :ax
attr_accessor :ay
end

Feito isto, crie um evento em processo paralelo no mapa contendo três páginas, todas elas em processo paralelo.
A primeira página servirá como ativação para o projétil, na segunda página o evento irá estar configurado para se deslocar para a esquerda, e na segunda página para a direita.
Então crie duas switchs, uma com o nome ''Esquerda'' e a outra ''Direita''.
Na segunda página do evento em ''condições'' selecione a switch ''Esquerda'', selecione o gráfico do projétil, marque as opções ''direção fixa'' (se desejar) e ''atravessar'', e a prioridade deixe ''junto ao herói''. Nos comandos de eventos chame o comando ''comentário'' e escrava o seguinte:


[deny_player]
[width x]
[height x]
[deny_gravity]

[deny_player] -> Irá fazer com que o evento ''ignore'' o jogador
[width x] -> Largura do evento. Troque ''x'' pela largura do evento do projétil.
[height x] -> Altura do evento. Troque ''x'' pela altura do evento do projétil.
[deny_gravity] -> Esse comando faz com que o projétil não tenha gravidade, ou seja, ele não ira ''cair'' ao ser ativado. Porém, se desejar criar um projétil com gravidade, simplesmente não adicione esse comando.

Abaixo do comando de comentário, adicione o comando ''chamar script'' e ponha isto:


self_event.through = trueDê ok.
Por fim, essa página deve estar assim:



Esse comando fará o evento ser ''atravessável'' e não irá atrapalhar o jogador caso  ele passe por cima do projétil.
Para que seu projeto não dê erro ao utilizar esse comando, vá ao editor de scripts e procure por ''Game_CharacterBase''.
Na linha 31 deste script, troque ''attr_reader'' para '''attr_accessor'' (sem aspas):



Dê ok.
Agora voltando ao evento... Faça o mesmo com a terceira página, só não se esqueça de trocar a switch ''esquerda'' pela switch ''direita''.
Depois de ter configurado a terceira página de evento, volte para a primeira página (que deve estar em processo paralelo) e em comandos de eventos, utilize o comando de ''chamar script'' e coloque isto aqui:


self_event.ax = $game_player.ax
self_event.ay = $game_player.ay
Esse comando fará com que o evento do projétil sempre se posicione nas mesmas coordenadas do herói.
Agora crie a condição que fará o projétil ser ativado, ou seja, uma condição de tecla, selecionando a tecla que você desejar.
Dentro dessa condição, adicione uma nova switch com o nome de ''ativação'' e torne-a ON. Crie também mais duas condições, uma que determina quando o herói está virado para a esquerda, e outra para o herói quando está virado para a direita:



Dentro da segunda condição, chame o comando ''chamar script'' e coloque isto:


self_event.ax -= 64Esse comando fará o evento do projétil ficar dois pixels atrás do jogador, para que o mesmo não atrapalhe o movimento do player.
32 pixels -> Um passo;
64 pixels -> Dois passos;
96 pixels -> Três passos... E assim por diante, porém o mais recomendado é deixar 64 pixels de distância mesmo.
E abaixo deste comando, ative a switch ''esquerda''.
Dentro da terceira condição faça a mesma coisa, só troque o comando de distanciamento de pixels por 64 positivo e torne ON a switch ''direita''.
Seu comando de eventos deve estar assim:



Dê ok pois esta parte da receita já está pronta.

Configurando os movimentos:

Ao chegar nesta parte do tutorial, você já configurou a posição do projétil, agora para programar o movimento do mesmo, crie um novo evento no mapa contendo duas páginas em processo paralelo.
Na primeira página, em ''condições'' selecione a switch ''esquerda'' e nos comandos de eventos adicione o ''chamar script'' e escreva o seguinte:


speed_6 = $game_map.events[1].vx
$game_map.events[1].move_dx(-200,40)


Explicação...

Na primeira linha do código você possui uma variável chamada ''speed''. Nesta variável você irá selecionar a velocidade que o projétil irá percorrer. Acho 6 uma velocidade considerável, mas você pode escolher qualquer uma. Quanto maior o valor da constante, mais rápido o projétil irá se movimentar.
Em ''$game_map.events[1].vx'' troque aquele número 1 dentro dos colchetes, pela ID do evento do projétil (aquele que nós configuramos anteriormente).

Na segunda linha do código, novamente troque o 1 pela ID do evento do projétil.
Por fim, em ''move_dx(-200,40)'' o valor ''-200'' significa a distância que o projétil irá ter, ou seja, quanto maior o número, mais alcance o projétil terá, já o sinal de negativo representa um alcance que se inicia pela esquerda, ou seja, quando o player está virado para a esquerda.
O valor ''40'' é o tempo em frames em que o projétil irá aparecer no mapa, à partir do momento em que for ativado.

Depois de configurar tudo, adicione um comando de esperar 40 frames abaixo do comando de call script, e desative as switchs: ''ativação'', ''esquerda'' e ''direita''.



Na segunda página desse evento faça a mesma coisa, só troque o comando de chamar script por isto:

Código: [Selecionar]
speed_6 = $game_map.events[1].vx
$game_map.events[1].move_dx(200,40)
Ou seja, agora o alcance do projétil tem um valor positivo, que se inicia à direita do player.
E não se esqueça de que esta página deve ter início com a switch ''direita'', ao invés da switch ''esquerda''.

Dê ok e teste o projeto e perceba que pressionando a tecla de ação que você escolheu, o personagem tem a possibilidade de atirar um projétil! 
Maravilha, não? Mas o projétil ainda precisa causar danos nos inimigos... Como fazer?

Causando danos nos inimigos:

Chegamos então por fim, na última parte desta ''receita''.
Para causar dano no inimigo com o projétil, crie o evento do inimigo, coloque um gráfico nele, as opções de movimento (faça como quiser), mas deixe-o em processo paralelo!
Agora iremos utilizar o comando de colisões que é compatível com o Arc Engine, para que quando o projétil colida com o inimigo, o mesmo sofra dano.
Primeiro crie uma condição em que a switch ''ativação'' deve estar ON.
Dentro dessa condição, crie mais uma condição selecionando a opção ''script'' e coloque isto:


colisao?(3, 1, 32)Sendo ''3'' a posição em que o projétil irá identificar o evento, no caso, para a esquerda, ''1'' o ID do evento que irá colidir com o evento do inimigo, no caso, o ID do primeiro evento que configuramos e ''32''  a distância em pixels que ocorrerá a colisão.
Dentro dessa condição você irá adicionar tudo o que irá acontecer quando o projétil acertar o inimigo.
Abaixo dessa condição, crie mais outra condição também contendo a opção ''script'' marcada e escreva o seguinte:
 


colisao?(2, 1, 32)

Dessa vez essa condição é referente ao lado direito da colisão entre o inimigo e o projétil.
No final das contas, seu inimigo deve estar configurado da seguinte maneira:




Note na imagem acima que a parte quadriculada em vermelho são os comandos do que irá ocorrer caso o projétil acerte o inimigo, e isso fica por sua conta, ok?
Pois bem... Aí está! Agora ao atirar o projétil, o inimigo também sofrerá danos.
E o tutorial chegou ao fim! Espero que tenham gostado pois em breve trarei mais desses!

Créditos:
MayLeone pelo tutorial;
Khas pelo Arc Engine;
Fogomax pelo script de colisão

2 comentários:

  1. O meu esta com apenas um problema, quando coloco o comando (self_event.ax = $game_player.ax; self_event.ay = $game_player.ay) funciona, mas quando eu aperto a tecla SPACE
    o meu player fica travando nao sei qual o motivo, quando pulo e aperto SPACE meu player ligeiramente cai, ja apaguei o evento e resolveu apaguei esse comando e vi que o problema esta nele, por favor tem como me ajudar? Agradeco

    ResponderExcluir

 
Depósito de Sistemas&Tutoriais © 2013 | Plantilla diseñada por Ciudad Blogger