Saltar para: Posts [1], Pesquisa [2]

Lusitânia - O Jogo

Um blog onde vai sendo relatado o desenvolvimento de um videojogo centrado no berço da identidade portuguesa: a Lusitânia e a sua resistência contra o invasor e ocupador romano.

Lusitânia - O Jogo

Um blog onde vai sendo relatado o desenvolvimento de um videojogo centrado no berço da identidade portuguesa: a Lusitânia e a sua resistência contra o invasor e ocupador romano.

Semanário de Desenvolvimento #6

Se eu tivesse de resumir o que fiz na última semana numa palavra ou expressão diria: A*

 

Relembrando que eu estou a tratar do sistema de movimento de cada unidade que tem de ter em conta dificuldades de terreno, em vez de andar a reinventar a roda vou simplesmente usar um amigo antigo que já me ajudou noutros projectos.

Esse amigo chama-se A* (lê-se "A asterisco", literalmente), e é um algoritmo que encontra soluções óptimas para resolver um problema num certo espaço de estados. Isto é tudo conversa bonita para dizer algo como "encontra o melhor caminho entre A e B". O A* pressupõe que existe algo como uma definição de estado (ou seja, não é anarquista!), transições de estado, custo e heurística.

Um estado pode ser algo tão simples como uma posição numa grelha, definida por X e Y.

As transições descrevem para que estados é que um pode mudar para. Numa grelha poderia ser algo como Cima, Baixo, Esquerda, Direita (ou também incluir diagonais).

O custo representa o valor prático de transição de um estado para outro. Pensemos que em termos de terreno existem uns que são mais difíceis de atravessar que outros.

Uma heurística é um método teórico qualquer de definir o quão longe um certo estado está do estado final (o destino). Tipicamente para grelhas usa-se a distância euclidiana.

Resumidamente, o algoritmo, começando numa posição inicial vai mantendo um registo de todos os estados que ainda não explorou. Iterativamente, até chegar ao destino ou até não lhe restar nada para explorar, ele escolhe para explorar o estado com a função de custo menor. Esta função de custo é dada pela soma do custo acumulado com a heurística daquele estado. Escolhendo sempre o estado que minimiza isto garante que a solução para chegar ao destino, se existir, é óptima.

Evidentemente, este foi um resumo muito simples do que o A* faz. Tentemos explorar um exemplo:

s_d_6_1.jpg

Na imagem acima a unidade da esquerda quer chegar à posição assinalada com a bola vermelha. Assumamos que a unidade só pode ir nas quatro direcções adjacentes (ou seja, sem movimento diagnonal). Sem mais contexto, qualquer um diria para o gajo fazer uma escadinha até à bola. Mas eu agora digo que as árvores têm um custo de transição maior do que a erva, e que as montanhas não são atravessáveis de todo. Mesmo aqui, vós, inteligentes como sois, saberíeis dizer que o homem tem de passar por baixo da montanha e evitar a floresta.

Parabéns! Na vossa cabeça, vocês acabaram de fazer o A*.

Eis então uma imagem que ilustra um bocadinho melhor o que o computador vai fazer:

s_d_6_2.jpg

Em cada mosaico, os dois números em cima representam o estado (neste caso a posição; sim, começa no zero, na programação é mesmo assim, habituem-se). O número de baixo colorido representa o custo acumulado para se chegar ali.

Inicialmente o algoritmo explora em todas as direcção, incluindo para cima, pois ainda não tem nada pela qual se possa basear para saber por onde se orientar. Na segunda iteração, as posições 1,1 e 0,2 têm exactamente o mesmo custo e a mesma distância à bola, portanto ambas podem ser exploradas. A partir daí a conversa muda: a posição 1,2 não pode ser atravessada, portanto o algoritmo nem a tem em conta. A transição para sair de uma floresta é maior (neste caso 2), e portanto o custo acumulado na posição 2,1 já é de 3 (1 + 2) e será de 5 (1 + 2 + 2) em 2,2

A azul está o caminho mais fácil e mais barato, sendo que o custo final será de 4 (não representado). Pelo caminho amarelo seria 6. Faça-se notar que o caminho amarelo não seria realmente explorado totalmente, pois o A* iria deixá-lo para trás em favor do caminho azul.

 

Tentei fazer o A* genérico o suficiente para poder ser utilizado noutras coisas no jogo. Ele pode ser utilizado para várias coisas, nomeadamente:

  • obter o custo de uma posição a outra (tendo todos os factores em conta);
  • obter o caminho óptimo de uma posição a outra;
  • obter todos os movimentos possíveis para uma certa unidade.

Eis um exemplo de todas as posições (a azul claro) que aquela unidade consegue atingir segundo o A*, com uma capacidade de movimento 4:

s_d_6_3.jpg

 

Perdoem-me este texto algo desnecessariamente técnico, mas o A* merece, tendo em conta a sua ubiquidade em termos de utilização em tantas coisas na nossa vida, mesmo sem o sabermos.

Estou particularmente contente com o facto de ter já conseguido fazer isto, mesmo sabendo que terei uns bugs para resolver, mas pronto. É um passo bastante considerável no desenvolvimento, especialmente se não tiver muitas mais dores de cabeça com ele (admito que faltam uns pormenores...).

 

Vou começar a trabalhar no sistema de combate, para o qual vou precisar de uma sprite nova, com resolução de 32 por 32 para as animações de porrada. Admito que tenho ficado para trás nesse assunto, mas tenho isto até agora:

