Forums » RPG MAKER 2K e 2003

[Destiny Script] Caminhando em pisos escorregadios

    • 683 posts
    14 de maio de 2015 22:37:05 ART

    Andando no Gelo


    Imagem Postada

     

    Autor: Dr.XGB
    Plataforma: RPG Maker 2000
    Nível: Intermediário
    Outro Motor: Destiny Patcher 2.0

     

    E aí, pessoal?
    Neste tópico você vai conhecer uma maneira diferente de movimento que vai deixar um efeito bem legal para o seu jogo que é o trabalho com fricções. O efeito causado é para ser utilizado, por exemplo, quando o herói está andando sobre um piso escorregadio (gelo, por exemplo), no qual o herói ao dar um passo ele vai demorar um pouco para ficar parado devido a fricção do piso que lhe permite escorregar por mais alguns tiles.
    A ideia principal é que você já tenha uma noção de verificação por terrenos, pois é através dessa verificação que veremos se herói vai escorregar neste terreno ou terá apenas o seu movimento normal.



    Lista de Switches, Variáveis e Eventos Comuns:

    Switch:

    0001 Slidin' On Ice



    Variável:

    0001 Hero X 0002 Hero Y 0003 Hero Terrain 0004 Hero Movement 0005 Hero Friction




    Eventos Comuns:

    0001 Check Terrain 0002 Slidin' On Ice 0003 Movin' On Ice



     

    Etapa 1: Verificando Id do Terreno

    0001: Check Terrain
    Processo Paralelo
    (sem switch)

    A primeira coisa que devemos fazer é verificar os terrenos de acordo com a posição do Herói no mapa. Isso você pode fazer simplesmente com eventos. Primeiro você usará as duas primeiras variáveis que retornarão a coordenada X e Y, respectivamente, do herói no mapa; em seguida, usar o comando Set Terrain ID..., baseando-se nas coordenadas retornando para a terceira variável, que indicará a Id do Terreno cujo o herói se encontra:



    <> Variable Ch:[0001: Hero X] Set,  Hero    X Pos <> Variable Ch:[0002: Hero Y] Set,  Hero    Y Pos <> Set Terrain's ID: (V[0001],V[0002]),  [0003: Hero Terrain] <>

     

    Ou então podemos fazê-lo com Destiny Script, dispensando o uso das duas primeiras variáveis, utilizando as coordenadas dadas através do objetoEvent[HERO]:



    $
    Command.GetTerrainId(3,Event[HERO].X,Event[HERO].Y);



     

    Etapa 2: Hora de deslizar!

    0002: Slidin' On Ice
    Processo Paralelo
    (sem switch)

    Agora que já criamos a verificação de terreno no primeiro Evento Comum, vamos fazer com que o herói comece a deslizar no piso quando estiver sobre o gelo ou num piso escorregadio qualquer. Mas antes, precisamos criar este tal terreno.

    • Abra o Database e escolha a aba Terrain;
    • Selecione Max Field Number... e altere o valor máximo para 11;
    • Selecione a Id criada e denomine-a da maneira que desejar, entendendo que aquele será um piso escorregadio;
    • Depois disso, vá para a aba Chipset;
    • Clique na nova Id de terreno que você criou em uma lista à direita e clique no piso que você deseja que seja escorregadio, aparecendo o número 11 sobre ele, confirmando a mudança.


    Depois disso, crie uma condição onde a variável [0003: Hero Terrain] tenha o valor 11, marque a opção ELSE Case e ative a única switch utilizada neste sistema.
    Agora vem a parte feita pelo Destiny Script. Você precisa pensar primeiro que, quando o herói estiver sobre este piso, ele vai deslizar, mesmo que ele tente mudar de direção e mesmo se ele não estiver mais andando. Para isso, teremos que deixar o movimento do herói fixo:

     



    $
    Event[HERO].FixDir = true



    Depois disso, faremos uma verificação com as 4 teclas direcionais, fazendo com que o movimento seja reiniciado e alterar a direção do herói sem alterar o movimento, causando a impressão de quele está escorregando. Além disso, vamos armazenar o movimento do herói em uma variável, aproveitando as constantes dadas para determinar o movimento do herói de acordo com o comando Move Event...:



    $if(Keyboard.GetKeyState(VK_DOWN) != 0)
      Event[HERO].StopAnimation = false;
      Event[HERO].DirLook = DIR_DOWN;
      pause;
      if(v[4] == MC_STEPDOWN || v[4] == -1) Event[HERO].Speed = 4endif;
      if(v[4] == -1 || Event[HERO].Speed < 4)
        v[4] = MC_STEPDOWN;
        v[5] = 0;
        Command.GoToLabel(1);
      endif;
    endif;



    Você pôde notar acima que a variável [0004: Hero Movement] foi retornada com a constante que usamos para executar o método MoveEvent()do objeto Command. Quando esta variável está com o valor -1, significa que o herói está parado e já não está mais deslizando.
    Também temos a variável [0005: Hero Friction] que sempre será zerada quando o herói conseguir se mover no gelo. O método GoToLabel()serve para pular para a linha onde estará a Label 1 que ainda não foi criada, mas serve precisamente para que o jogador não misture os comandos caso aperte mais de uma tecla ao mesmo tempo.
    Aplique este código para as outras direções, adaptando as constantes e direções de acordo com as teclas.
    Logo após, chame o comando Label por eventos e marque o valor 1. Sempre que o jogador apertar uma tecla, o código pulará diretamente a partir deste ponto, para então executarmos os métodos MoveEvent() e o MoveAll(), com a variável retornada ao apertar as teclas:



    $
    if(v[4] > -1)
      Command.MoveEvent(HERO,v[4]);
      Command.MoveAll();
      pause;
      Event[HERO].StopAnimation = true;
    endif;



    Se você testar o jogo agora, verá que o herói sairá escorregando até atingir uma área que o herói não consegue passar. Isso quer dizer que a ideia funcionou e precisamos terminar deixando um efeito mais interessante no qual a velocidade do herói vai diminuindo aos poucos até parar, envolvendo velocidade e fricção. O valor da fricção vai aumentando e terá um limite, se atingir este limite a velocidade do herói abaixará e esta variável voltará a zero, recomeçando a contagem:



    $
    if(Event[HERO].Speed > 1)
      if(v[5] >= 2+Event[HERO].Speed)
        Event[HERO].Speed--; v[5] = 0;
        v[5] = 0;
      else
        v[5]++;
      endif;
    else
      v[4] = -1;
    endif;



    Para finalizar o sistema, temos que fazer com que o herói retome os seus movimentos normais caso ele saia do piso de gelo. Por isso criamos aquela condição por eventos com a opção ELSE marcada. É para lá que nós vamos agora, colocando a velocidade normal de volta, a animação de movimento e tirar o movimentos fixo:



    $
    if(Event[HERO].Speed < 4)
      Event[HERO].Speed = 4;
    endif;

    Event[HERO].StopAnimation = false;
    Event[HERO].FixDir = false;



    Não se esqueça também de colocar a variável que estava movendo o herói para o valor padrão novamente e desativar a switch que estava o fazendo escorregar.



    <> Variable Ch: [0004: Hero Movement] Set,  -1 <> Change Switch: [0001: Slidin' On Ice] - OFF Set <>


    0003: Slidin' On Ice
    Auto Start
    [0001: Slidin' On Ice]

    Este evento comum serve para que você não possa mover o herói enquanto ele estiver escorregando no piso de gelo. Aqui você pode aproveitar para usar como comandos de interação com eventos e abrir o menu, já que o auto Start não permite isso enquanto ele estiver acontecendo. Para evitar lag, colocamos um Wait de 0.0 nele:



    <>Wait: 0.0 sec <>

     

    O resultado é este quando tudo dá certo nos comandos:


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

     

    Clique aqui para baixar a Demonstração deste tutorial



     

    Espero que tenham gostado deste tutorial e que possa lhe servir como uma ideia a mais caso você queira trabalhar numa jogabilidade variada. Não deixe de baixar a demonstração para ver com mais detalhes todo o código.

    Até mais!