Celestial Farming Xyan Yu land
A downloadable game for Windows
1 Introdução
É notório a frequência de jogos de fazenda que são lançados no mercado atualmente, principalmente considerado o mercado indie. Jogos como Stardew Valley ou Farming Simulator 22, ambos simuladores de fazenda incrivelmente populares juntando mais de 100 mil jogadores diariamente de acordo com os dados da Steam Data Base. (STEAMDB: ... 2024). O sentimento de satisfação ao ver sua fazenda ou casa crescer baseado em lucros adquiridos pelo seu trabalho é o principal foco desses jogos.
É importante notar que o que trouxe o sucesso para esse gênero de jogo, é a forma que os desafios são trabalhados dentro deles. No artigo da revista digital “Game Developer”, o autor aborda os principais motivos de jogos de fazenda, um bom balanceamento tanto econômico quanto de desafios dentro do jogo. Dentro desse artigo ele aborda que existem diferentes tipos de jogador, aqueles que buscam um jogo mais casual, se dificuldades apenas coletando riquezas e expandindo território, como o exemplo de jogos mobile de fazenda. Outros jogadores prefere uma experiência um pouco mais complexa, mas não necessariamente difícil, mantendo um loop de gameplay que apenas cresce com a medida que os anos dentro dos jogos passam. E por último uma experiência mais difícil ainda, com complexidade elevada ou formas diferentes de falhar. (LIU, 2022)
A relevância de tal balanceamento focando no público alvo desejado foi muito importante, uma vez que o objetivo do projeto é um jogo o qual mistura a satisfação de plantar e crescer o lucro com a possibilidade de perder no jogo o qual muitos simuladores de fazenda não possuem, como inimigos os quais querem destruir a fazenda. Assim adicionando um nível a mais de variáveis as quais o jogador deverá considerar e montar sua estratégia.
2 Desenvolvimento
A decisão de um jogo em duas dimensões fez a escolha do motor de jogo ser a Godot, motor de jogo open source. Por sua facilidade e versatilidade, além de uma maior familiaridade na equipe com o GDscript.
Após a decisão do motor de jogo, a próxima etapa foi fazer um briefing de o que seria necessário, juntar material de estudo e tutoriais, decidir a arte e a mecânica principal do jogo e separar os trabalhos de acordo com a experiência de cada integrante. Duas mecânicas principais serão utilizadas no projeto descrito, mecânica de coleta de plantas ou recursos, e combate contra hordas de inimigos.
Para a parte de programação, o principal recurso utilizado foram tutoriais do Youtube feito pelo canal Chris Tutorials, onde o autor faz um Crash Course(Um tipo de vídeo onde o autor faz passo a passo do zero como fazer um jogo específico.) Sobre jogos de fazenda. A mecânica principal do jogo. Dentro deste vídeo o autor mostra como montar um inventário na Godot utilizando a ferramenta de recursos dentro do motor, como coletar recursos e utilizar diferentes ferramentas sem ter que criar uma cena para cada ferramenta.
No tutorial seguinte foi preciso aprender a fazer as plantas mudarem de estágio, crescerem de semente para adulta. O interessante deste tutorial é que o autor mostra como fazer isso a partir de um node, que controla a cena. Assim caso tenha alguma mecânica em um objeto em específico, não precisará reescrever o código do zero, apenas mudar o node de lugar e referenciar na cena desejada.
Além dos tutoriais, a documentação da Godot foi muito utilizada em momentos os quais os tutoriais não puderam cobrir.
2.1 Conceito
O projeto consiste em um jogo em pixel art, visto de forma panorâmica onde a personagem principal apenas andará para o lado direito e esquerdo da tela. Interagindo com pontos no chão o qual poderá colocar plantas que cresceram com o tempo e darão dinheiro em retorno.
O objetivo da personagem será sobreviver a ondas seguidas de ataques que acontecem todas as noites em sua fazenda. Criaturas que moram nas partes mais distantes do mapa nascerão em pontos específicos e caminharão em direção a base do jogador. Ele deverá montar defesas as quais custarão moedas, que são colhidas pelas plantas que o jogador plantará. Plantas diferentes terão vantagens e desvantagens relevantes para que o jogador escolha o que será melhor para a sua estratégia. Algumas plantas custarão pouco dinheiro e crescerão rapidamente, entretanto terá um retorno baixo para um dinheiro rápido. Uma abobora será de custo elevado, e demorará dias para nascer, mas seu retorno é recompensador.
Com essas variações, o usuário deverá montar uma estratégia a base de tempo e dinheiro que são os recursos principais do jogo. Com esse dinheiro, ele poderá comprar muros e torres que defenderão sua base contra o ataque dessas criaturas. As torres por si só terão vantagens e desvantagens. Algumas atirarão mais rapidamente, com dano baixo o qual derrotará criaturas fracas as quais vem em grande número. Outras torres são mais lentas, mas tem dano elevado. Cada uma tendo um valor relevante dentro do objetivo do jogo.
2.1 Personagens
O jogo aqui abordado contém um personagem principal e dois tipos de inimigos, que serão explicados nos tópicos a seguir, tendo em mente que tanto a arte da personagem principal quanto a dos inimigos é feita em pixelart, uma forma de arte 2D que tem seus elementos principais como pixels, que significa o menor ponto de uma imagem digital.
2.1.1 Personagem principal
A personagem principal é uma garota por volta de seus 20 anos com sua estética de roupa baseada em vestidos da cultura chinesa e japonesa atuais e também em outras personagens de desenho animados como por exemplo as personagens femininas do anime Ranma ½; a personagem Kagura do anime Gintama e a personagem Lan-Mao de Kuroshitsuji.
A paleta de cores da garota consiste em tons majoritariamente claros, que combinam com a vida na fazenda e que trazem paz ao ver. As cores remetem a um morango, pois rosa é a cor principal do vestido, usado em par com um verde que combina com as plantas do ambiente em que ela vive.
A personagem usa um vestido comprido rosa claro com aberturas do lado das pernas, uma fita com laço como nos quimonos tradicionais japoneses chamada de Obi e uma espécie de parte de cima como um casaco curto em verde, de mangas compridas. Ela usa saltos delicados em um tom de rosa mais escuro adornado com laços e com uma sola verde. O cabelo da personagem é marrom claro e está preso em 2 coques com tranças compridas saindo deles, esse é um penteado bem inspirado na cultura chinesa, principalmente nos penteados tradicionais da cultura.
2.1.2 Inimigos
Os inimigos apresentados no jogo aqui descrito são pernilongos e louva-a-deus. Os dois tipos de inimigo serão apresentados de lado, mostrando toda uma face de seus corpos, a do pernilongo tendo o corpo todo marrom escuro, inspirado nesses insetos da vida real. Junto desse marrom do corpo, eles possuem vermelho destacado na barriga, antenas e no pelo do tórax. Tais inimigos também possuem asas um pouco transparentes para voar por obstáculos e atacar o personagem com seu bico.
As cores marrom e vermelha foram escolhidas para, com o marrom, retratar a cor verdadeira do pernilongo e diferenciá-lo de um mosquito como o da dengue. Já a cor vermelha é usada para retratar crueldade, arrogância, perigo e violência, que são sentimentos que essa cor geralmente passa e podemos ver em muitos personagens tidos como maus por aí.
O outro inimigo do jogo, o louva-a-deus, será verde assim como o inseto real. Dessa vez esse inimigo será todo verde, mesclando tons escuros e claros em seu corpo e seus olhos serão vermelhos, ficando em destaque do verde por serem cores complementares.
2.2 Programação
Primeiramente o necessário era construir uma mecânica a qual as plantas crescem com o passar do tempo, ou ao ativar algum botão. Para isso foi de extrema ajuda os tutoriais do canal do youtube Chris Tutorial’s, o mesmo faz um crash course(Tipo de vídeo o qual mostra do zero como montar o específico tipo de jogo proposto.) de farming simulators.
Com a Godot, crie uma nova cena. Essa cena vai ser a base da planta, o primeiro estágio dela, normalmente começando com uma semente. Coloque como filho, o sprite 2d da semente escolhida, em seguida uma collision shape e por ultimo um node 2d, este node 2d será o controlador dos estágios das plantas, nele coloque um script anexado.
Figura 1 - Godot
Fonte: Autoral
Ao colocar o script no node separado, dará a liberdade para reutilizar essa mesma mecânica em outras plantas sem ter que escrever um código individual para cada. Agora abra o script.
No script é preciso criar uma classe para esse componente para facilitar achar ele futuramente.
Figura 2- Godot Script
Fonte: Autoral
Os sinais vão passar as informações e manter o node checando sobre a idade da planta e se chegou ou não na idade necessária para crescer. Isso pode ser decidido a partir de um botão ou de tempo.
Crie as variáveis para armazenar os valores do alvo, que será o node que será mudado. A idade, que precisará de uma função para definir seu valor na hora que mudar e emite o sinal de mudança de idade.
Figura 3- Godot Script
Fonte: Autoral
Dentro da mesma função é preciso colocar uma condição que verifique se a idade da planta chegou na idade alvo para mudar de estágio. Será preciso criar a função que armazena e muda para a próxima cena. É importante criar uma booleana que avise que a idade alvo foi alcançada e faça essa condição rodar apenas uma vez. Também é importante retirar a cena anterior utilizando o queue_free.
Figura 4 - Godot Script
Fonte: Autoral
Crie as variáveis para armazenar o valor da idade limite da planta antes de mudar de estágio, e a packedScene que armazena qual cena alvo esta deverá ir. Para facilitar manusear diversas plantas diferentes, como o de costume em um jogo de simulador de fazenda, crie um grupo e coloque este node nele.
Figura 5 - Godot Script
Fonte: Autoral
Também para facilitar. Crie uma função que define que se nenhum alvo for decidido, o pai da cena será o alvo.
Figura 6 - Godot Script
Fonte: Autoral
Agora crie a função que foi definida anteriormente para retornar um node2d para o valor da nova cena. Nesta função será instanciado a nova cena, que poderá ser selecionado manualmente pelo usuário.
Figura 7- Godot Script
Fonte: Autoral
Em seguida é necessário criar o fator que irá começar a mudar a idade da planta. No caso da m2 foi selecionado com o clique de um botão. Crie um node de botão na sua cena de hud e uma variável de quantas unidades de idade serão mudadas por clique.
Figura 8 - Godot Script
Fonte: Autoral
Agora conecte o sinal de que os nodes de botão tem chamado _on_pressed. Nele crie essa função abaixo para checar se na cena existem nodes com o componente de aumentar de idade, caso sim, adiciona mais um em sua idade dentro da cena.
Figura 9 - Godot Script
Fonte: Autoral
Esse é apenas um failsafe (Uma forma de checar caso de erro) que retornará uma mensagem de erro.
Figura 10 - Godot Script
Fonte: Autoral
Com as plantas funcionando, o que falta é o jogador principal.
A movimentação é básica com apenas caminhar e correr para ambos os lados, além de uma ação de ataque e interagir com objetos. Com a criação de um node CharacterBody2d a movimentação básica já está encoberta. Tirando apenas o pulo, que não será utilizado neste projeto. Foi criado os inputs para movimento axial, interação a qual será utilizada para comprar itens e o ataque para se defender das hordas de inimigos.
Jogador
Para o jogador, comece com as variáveis que serão utilizadas. Para ele precisa-se de vida, um ataque o qual no projeto foi decidido que terá munição e ataques diferentes e por fim algum lugar para armazenar essas informações.
Figura 11 - Godot Script
Fonte: Autoral
Em seguida crie as variáveis que definem se pode ou não atacar, além de dizer qual munição está equipada.
Figura 12 - Godot Script
Fonte: Autoral
Cada talismã será uma munição diferente, com efeitos diferentes. Para isso será necessário criar novas cenas que trarão as informações dessas munições. Em nova cena, crie um CharacterBody2d. Adicione Sprite, colisão e uma área2d para detectar os objetos que entram nele.
Figura 13 - Godot Script
Fonte: Autoral
Em seguida coloque este node em um grupo para facilitar o acesso as informações desta árvore. Agora é preciso criar as variáveis que darão o movimento para o projétil.
Figura 14 - Godot Script
Fonte: Autoral
Para que o projétil seja deletado depois de disparado, adicione um timer com Queue_free ao final dele. Logo depois precisa-se do método que fará os projetis detectarem os inimigos, e danificar eles, desaparecendo depois.
Figura 15 - Godot Script
Fonte: Autoral
Os inimigos terão essa função dentro dos seus scripts chamada tomar dano, dentro do script da bala faça uma variável editável com o nome de dano para passar isso para o inimigo assim, tirando sua vida até chegar ao zero.
Com a munição criada, retorne ao script do personagem e referencie a cena das munições, para poder instanciar elas.
Figura 16 - Godot Script
Fonte: Autoral
Crie uma função que instancie a cena criada do disparo e chame ela toda vez que apertar a tecla de disparo. É importante definir o local de onde esses disparos vão começar. Para isso, crie um Marker2d e coloque onde os disparos sairão. Referencie este marcador e coloque para os disparos saírem a partir dele.
Figura 17 - Godot Script
Fonte: Autoral
Para a vida do personagem mudar, crie uma função para tomar dano e passe para ela a informação do dano. Esta função pode ser utilizada em qualquer entidade que tenha vida e receba dano. Apenas mude o dano dentro da entidade causadora de dano.
Figura 18 - Godot Script
Fonte: Autoral
Inventário
Para armazenar os itens de forma que eles possam ser acessados na loja dentro do jogo, é necessário criar um Autoload que armazenará as informações dos itens, custos e quantidade. Fazendo um dicionário.
Figura 19 - Godot Script
Fonte: Autoral
Crie a variável e atribua os valores dessa forma. Colocando a posição no inventário e as descrições abaixo. Esses itens são os itens que existem no jogo, e aqui eles estão apena sendo salvos para uso dentro do jogo, seja para comprar ou adquirir de outras formas. Em seguida crie o inventário da mesma forma, entretanto deixando vazio caso o jogador comece sem nenhum item.
Para poder adicionar devido item no inventário do jogador, é necessário fazer uma função que fará um loop no dicionário de itens para achar o item desejado.
Figura 20 - Godot Script
Fonte: Autoral
Caso ele não exista no inventário do jogador, adiciona ele e aumenta o dicionário dele.
Figura 21 - Godot Script
Fonte: Autoral
Inimigo
Para criar o inimigo, comece com um characterbody2D, e adicione Sprite, colisão, e uma area2d a qual vai detectar e danificar o jogador ao entrar nela. No final sua cena deve estar assim.
Figura 22 - Godot Script
Fonte: Autoral
Coloque um script no characterbody2d e adicione as variáveis que vão definir a vida, velocidade e checar se o jogador está na área de perseguição.
Figura 23 - Godot Script
Fonte: Autoral
No physics_process, faça uma condição para checar se o inimigo ainda possui vida. Caso ela chegue a 0 delete o node.
Figura 24 - Godot Script
Fonte: Autoral
Crie a função de movimento. Para isso é necessário pegar a posição do jogador. Referencie e atribua o valor da autoload criado anteriormente. Em seguida coloque a velocidade passeada na posição do player e multiplique pela velocidade.
Figura 25 - Godot Script
Fonte: Autoral
Da mesma forma que foi criado nos projeteis anteriormente, crie uma função que detecta o corpo que entre na área2d do inimigo. Caso o que entre seja da classe Player. Rode a função tomar dano. Importante passar a informação dano criada nas variáveis do inimigo.
Figura 26 - Godot Script
Fonte: Autoral
Coloque a função tomar dano no morcego também, para que ele possa ser danificado pelos projeteis.
Figura 27 - Godot Script
Fonte: Autoral
Agora precisa-se colocar os inimigos dentro da cena principal, para que eles apareçam dentro de um determinado período de tempo. Na cena principal, crie um Marker2d e adicione um script na cena. Neste script deve salvar a cena do inimigo para usar dentro do script.
Figura 28 - Godot Script
Fonte: Autoral
Como os inimigos deverão vir em ondas, as quais ficam mais difíceis a cada onda é necessário criar uma variável para salvar os valores de qual onda o jogador está, e quantos inimigos deverão aparecer.
Figura 29 - Godot Script
Fonte: Autoral
Agora crie uma função que cria inimigos baseado na variável de inimigos por onda criado anteriormente. A cada inimigo que aparecerá no mapa, tirará um deste contador e assim irá até os inimigos acabarem.
Figura 30 - Godot Script
Fonte: Autoral
Crie um timer na cena para que ao acabarem os inimigos, ele comece a contar. E ao chegar ao zero ele adiciona um inimigo na onda, e recomeça. Adicionando um desafio a cada onda.
2.3 Discussão dos Resultados
O projeto foi feito em conjunto com a aula de Projeto, com foco em mecânicas de balanceamento. No primeiro momento decidimos uma aproximação talvez grande demais em relação ao projeto, tower defense com mais de um personagem e diversos inimigos. Com o início do projeto e os testes de mecânica o escopo teve que ser reduzido.
Mudamos o projeto para um shoot ‘em up, onde hordas de inimigos atacam o jogador e sua plantação de forma que ele deverá construir bloqueios, comprar munição e semente a tempo de que possa proteger sua base e sobreviver. Com o conhecimento limitado de programação do grupo isso já se tornou uma dificuldade, atrasando o projeto em diversos momentos.
Foi satisfatório o resultado entretanto, pois ao instalar o sistema de inventário e loja dentro do projeto, o jogo começou a funcionar de forma fluida e deixou fácil de poder adicionar mais ingredientes no futuro. Considerando o projeto todo, o conhecimento adquirido foi bem satisfatório.
As mecânicas ainda são simples, o que necessita ser mudado até o final do semestre. Na primeira onda de testes, os jogadores acharam que a dificuldade do jogo estava baixa, e o orientador aconselhou a aumentar a complexidade. A ideia é adicionar uma maior variedade de inimigos e defesas as quais poderão auxiliar o jogador tanto na redução de velocidade dos inimigos, quando danificando eles.
3 Conclusão
Neste projeto foi analisado como é importante o balanceamento de um jogo para o entretenimento de seu jogador dentro do mercado e como programar os principais pontos do jogo proposto pelo grupo. Como fazer as plantas crescerem, criar inimigos que aparecem a partir de um tempo específico e como fazer um inventário através da função de dicionário da Godot.
Durante a produção do projeto foi intrínseco notar a necessidade de conhecimentos mínimos na logica de programação. Os tutoriais foram de grande ajuda, mas uma vez que os códigos foram entendidos, o resto era por conta dos conhecimentos prévios em lógica. O trabalho fluiu com alguns impedimentos, por parte da programação, uma vez que que o grupo teve dificuldade em entender como fazer algumas mecânicas funcionarem, entretanto quando foi estudado pode ser aplicado tais mecânicas. Mesmo que no final deste projeto toda a proposta inicial não tenha sido aplicada, os conhecimentos aplicados de programação dentro dele foram elevados, aprendendo diversas formas diferentes de resolver problemas. O projeto não será finalizado por aqui pois o objetivo ainda é deixar mais complexo, uma vez que o objetivo é ter uma grande variedade de mecânicas as quais podem ser balanceadas.
Referências
STEAMDB: Stardew Valley. 2024. Disponível em: https://steamdb.info/app/413150/charts/. Acesso em: 13 maio 2024.
LIU, Yongcheng. Why Players become obsessed with “farming games”? 2022. Disponível em: https://www.gamedeveloper.com/game-platforms/why-players-become-obsessed-with-farming-games-#close-modal. Acesso em: 13 maio 2024.
CHRIS. Farming & Crop Ageing Mechanics Tutorial for 2D Godot 4 Games. 2023. Disponível em:
Acesso em: 13 maio 2024.
CHRIS. Crash Course ~ How to Make a Resource Gathering Game in Godot 4! 2023. Disponível em:
Acesso em: 13 maio 2024.
BECKER, Alexander; GÖRLICH, Daniel. What is Game Balancing? An Examination of Concepts. Paradigm Plus, Heidelberg, v. 1, n. 1, p. 22-41, abr. 2020. Disponível em: https://www.researchgate.net/publication/340849177. Acesso em: 13 maio 2024.
MALCOLM, Bill; MAKEHAM, Jack; WRIGHT, Vic. The Farming Game: agricultural management and marketing. 2. ed. Cambridge: Cambridge University Press, 2005. 275 p.
GAME Balance Concepts. 2010. Disponível em: https://gamebalanceconcepts.wordpress.com/2010/07/07/level-1-intro-to-game-balance/. Acesso em: 13 maio 2024.
REIS, Alessandro Vieira dos. Artigo: Então você precisa balancear um jogo!? 2016. Disponível em: https://www.fabricadejogos.net/posts/entao-voce-precisa-balancear-um-jogo/. Acesso em: 13 maio 2024.
----
Ficha completa da equipe:
Danniel Lopes Chagas- Programador/Produtor/Lead Game design/Product Manager/QA -
João Henrique- Artista
João Seixas- Musica/Sonorização
Nicole de Moraes Lewadowski- Artista/Lead Art design-Hime_nikki
Yasming Adria Fornero- Artista
...
Marcelo Dornbusch Lopes - Orientador - m4rc3lo
Dennis Kerr Coelho
Universidade do Vale do Itajaí - UNIVALI
Cesar Albenes Zeferino | Diretor Escola Politécnica
Giorgio Gilwan | Coordenador do Curso de Design de Jogos
Rafael Kojiio | Coordenador Gamelab UNIVALI
----
Projeto desenvolvido como requisito parcial para obtenção de aprovação nas disciplinas: (i) Motores de Jogos Avançados - Professor - Marcelo Dornbusch Lopes; e (ii) Dennis Kerr Coelho
Status | Released |
Platforms | Windows |
Author | NecroBirb |
Genre | Action |
Tags | Farming, Farming Simulator, Pixel Art, Shoot 'Em Up, Side Scroller |
Download
Install instructions
Extraia o arquivo
Jogue
Controles:
F para pegar plantas e interagir.
C para plantar.
Clique para atirar.
Colha plantas para conseguir dinheiro, compre sementes na loja e munição. Proteja-se das hordas
Leave a comment
Log in with itch.io to leave a comment.