fighter_32.png

Sim, é um bacalhau no escudo. Falta especialmente adicionar sombreamento/iluminação, e talvez fazê-lo menos gordo.

Semanário de Desenvolvimento #5

Pá, esta semana trabalhei muita pouco nisto.

E conseguem ver o desapontado que eu estou com o facto já que logo a primeira frase deste texto foi escrita à Jorge Jesus. Quando estou descontente é um dos modos para os quais comuto.

Em minha defesa, eu tenho dois empregos (sem contar com este projecto) e de vez em quando o tempo aperta um bocadinho mais.

Bom, vamos a isto, que ainda assim pelo menos ainda adiantei umas coisas no fim de semana.

Montei a base para o sistema de movimento limitado no jogo, de modo a que uma unidade não se possa mexer para onde quiser no mapa e tenha de ter em conta a distância percorrida por turno. Nisto entra ao barulho terrenos mais difíceis ou impossíveis de atravessar.

Tendo em conta que os algoritmos usados para fazer cálculos de distância e tal podem ser muito variados, vou querer ter uma maneira simples de comutar entre um algoritmo ou outro para fazer testes. Fiz um bocado de magia negra no código para me permitir fazer esta troca facilmente, mas reparem que quando um programador diz que fez magia negra, normalmente é porque fez algo que faria colegas dele rirem-se em modo gozão se se dessem ao trabalho de ir ver e perceber.

E nisso sou o primeiro a rir de mim próprio.

Mas funciona, e se parece estúpido e funciona, então talvez não seja assim tão estúpido (esta citação não funciona tão bem na programação, mas eu sinto-me com a consciência mais tranquila ao dizê-la).

Enfim, agora tenho uma semana inteira para talvez potencialmente com alguma eventual sorte ou jeito conseguir criar um primeiro algoritmo de cálculo de distâncias. Gostaria de fazer uma explicação mas detalhada do assunto, com bonecos e tudo se me der ao trabalho, mas veremos.

 

Pronto, é tudo.

Semanário de Desenvolvimento #4

Passou-se um mês e ainda não desisti. Bom sinal.

No entanto, por cada dia que passa vou-me lembrando de cada vez mais coisas que o jogo precisará para ter uma versão inicial básica.

Por exemplo, quando comecei a pensar em fazer o sistema de movimento não estava a pensar em como fazer as unidades mexerem-se autonomamemente pelo ambiente de jogo. O meu requisito inicial era conseguir seleccionar uma unidade e metê-la noutro sítio, e isso consegui fazer esta semana:

v_4_1.gif

Mas isto é apenas o primeiro passo. Foi nesta altura que me lembrei que a unidade depois terá de se mexer pelos mosaicos consoante o destino final que o jogador seleccionar. Isto já implica todo um sistema que determine automaticamente a melhor forma de a unidade de deslocar tendo em conta obstáculos e terreno mais difícil de andar em.

Bom, há-de ser nesse assunto que me focarei nas próximas semanas, creio, começando por definir limitações de movimento por cada terreno e capacidade de movimento por cada unidade.

 

Pode parecer que estou a demorar muito tempo a fazer uma coisa que à partida parece simples, mas estou a disciplinar-me para manter tudo organizadinho e escalável nos bastidores para quando começar a adicionar mais terrenos e unidades. E também só trabalho nisto em média uma horinha por dia.

Até para a semana.

Semanário de Desenvolvimento #3

Esta semana gastei uns belos momentos no sistema de Input, para o qual não tenho tradução fácil. É basicamente todo o sistema que me permitirá, como jogador, interagir com o jogo. Preparei o sistema base de modo a que se possa jogar o jogo com rato, teclado, controlador e toques, permitindo assim colocar o jogo em todas as plataformas mais facilmente, consoante as minhas decisões futuras.

Para clarificar, neste momento só consigo fazer uma ou duas acções com o rato, mas o sistema base é expansível para lidar com tudo. É só uma questão de paciência e necessidade para ir adicionando o resto das acções e interacções que precisarei.

Espero eu.

 

Também gastei um bocadinho de tempo a desenhar, de modo a preparar a inserção de um personagem no mapa. Comecei com um guerreiro simples, provavelmente descartável a longo prazo, mas bom para praticar.

Eis a primeira versão.

v3_1.png

Como não estava particularmente contente, gastei mais umas horinhas até chegar a algo que me satisfizesse um bocadinho mais para esta altura:

v3_2.png

Como verão, desta vez até já fiz o início de uma animação de andar, de modo a poder começar a aprender a fazer animações com imagens.

 

De resto, durante a próxima semana planeio modificar tudo o que fiz até agora para permitir a adição e carregamento de personagens no jogo e no editor de mapas. O que por si só já me parece um desafio do caraças, já que já encontrei coisas que não estavam bem feitas, os chamados bugs.

Links

  •  
  • Subscrever por e-mail

    A subscrição é anónima e gera, no máximo, um e-mail por dia.

    Arquivo

    1. 2021
    2. J
    3. F
    4. M
    5. A
    6. M
    7. J
    8. J
    9. A
    10. S
    11. O
    12. N
    13. D
    14. 2020
    15. J
    16. F
    17. M
    18. A
    19. M
    20. J
    21. J
    22. A
    23. S
    24. O
    25. N
    26. D
    Em destaque no SAPO Blogs
    pub