Character Movement + Game Mechanic


English

Hi, everyone!

Today the work was most on Godot. I planned to improve the player movement, develop its interaction with the map buildings and implement the main mechanic. To help the thought process I draw on the Milanote app the idea that I had to code the movement.

I knew it would be necessary moving on diagonals and in some way center the character in each tile. To make so that it could move tile by tile I did some modifications on the original code. First, I changed the input recognition to compute only when the key is pressed. Second, to each direction, I setted values of 1 or -1 to X and Y axis. Then I normalized the resulting vector and multiplied the value by the movement velocity, that need to be drastically increased to achieve the size of one tile. But with this the character wasn't staying on the center of the tiles, it just moved a certain distance on diagonals. The thing is isometric tiles aren't squares so I needed to adjust the movement to fit their shape. As the patter of the isometric assets are 2x1 pixel, I divided the value of the Y axis so that the monster would move more on the X axis then on Y axis. That already improved a lot its movement, but still wasn't on the center as I wanted.

I realized that would need some way to find the reference to the correct positon of each tile. Looking at documentation I find the methods of the tilemap node that allowed me to find the correct position of the tile in a given location. To test it, I tried implementing a hover mechanic with the mouse to make the tile above the mouse highlighted. It took some time, because I couldn't make the tiles go back to normal after getting hightlighted. I tried altering the shader, but that changed all the tiles. After some research on forums, the solution I find was show a sprite of the highlighted tile appear in front of the tile that was above the mouse. Once found, that solution seemed pretty simple. Knowing how to get the tile position, it was easy fixate the character on each tile center. I even implemented a code to prevent the player from moving where there aren't tiles.

To complete the day, I implemented the player's health together with the movement cost. For now the patter is that the player has 100 health points and a cost of 10 points for move. When it reaches 0 HP the monster is destroyed. To make it easier to see the HP during the tests, I made a basic UI showing his health together with a field to show the score once is implemented.

In this stage of development I still have a lot of ideas, but no much time to work on them, so I need to limit myself to achieve something playable by the end of the jam. That's why my final game idea is going to be:
- The monster moves tile by tile at the cost of HP.
- When reaches a building, the monster destroys it and recover some health.
- The games end when all the building are destroyed OR the monster's health reaches zero.

Keeping it simple to improve what I have, but going to register all the ideas to work on after the jam.

Thanks for giving some attention to read this and until next time! o/



Idea on Milanote app! / Ideia no app Milanote.


Portuguese (BR)

Oi, pessoal!

Hoje o trabalho foi mais no Godot. Eu me planejei para melhorar a movimentação do jogador, criar a interação dele com os prédios do mapa e ter a mecânica básica implementada. Para facilitar o raciocínio eu esbocei no app Milanote, a ideia que tinha para implementar o movimento.

Eu sabia que precisaria mover nas diagonais e de alguma forma centralizar o personagem em cada tile. Para ter a movimentação de tile por tile, fiz algumas alterações no código. Primeiro, mudei o reconhecimento do input para processar apenas quando a tecla é pressionada. Segundo, para cada direção (cima, baixo, esquerda e direita) associei um conjunto de eixos X e Y, sendo sempre valores de 1 ou -1. Em seguida, eu normalizei o vetor resultante e multipliquei o valor pela velocidade de movimento, que precisou ser drasticamente ampliada para se mover na distância de um tile. Mas dessa forma o personagem ainda não ficava centralizado nos tiles, ele apenas se movia nas diagonais uma certa distância por pressionar de tecla. Como os tiles isométricos não eram quadrados eu precisava alterar o movimento para corresponder ao formato deles. Sendo o padrão dos assets 2x1 pixels, eu dividi o valor eixo Y do vetor de movimentação para que o personagem se mova mais pelo eixo X do que pelo Y. Isso já deixou bem mais próximo do centro dos tiles, mas ainda não era preciso.

Percebi que precisaria de alguma forma encontrar a referência para a posição específica de cada tile. Olhando a documentação, encontrei os métodos do node tilemaps que me permitiram encontrar a posição específica do tile de uma determinada localização. Para testar, eu implementei uma mecânica de hover para que o tile sob o mouse fique destacado. Isso demorou um pouco, pois tentei alterar o sprite do tile, mas não conseguia fazê-lo voltar ao normal. Tentei alterar o shader, mas não consegui limitar a aparência a apenas um tile. A solução que encontrei após algumas pesquisas foi mostrar um sprite do tile selecionado na posição do tile sob o mouse. Foi complicado encontrar essa solução, mas uma vez descoberta se mostrou ser bem simples. E com o conhecimento de como pegar a posição do tile, eu facilmente consegui fixar o personagem no centro de cada tile. Ainda implementei um código para impedir o jogador de se mover onde não há tiles.

E para completar o dia de desenvolvimento, eu implementei a vida do jogador junto com o custo por movimento. Por enquanto, o padrão é o jogador com 100 pontos de vida e custo de 10 pontos por movimento. Ao chegar a 0 pontos de vida, o monstro é destruído. Para facilitar a visualização durante os teste, já implementei uma UI básica mostrando os pontos de vida junto de um campo para o score quando for implementado.

Nesse ponto do desenvolvimento ainda estou com várias ideias, mas o tempo vai passando e eu preciso me restringir para ter algo jogável no fim da game jam. Então por enquanto vou me limitar para a seguinte ideia:
- O monstro se move tile por tile a um custo de vida;
- Quando encosta num prédio, o monstro o destrói e recupera vida;
- O jogo termina quando todos os prédios são destruídos OU a vida do monstro chega a zero.

Manter simples para conseguir melhorar o que já tenho, mas vou anotar as outras ideias para trabalhar mais depois da jam.

Obrigado pela atenção e até o próximo post! o/

Get Slimus The City Destroyer

Download NowName your own price

Leave a comment

Log in with itch.io to leave a comment.