Blog dos Desenvolvedores - Movimento do RuneScape

Olá! Eu sou Mod Nin. Se você acompanhou a apresentação do RuneScape no RuneFest em outubro, você deve ter visto alguns protótipos para diversos detalhes do jogo. Para um deles, chamado de suavização do movimento, mostramos um vídeo de um personagem correndo pelo labirinto da Aldeia dos Gnomos Arborícolas, fazendo as curvas tão fluidamente como se estivesse escorregando em manteiga. Essa mudança está finalmente pronta para ser implementada! Para os curiosos de plantão, eu gostaria de explicar um pouco melhor como fizemos essa mudança aparentemente simples.


Para entender, precisamos explicar primeiro como o movimento no RuneScape funciona. Isso significa entender um pouco como o RuneScape funciona de um modo geral.

Quando você joga o RuneScape, você interage com o cliente do jogo - o programa que você baixou no seu dispositivo. O cliente se conecta a um servidor do jogo, que é executado por nós na Jagex. A distinção é a seguinte:

  • O servidor do jogo processa quase toda a lógica do jogo (como o movimento do personagem, scripts de combate e scripts de treinamento de habilidades).
  • O cliente do jogo mostra o mundo como ele existe no servidor. Ele não pode mover o seu personagem diretamente, mas pode dizer ao servidor para mover o seu personagem.
  • O ponto principal aqui é que o movimento de qualquer jogador ou NPC no RuneScape é controlado pelo servidor do jogo. A cada 600 milissegundos (um pulso do jogo) o servidor atualiza a posição do seu personagem e a envia para o seu cliente do jogo. Isso é alinhado em uma grade.

    Mas se isso fosse a única que você visse, o seu personagem se moveria de um jeito bem esquisito...


    Para fazer isso parecer mais natural, o cliente interpola entre a última e a nova posição do personagem, criando uma animação. Sempre que o cliente recebe uma nova posição, nós a adicionamos à "rota pendente" do personagem, e animamos o trajeto até ela a uma velocidade fixa, ajustada de acordo com os movimentos de caminhada, corrida ou rastejamento. Se o seu personagem acabar ficando muito longe da nova posição, sua velocidade é aumentada em um valor fixo até que ele chegue à posição.

    Elevando o nível!

    É assim que o movimento no RuneScape tem funcionado desde o lançamento do RuneScape 2 em 2004. Foi um bom jeito de representar o movimento dos jogadores e NPCs, mas sabemos que ele pode ser melhor. Não estamos buscamos uma mudança fundamental enorme (o movimento baseado em grade tem que continuar no momento!), mas existem duas áreas em que podemos melhorar:

  • 1. Os personagens começam e param instantaneamente sem aceleração ou desaceleração e mudam subitamente de velocidade durante o movimento. Isso é bem nauseante caso você utilize o modo de câmera Clássico.
  • 2. Ao virar, os personagens iniciam o movimento para a nova direção imediatamente. Isso faz o movimento parecer irregular e não natural.
  • Fluidez/aceleração/desaceleração

    Em vez de mover um personagem a uma velocidade fixa, nós também vamos adicionar aceleração além de velocidade. Quando os personagens se movem, nós alteramos sua velocidade de 0 até a velocidade máxima em torno de 200 milissegundos. Então, quando o servidor diz que não há mais movimento, nós desaceleramos de volta a 0. Isso também será aplicado em alterações de velocidades durante o movimento. Se o seu personagem fica sem energia e começa a caminhar, a velocidade será diminuída mais suavemente.

    Também adicionamos um sistema de compensação mais inteligente. Como dito antes, seu personagem tem a velocidade aumentada subitamente caso fique muito longe da posição atual. Com o novo método para lidar com a velocidade, nós podemos tornar isso um pouco mais contínuo ao ajustar sutilmente a velocidade do personagem baseado em quão longe ele está. Quanto mais longe for a rota, mais rapidamente o personagem se moverá - e quando a sua velocidade for alterada, isso será feito mais suavemente. Além de fazer a compensação mais contínua, isso também melhora um pouco a responsividade das suas entradas de movimento; quanto mais próximo do final da rota pendente mantermos o seu personagem, mais rápido você verá ele chegar à sua posição mais recente. Isso deve acontecer a todo momento e, se eu fiz meu trabalho direito, você nem deve notar!

    Fazendo curvas

    É aqui que as coisas ficam realmente interessantes! Seria muito bacana se, em vez de seguirmos uma rota em linha reta, pudéssemos segui-la usando curvas também. Um jeito simples e eficiente de fazer isso é utilizar a curva de Bézier. Sem entrar em muitos detalhes, uma curva de Bézier é uma curva paramétrica criada com a interpolação de um número de pontos. Para o nosso caso, teremos três pontos por curva, portanto a nossa curva será uma curva de Bézier quadrática.


    No entanto, pegar os nossos pontos existente e transformá-los em curvas não é suficiente. Terminaríamos com uma verdadeira bagunça, pois as curvas não se alinhariam adequadamente dependendo de onde o movimento foi iniciado, e algumas curvas seriam mais fechadas do que outras. Seu personagem acabaria cortando algumas curvas e passando através de paredes também, portanto precisamos fazer um pouco mais para fazer isso funcionar.


    Para arrumar isso, nós só precisamos adicionar mais alguns pontos ao longo do caminho. Sempre que recebermos uma nova posição do servidor, precisamos criar pontos adicionais em passos de meio-quadrado na direção da nova posição. Assim, nós geramos curvas a partir de todos os pontos para garantir que o personagem sempre entre e saia de um quadrado de um jeito que se alinha com o próximo ponto.


    Ótimo! Agora nós temos umas curvas supimpas para interpolar. Ao mover um personagem, nós podemos usar a velocidade para movê-lo ao longo da curva, com aceleração e curvas suaves! Na prática isso é um pouco mais complicado (o que acontece se a próxima posição recebida chega muito tarde e temos que iniciar uma nova curva no meio da última? Ou se temos apenas dois pontos?), mas isso já explica em linhas gerais como funciona o novo movimento.


    Chegamos ao fim deste post. Espero que você tenha gostado. Antes de entrar para a Jagex em 2016, eu realmente gostava de ler os blogs dos desenvolvedores do NXT, então espero que pelo menos alguns de vocês tenham achado este interessante! Faço parte da nova equipe de Experiência Principal do Jogo do RuneScape, uma equipe dedicada a transformar a experiência geral do jogo na melhor possível, portanto você pode esperar por mais melhorias como essa no futuro!


    Mod Nin, Programador de Mecanismo do Jogo

    Voltar ao início