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.
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.
Quem me dera que eu pudesse voltar aos meus tempos de adulto irresponsável. Não que eu esteja preocupado em ficar velho, longe disso, mas pelo menos na altura tinha menos responsabilidades que me comessem o tempo para passatempos. Enfim, pelo menos são responsabilidades que escolho ter, nem todos têm o luxo de escolha.
Quero com isto dizer que não avancei assim tanto desde a última vez, mas este fim de semana dei-lhe forte e feio. Terminei o editor de items e comecei a integrá-los no resto do jogo. Em particular, agora já se consegue seleccionar a arma pretendida para atacar.
Até ao próximo relatório da minha parte espero limar muitas das arestas que ainda tenho. Vou passando pelo código e vendo coisas que deveria melhorar, e nestar coisas quanto mais cedo melhor.
Uma musicazinha então. Tarot Woman, dos Rainbow. Ui, espero que não agoire nada.
Para progredirmos na vida há que expandir os horizontes, há quem diga.
Bom, se estivermos a falar literalmente, era muita chato até agora estar a trabalho num mapa muita pequenino de uns 5 por 5 quadradrinhos. Fiz então um mapazinho maior, de 30 por 20 e implementei a minha expansão de horizonte, em particular, o movimento da câmara através de acções do utilizador, e não só.
Vejamos:
Na imagemzinha acima vejo inicialmente o movimento da câmara através do teclado. De seguida pode-se ver o rato a aproximar-se das bordas e o movimento respectivo. Finalmente, quando a personagem se move, a câmara consegue acompanhá-lo.
Não é que seja realmente necessário que a câmara siga o personagem, mas estou a preparar o módulo para utilizações futuras, nomeadamente quando tiver inimigos com inteligência artificial.
No entanto, ocorreu um problema técnico com isto da câmara que poderá demorar um bocadinho a solucionar (porque não quero apenas copiar uma solução da net...). Não é crítico, mas acho que vou passar a próxima semana a tentar resolver isso e aproveito e resolvo outros erros que vá encontrando, para tentar consolidar um bocadinho o que tenho feito até agora.
Talvez até faça um bocadinho de arte pixel para menus. Veremos.
Um dia atrasado, mas consegui acabar a implementação base das condições de vitória / derrota.
Olhem só que fixe:
Agora sim sinto-me de consciência tranquila para começar a implementação da câmara de jogo. Esperemos que durante esta semana tenha o mínimo já pensado e implementado.
Música da semana: Kool & the Gang, com Jungle Boogie
Esta semana estiver a preparar o caminho para a adição do que chamei "condições de jogo". Resumidamente, um sistema que permitirá configurar em que condições é que o jogador ganha ou perde o jogo. Perdi imenso tempo a tentar fazê-lo genérico, e apesar de ainda não estar lá bem, já tenho alguma coisa.
Até agora só fiz o trabalho de bastidores para poder editar as condições no editor de mapas.
Durante a próxima semana vou ver se consigo meter as condições a funcionar no jogo em si.
Bom, não que eu possa realmente chamar a isto semanário, já que a última vez que escrevi aqui foi há 4 meses.
Tive umas pausas, uns stresses, umas vivências e outras faltas de disciplina. Mas nem por isso estive totalmente parado. Progressos desde a última vez:
Sistema de turnos e de ataque funcional, com barras de vida manhosas incluídas:
Poderão ter reparado num boneco novo. Finalmente fiz um legionário, ou pelo menos a versão pequenina, sendo que para isso comecei a usar um programa específico para arte pixel chamado Aseprite, que dá bastante mais jeito que o Paint.net, admito.
Também gastei bastante tempo a refazer uma data de coisas de bastidores. Ainda hoje comentei comigo próprio como é que um projecto com tão pouco para mostrar já tem tanta porcaria por trás? Pelo menos é menos com que me preocupar no futuro.
"Famous last words", como dizem os americanos.
Pá, mas um gajo tem de continuar. Bem vistas as coisas, tenho já uma data de sistemas genéricos a funcionar quase correctamente (há sempre afinadelas a dar).
Vou ver se me foco em estabelecer condições básicas de vitória para o jogo acabar quando um dos lados ficar sem tropas (e mais uma vez tem de ser genérico o suficiente para permitir outras condições de vitória).
Veremos!
Música para animar. Roland Seitz: March Grandioso:
Estive principalmente a trabalhar no sistema de turnos.
As unidades agoram ficam cinzentas quando já se mexeram no turno do jogador. Quando todas as unidades se já tiverem mexido, o jogo passa o turno automaticamente para o próximo jogador.
Até pus um elemento simples de UI para fazer parecer a funcionalidade um bocadinho mais finalizada.
Ainda ficaram uns bugs, portanto provavelmente hei-de resolvê-los durante a semana, enquanto decido igualmente qual será o próximo passo.
Tema da semana é, não surpreendentemente, já que estou a falar do sistema de turnos, The Byrds, com Turn! Turn! Turn!
Uma semana lenta de desenvolvimento, estive mais a trabalhar nos bastidores a preparar o trabalho para a semana vindoura.
O objectivo continua a ser implementar o sistema de turnos, e neste momento já tenho um muito básico, em que tenho de carregar num botão explicitamente para passar o turno para o outro jogador (por agora só terei humano contra humano; um inimigo com inteligência artificial ainda está a uns meses de distância, imagino). Espero fazer o sistema mais automático e giro no prazo de uma ou duas semanas.
Depois de umas semanas complicadas em termos de tempo, eis-me de volta.
Não é que tenha feito assim muito, mas grão a grão enche a galinha o papo.
Até agora o Zé tem-se movimentado instantaneamente para o local onde selecciono. O meu objectivo é fazê-lo deslizar pelo mapa, seguindo um certo caminho. Usando o algoritmo do A* já implementado isto tornou-se bastante fácil.
No entanto, isto não mete piada, porque era mais interessante que a unidade tivesse efectivamente animações associadas à sua locomoção, preferivelmente também com variações consoante a sua direcção.
Apresento então a sprite sheet mais actualizada para este efeito:
Que, em conjunto com o cálculo da direcção, resulta em algo um bocadinho mais agradável de se ver:
Tentei reproduzir o que acontece no Fire Emblem (que relembro que é o jogo que estou basicamente a copiar) em termos de animações. Quando o cursor é colocado em cima de uma unidade ela reproduz uma certa animação, e quando a selecciono para a movimentar ela põe-se a andar no mesmo sítio para dar a entender que está pronta a ser movida.
Nos bastidores também criei um sistema básico e genérico de eventos, de modo a que informação de que algo acontece possa ser passada a quem estiver interessado. Basicamente, um componente do jogo que esteja interessado em saber se algo acontece regista-se num gestor à espera que um certo evento especificado ocorra. Quem despoleta o evento informa o gestor que por sua vez informará todos os que se registaram. Isto reduz a quantidade de dependências que cada entidade de jogo tem umas das outras, pois dependem apenas de um sítio centralizado para este tipo de coisas.
Exemplo em questão: quando a unidade se está a mover, eu não quero poder interagir com nada. Portanto, quando dou uma ordem a uma unidade para se mexer, desligo as interações e registo que alguém está à espera que o personagem chegue ao destino. Quando a unidade lá chega depois de um tempo, despoleta o evento no gestor, que por sua vez informa os registados desse evento. Quem está registado pode agora voltar a activar as interacções para se prosseguir com o jogo.
Sendo o sistema genérico, provavelmente usá-lo-ei para muitas muitas outras coisas.
Durante a próxima semana gostaria talvez de começar a trabalhar no sistema de turnos, o que implicaria associar uma unidade a cada facção e só permitir mexer as unidades quando for o turno delas. Ui, vai ser engraçado, porque nunca fiz um sistema desses.
Música da semana: em homenagem ao Sean Connery, Snake Eater, do videojogo Metal Gear Solid 3, que fazia várias referências aos filmes do James Bond, inclusivé na introdução, feita ao estilo único dos filmes.
Esta semana estive particularmente ocupado em fazer o sistema base de internacionalização. O objectivo desse sistema é substituir todo o texto que exista na interface gráfica pelas traduções correctas de um certo país/dialecto. Fiz de forma a que venha a ser acessível meter novas linguagens no futuro, sendo mais difícil fazer as traduções em si do que metê-las no jogo.
Resumidamente, num ficheiro tenho uma associação entre uma chave única e a tradução para a respectiva língua. Cada ficheiro é correspondente a uma língua, havendo suporte para dialectos (ou seja, português europeu e brasileiro).
Pode parecer um bocado chato, mas considero que seja fundamental que já exista um sistema base tão no início do projecto porque a internacionalização é importante para que o jogo tenha um público alvo potencialmente alargado, pelo menos geograficamente.
Para ficar realmente utilizável ainda me falta uma espécie de editor auxiliar para inserir e editar facilmente cada uma das entradas para textos, mas isso é algo que pode ser feito de forma completamente independente da implementação actual, portanto por agora estou contente.
Quero continuar a aproximar-me de um nível jogável. Tenho umas alterações a fazer no mapa em si e talvez comece a trabalhar no sistema de animações de movimento, para vermos as unidades efectivamente a andar de um lado para o outro, em vez de se transportarem instantaneamente.
Um dos mais relevantes e que é mais invisível é que mudei de ambiente de desenvolvimento integrado, ou seja, o programa que uso para escrever código que se integra com o Unity para transformar letras em magia. Estava a usar o Visual Studio, mas estou tão habituado ao muito superior IntelliJ que resolvi arranjar uma versão compatível com o Unity, a que eles chamam Rider.
Até agora, bastante satisfeito, especialmente por poder usar atalhos de teclado que realmente me fazem sentido e para os quais já tenho memória muscular.
Fiz a base do sistema de facções!
Era suposto trabalhar no sistema de combate, e então decidi fazer tudo devidamente, construindo todos os sistemas que me lembro que poderão ser importantes para isso. Por "facções" entendo que cada unidade poderá pertencer a uma organização diferente, que poderá ser inimiga ou aliada de outras. Em 99% por cento dos casos só haverão duas, "nós e eles" (e no fundo, somos apenas homens normais), mas quero já deixar o caminho aberto para decisões futuras.
Ou seja, sistema de combate em si não fiz, mas já consegui fazer uma unidade matar outra assim à bruta só para provar que o sistema de facções funciona. Reflectindo bem, isso por agora é quase suficiente, porque ainda é cedo para começar a entrar por fórmulas matemáticas de danos, defesa e afins.
Algo com que me deparei enquanto testava isto é que se eu atacasse uma unidade no mapa não tinha maneira de saber quanta vida é que ela tinha ainda, o que é ligeiramente irritante.
Isso leva-me a outro progresso significativo desta semana: já tenho alguma interface gráfica! Tenho um cursor a andar de um lado para o outro e tenho informação a ser mostrada sobre o que está debaixo desse cursor.
Desde o início deste projecto que quis disciplinar-me em implementar este tipo de coisas importantes logo desde o início de modo a fazê-las expansíveis para o desenvolvimento futuro. A interface gráfica que mostrarei de seguida é simples, sem dúvida, mas tem um esqueleto por trás que suportará (espero eu) todas as restantes necessidades de disponibilização de informação (ou vá, muitas, pelo menos).
Notem no guife acima (e sim, escrevi guife de propósito para lerem GIF da maneira correcta!) que existe um cursor a seguir o rato, que será o mesmo a ser utilizado pelos controlos de teclado e de controlador de consola. Notem também que as propriedades do mosaico mudam no canto inferior direito de acordo com o seu tipo e também mostra "detalhes" da unidade nele.
Isto leva-me a crer que se calhar já poderia começar a trabalhar na base do sistema de internacionalização, mas poderemos falar mais disso para a semana.
Entrentanto estive a trabalhar umas horinhas numa animação de combate simples com a sprite mais elaborada que mostrei no outro dia:
É absurdamente simplista, mas é suficiente por agora para implementar um futuro sistema de animação de combate entre dois personagens.
Agora que penso nisso, deveria dar um nome a este gajo.
Pode ser Zé.
Por acaso, o desenvolvimento deste jogo fez-me voltar a ouvir música como ferramenta de trabalho, portanto vou retormar um hábito antigo de meter aqui uma música da semana, quando me apetecer.