A downloadable project

1. Introdução

O jogo Slingshot Bunny: The Carrot War é um projeto que foi planejado e desenvolvido para a disciplina de Programação Aplicada no curso de Design de Jogos e Entretenimento Digital.

O projeto conta a história de um coelho pirata chamado Slingshot que está em busca da lendária cenoura de ouro. Seguindo as pistas de um mapa, o coelho descobre que o raro tesouro está em uma ilha isolada, tendo que passar por desafios para alcançar seu objetivo.

1.1. Objetivos

O objetivo geral é a criação de um jogo 2D de plataforma.

Objetivos específicos:

  • Definir scripts de forma objetiva;
  • Realizar testes de qualidade;
  • Refinar o jogo.

1.2. Procedimentos Metodológicos

Discussões foram realizadas para definir as mecânicas e estéticas dos personagens e inimigos, além de atribuir funções aos membros da equipe. Foram feitos também brainstormings para gerar ideias de mecânicas e o processo de eliminação para escolher as mais adequadas ao contexto do jogo. As referências foram baseadas em metodologias e características comuns na indústria de jogos de plataforma.

Durante o processo inicial do projeto o foco foi definir elementos básicos do jogo, como algumas mecânicas, gênero, estilo de arte, itens coletáveis, inimigos, personagem principal e objetivo do jogo, assim como uma idealização da estrutura das fases. Em relação à sonorização, foi produzida (porém não implementada)  uma música em 8 bit em um ritmo animado. De efeitos sonoros, foi utilizado assets disponibilizados pelo site Domestika para dano, som de clique ao iniciar, coleta de itens e mortes dos inimigos.

1.2.1. Metodologia de Projeto

Para a metodologia do projeto, foram utilizadas ferramentas específicas para cada área. Para a arte, foi usado o Aseprite para criar artes 2D em píxel arte. A programação foi feita no motor de jogo Unity, e a sonorização foi feita no site BeepBox, onde foi criada a trilha sonora. 

2. Conceito

O jogo Slingshot Bunny: The Carrot Wars é um side-scroller 2D no estilo pixel arte e do gênero plataforma que foi produzido no motor de jogo Unity. Jogos de plataforma envolvem desafios baseados em saltar entre plataformas, equilibrar-se e evitar obstáculos, enquanto o jogador navega por diferentes níveis (Cardoso, 2017). Side-scroller refere-se a jogos que ocorrem em um ambiente 2D, onde os jogadores precisam atravessar cada nível através de uma perspectiva lateral da câmera (Bell, 2017).  

Inicialmente, os assets, que incluem qualquer conteúdo digital como gráficos (personagens, ambientes, etc.), áudio, animações, scripts e outros elementos usados na criação de jogos, foram utilizados conforme o tutorial do curso “Criação de jogos de plataforma com Unity” do site Domestika, já que são disponibilizados pelo site. No entanto, posteriormente, esses assets foram substituídos por materiais desenvolvidos pelas acadêmicas, de forma a garantir maior coerência com a proposta do jogo.

2.1. Mecânicas

O personagem principal do jogo tem como mecânicas básicas andar para frente e para trás com as teclas A e D do teclado e pular com a tecla de espaço. Além disso, ele possui duas opções de ataque. A primeira opção é uma espada, desenvolvida para ataques de curta distância. A segunda opção é pular na cabeça dos inimigos os eliminando. O uso da espada é feito ao clicar com o mouse, executando um ataque direcionado para onde o personagem está virado, seja à esquerda ou à direita.

2.2. Personagens Não Jogáveis

O jogo contará com dois personagens não jogáveis, dois tipos de inimigos terrestres. O primeiro personagem não-jogável é um caranguejo que anda de um lado para o outro e causa dano ao jogador ao entrar em contato com ele. O segundo personagem não-jogável é uma ostra que, quando o jogador encosta nela, morre instantaneamente, não podendo matá-la.

O jogo também conta com itens coletáveis, representados por beterrabas, que aumentam o score do jogador, assim como vidas representadas por corações que também estão espalhadas pelo mapa.

2.3. Telas e Interfaces

A tela de inicio exibirá o nome do jogo e a opção de iniciar (Figura 1). Durante o jogo, o HUD incluirá a quantidade de vidas do personagem e o seu score.

3. Design Técnico

3.1. Motor de Jogo

Unity é um motor de jogo utilizado para criar jogos 2D e 3D. Ele oferece ferramentas fáceis de usar, suporte a várias plataformas (como PC, consoles e dispositivos móveis), também permitindo criar gráficos, física, animações e sons, além de usar scripts em C# para programar a lógica do jogo no Visual Studio Code.  

Para o desenvolvimento da programação, foi utilizado o curso “Criação de jogos de plataforma com Unity” do site Domestika, para assim aprofundar os conhecimentos das acadêmicas sobre a programação do gênero plataforma. Inicialmente, os assets, que incluem qualquer conteúdo digital como gráficos (personagens, ambientes, etc.), áudio, animações, scripts e outros elementos usados na criação de jogos, foram utilizados conforme o tutorial, já que são disponibilizados pelo site. No entanto, posteriormente, esses assets foram substituídos por materiais desenvolvidos pelas acadêmicas, de forma a garantir maior coerência com a proposta do jogo.

3.2. Descrição dos Scripts

Como um primeiro passo, foi criado o Game Object (Unit 1, 2022) “Player”, e foram adicionadas as animações PlayerIdle, PlayerRun e PlayerAir, que são animações para quando o personagem jogável estiver parado, correndo e pulando respectivamente.

Foram adicionados 2 componentes (Unit 2, 2022) ao jogador: Rigid Body 2D (Unity 3, 2022), transformando assim o Game Object Player em um corpo rígido com física; e Box Collider 2D, para que o objeto Player colida com outros objetos que possuem colisão também. Logo em seguida, foi criado o objeto de jogo “ground-0”, que será utilizado como plataforma no jogo, e também foi adicionado o componente Box Collider 2D (Unity 4, 2022).

Um script foi criado para criar os controles do personagem e outros fatores. Foi criada uma variável pública estática do Player obj, para assim ter acesso ao objeto Player e para que todas as propriedades criadas a seguir possam ser acessadas e controladas. Foi também feita a variável pública inteira lives, que representa a quantidade de vida do Player. Em seguida, algumas propriedades públicas foram criadas: a booleana isGrounded (para identificar se o Player está no chão); a booleana isMoving (para identificar se o Player está se mexendo); a inteira isImmune (para identificar se o Player está imune); a flutuante speed (para definir a velocidade do Player); a flutuante jumpForce (para definir a força de pulo do Player); e a flutuante movHor (que tem o valor do movimento horizontal, o movimento do eixo x). Também foram criadas a propriedade pública LayerMask groundLayer, a variável flutuante radius, e a variável groundRayDist para saber se o personagem está tocando o chão ou não.

Para ser possível o acesso dos componentes do personagem, foram criadas as propriedades privadas: uma para acessar o Rigid Body 2D (que será citado como rb), outra para acessar o Animator (que será citado como anim) e por fim para acessar SpriteRenderer (que será citado como spr).

Foram também definidas as variáveis públicas LayerMask enemyLayer, a variável flutuante attackRange, e a variável inteira attack Damage, para detectar os inimigos, definir a distância máxima do ataque e o dano do ataque do Player respectivamente.

Após essa parte, foi criada a função Awake, a primeira função que é executada, que faz com que o objeto seja igual ao objeto que existe na cena. Então é implementada a função privada void OnDestroy, que torna o objeto anunciado no início nulo.

Para a movimentação básica do personagem, na função privada void Update, é igualado o movHor com os inputs do usuário, fazendo assim ser possível mudar os valores do eixo x para positivo ou negativo utilizando as setas ou as teclas A e S do teclado. Na função Start, foi feito com que as variáveis Rigid Body 2D, Animator e Sprite Renderer tenham acesso aos componentes do Game Object Player. Depois desse processo, é criada a função privada void FixedUpdate, que permite mover o personagem utilizando o Rigid Body 2D e na velocidade imposta pela variável speed.

Na função privada void Update, é então estabelecido que isMoving é diferente de 0, o que permite que agora é possível verificar se o personagem está se movimentando ou não. Foi também feito com que seja possível verificar se o personagem está no chão utilizando o isGrounded, o que é muito importante para programar o salto, para que ele só salte quando estiver tocando no chão.

É criada então a função privada void jump, para programar o salto do personagem. Foi adicionada uma condição que não permite que o personagem pule sem estar tocando no chão, e é adicionada também uma força ascendente no personagem através do Rigid Body 2D e utilizando a variável jumpForce criada anteriormente. E então, no void Update, é criada uma condição de que se o jogador clicar a tecla espaço, o personagem pula (é ativada a função jump).

Para que o personagem se vire na direção em que o jogador indicar, foi feita a função Flip, que muda o sprite do personagem de acordo com o valor do eixo x (se é positivo ou negativo), e foi implementada essa função na função Update para que ela seja executada sempre.

Na Unity foi feita a transição entre as animações do personagem utilizando isGrounded, em que se o personagem não estiver tocando o chão, toca a animação PlayerAir, mas para tocar tanto a animação de PlayerIdle quanto a animação PlayerRun ele precisa estar encostando no chão. Também é utilizado o isMoving, em que se o personagem estiver se movendo, pode tocar tanto a animação Player Run quanto PlayerAir, mas não pode tocar a animação PlayerIdle, porque o personagem precisaria estar parado. Assim, com essas condições, é possível definir no script, na função Update, que as animações irão tocar dependendo se as condições isGrounded e isMoving são verdadeiras ou falsas.

Foi criada a função pública void Attack, permitindo que o Player ataque inimigos para a esquerda ou direita, dependendo da sua orientação. Caso o Raycast detecte um inimigo dentro da distância máxima do ataque, ele recebe dano e é destruído.

O Game Object "Enemy" foi configurado com os componentes RigidBody2D e Box Collider 2D para comportamentos físicos e colisões. O script do inimigo inclui variáveis para verificar chão e espaço à frente, prevenindo quedas da camada "ground". Além disso, define a pontuação recebida pelo Player ao derrotá-lo e a vida do inimigo. Caso o Player colida várias vezes com o inimigo, ele pode ser derrotado.

O script Enemy gerencia o movimento e as interações do inimigo. Foi criada a booleana isFacingRight para alternar sua direção ao encontrar bordas ou obstáculos. O comportamento de dano é controlado pela função TakeDamage(), que reduz a vida do inimigo e dispara efeitos visuais antes de sua desativação.

Efeitos visuais e sonoros foram implementados para melhorar a experiência. O AudioManager centraliza sons como o de pulo e coleta de itens, enquanto o FXManager gerencia partículas e outros efeitos durante eventos, como derrotar inimigos.

Um Game Object chamado "Game" foi criado para controlar a pontuação e o estado do jogo. O script Game gerencia ações como reiniciar o nível após a derrota do Player. O UIManager atualiza informações na interface em tempo real, como vidas e pontuação.

Por fim, a câmera foi configurada para seguir o Player, com adição de um efeito de paralaxe nas camadas de fundo, criando profundidade visual ao cenário.

3.3. Inteligência Artificial

A inteligência artificial no projeto foi implementada para definir os comportamentos e padrões de movimentação do inimigo principal.

O inimigo que usa inteligência artificial, o caranguejo, tem movimentos simples, se deslocando lateralmente em uma pequena área. Quando ele detecta a presença do jogador, ele mantém seu padrão de movimento, causando dano ao entrar em contato com o personagem. Caso o jogador saia de seu alcance, o caranguejo continuará patrulhando sua área, movendo-se para frente e para trás de forma cíclica.

3.4. Delineamento de Testes

O delineamento de testes foi simples, focando na verificação de mecânicas, interface, desempenho e balanceamento do jogo. Foram feitos testes manuais que incluem verificar cada parte do jogo (mecânicas e integração) para avaliar o desempenho. O sucesso foi medido pelo funcionamento correto das mecânicas, interface sem erros e desempenho estável. Em versões posteriores serão feitos testes com outros usuários.

4. Considerações Finais

O projeto integra conceitos de design, programação e sonorização para desenvolver uma experiência de jogo equilibrada e coerente. São empregadas metodologias e ferramentas específicas para assegurar a qualidade em todas as etapas do processo, desde a concepção das mecânicas e personagens até a implementação das interfaces e a execução dos testes finais.

Em relação ao ponto negativo, o escopo foi o que mais se destacou. Inicialmente, o projeto deveria conter mecânicas complexas, porém não foi possível implementá-las.

Já para o ponto positivo é que o projeto será continuado permitindo assim avanços e aprimoramentos até que se alcance um resultado satisfatório, se alinhando às expectativas iniciais.

5. Referências

CARDOSO, B. Jogo de plataforma? Saiba tudo sobre esses tipos de games. Disponível em: https://seugame.com/jogo-de-plataforma/<https: seugame.com="" jogo-de-plataforma="">. Acesso em: 10 out. 2024.</https:><https: seugame.com="" jogo-de-plataforma=""> </https:>

<https: seugame.com="" jogo-de-plataforma="">DURÁN, S. Criação de jogos de plataforma com Unity. Disponível em: <https: www.domestika.org="" pt="" courses="" 910-criacao-de-jogos-de-plataforma-com-unity="">. Acesso em: 10 out. 2024d.</https:></https:>

How to write technical design docs. Disponível em: https://dev.to/mage_ai/how-to-write-technical-design-docs-c02 <https: dev.to="" mage_ai="" how-to-write-technical-design-docs-c02="">. Acesso em: 10 out. 2024.</https:>

PREVIOUS ARTICLES. What is Side-Scrolling? [Gaming Definition, Meaning]. Disponível em: https://honeysanime.com/what-is-side-scrolling/ <https: honeysanime.com="" what-is-side-scrolling="">. Acesso em: 10 out. 2024. </https:>

<https: honeysanime.com="" what-is-side-scrolling=""></https:>

RAJPUROHIT, P. The complete workflow for game asset creation. Disponível em: https://300mind.studio/blog/guide-to-game-asset-creation/<https: 300mind.studio="" blog="" guide-to-game-asset-creation="">. Acesso em: 10 out. 2024.</https:>

Unity 1: UNITY TECHNOLOGIES. GameObject. Disponível em: https://docs.unity3d.com/ScriptReference/GameObject.html <https: docs.unity3d.com="" scriptreference="" gameobject.html="">. Acesso em: 10 out. 2024. </https:>

<https: 300mind.studio="" blog="" guide-to-game-asset-creation="">Unity 2: </https:>UNITY TECHNOLOGIES. Component. Disponível em: https://docs.unity3d.com/ScriptReference/Component.html <https: docs.unity3d.com="" scriptreference="" component.html="">. Acesso em: 10 out. 2024b.</https:>

Unity 3: UNITY TECHNOLOGIES. Rigidbody2D. Disponível em: https://docs.unity3d.com/ScriptReference/Rigidbody2D.html <https: docs.unity3d.com="" scriptreference="" rigidbody2d.html="">. Acesso em: 10 out. 2024c.</https:>

Unity 4: UNITY TECHNOLOGIES. BoxCollider2D. Disponível em:  https://docs.unity3d.com/ScriptReference/BoxCollider2D.html <https: docs.unity3d.com="" scriptreference="" boxcollider2d.html="">. Acesso em: 10 out. 2024d.</https:>

Ficha completa da equipe:

Ana Beatriz Aquino Saiss - Artista de personagens/animação/programação/ sonorização/roteiro - aanabeatrizas

Gabriela Lopes Dal Mago -Artista de cenário/level designer/programação/ sonorização/roteiro - gabriela-dal-mago

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) Programação Aplicada - Professor - Marcelo Dornbusch Lopes


Leave a comment

Log in with itch.io to leave a comment.