Pedroam14 (discussão | contribs)
Pedroam14 (discussão | contribs)
 
(Uma revisão intermediária pelo mesmo usuário não está sendo mostrada)
Linha 237: Linha 237:
** Usuário volta ao Loop de jogo com sua skill sendo utilizada.
** Usuário volta ao Loop de jogo com sua skill sendo utilizada.
<br><br>
<br><br>
==Protótipo==
== Protótipo ==
===Demonstração===
===Demonstração===
[[Arquivo:Gameplay.mp4]]
[[Arquivo:Gameplay.mp4]]
====Trechos comentados da demonstração====
<br>
*O código responsável pela câmera seguir o personagem, que ocorre enquanto ele se locomove é o seguinte:
var target : Transform;
var distance = 3.0;
var height = 3.0;
var damping = 5.0;
var smoothRotation = true;
var rotationDamping = 10.0;
var lockRotation : boolean;
function Update () {
var wantedPosition = target.TransformPoint(0, height, -distance);
transform.position = Vector3.Lerp (transform.position, wantedPosition, Time.deltaTime * damping);
if (smoothRotation) {
var wantedRotation = Quaternion.LookRotation(target.position - transform.position, target.up);
transform.rotation = Quaternion.Slerp (transform.rotation, wantedRotation, Time.deltaTime * rotationDamping);
}
else transform.LookAt (target, target.up);
if(lockRotation){
transform.localRotation = Quaternion.EulerAngles(0,0,0);
}}
<br>
O código usa a variável do tipo Transform, que trata-se de uma variável de posição tridimensional (pois embora o jogo seja em 2D, a plataforma usada para a criação do protótipo foi em 2D).
* Para o deslocamento das plataformas e dos inimigos foi usado o mesmo código, que é o código a seguir:
#pragma strict
private var Xpos : float;
private var Ypos : float;
private var max : boolean;
var Vert : boolean;
var maxAmount : int;
var step : float;
function Start () {
Xpos = transform.position.x;
Ypos = transform.position.y;
}
function Update () {
if(Vert) {
if(transform.position.y >= Ypos + maxAmount) {
max = true;
} else if(transform.position.y <= Ypos){
max = false;
}
} else {
if(transform.position.x >= Xpos + maxAmount){
max = true;
} else if(transform.position.x <= Xpos){
max = false;
}
}
if(Vert) {
if(!max) {
transform.position.y += step;
} else {
transform.position.y -= step;
}
} else {
if(!max) {
transform.position.x += step;
} else {
transform.position.x -= step;
}}}
<br>
Como podemos ver, a variável do tipo transform é usada em praticamente todos os scripts do jogo. E para determinar se o movimento da plataforma será vertical ou não, usamos a variável do tipo Boolean, que caso for marcada como vertial o código executará um movimento em transform.position.y e não em transform.position.x.
*Para passar de fase na porta branca, foi utilizado um código extremamente simples:
#pragma strict
var Level = "";
function OnTriggerStay(other : Collider){
if(other.tag == "Player"){
if(Input.GetKeyUp("up")){
Application.LoadLevel(Level);
}
}}
<br>
Esse código verifica se o jogador está na frente da porta, e teclando a tecla direcional para cima. Quando isso ocorre ele carrega a próxima fase.
===Diagrama de Sequência===
===Diagrama de Sequência===
[[Arquivo:DiagramadeSequênciaGame2D.png]]
[[Arquivo:DiagramadeSequênciaGame2D.png]]
===Diagrama de Estados===
===Diagrama de Estados===
[[Arquivo:DiagramadeEstadosGame2D.png]]
[[Arquivo:DiagramadeEstadosGame2D.png]]

Edição atual tal como às 01h10min de 6 de março de 2014

  • Nome do Projeto:

What


  1. Qual o objetivo deste projeto?
    1. O objetivo do projeto é criar um game 2d de plataforma aos moldes de grandes jogos como Mario e Sonic que mesmo décadas após o seu início ainda se mantém como um grande referencial em todo o mercado.
  2. Quais os maiores desafios, na sua opinião, para se realizar este trabalho?
    1. Habilidade em programação para a composição dos códigos dos scripts de animações e de todas as mecânicas que serão utilizadas no game.
    2. Habilidade artística em geral, desde noções básicas de level design a fazer sprites, backgrounds e a trilha sonora do game.
  3. Quais os conhecimentos básicos que devemos ter para se implementar este projeto?
    1. Conhecimentos de programação, preferencialmente de linguagens como Java e C++ que são linguagens orientadas a objetos.
  4. Quais soluções similares existem no mercado (Benchmarking)?
    1. Existem diversos games em 2D de plataforma no mercado, mas como o Unity será a tecnologia de desenvolvimento escolhida, games como Bad Piggies (que usaram da mesma engine para ser desenvolvido) são um melhor referencial para uma solução similar, embora não seja exatamente do mesmo gênero.


Why

  1. Porque é interessante desenvolver este projeto?
    1. O mercado de games apresentou um crescimento exponencial nos últimos anos, e um dos mercados que mais crescem são os de jogos denominados Indie, que tem times de desenvolvimento extremamente pequenos e orçamentos bem limitados. Embora possuam suas limitações os jogos Indie estão recebendo cada vez mais apoio de grandes distribuidoras de jogos como a Valve com o programa Steam Greenlight e a Sony com o Playstation Loves Indies, o que possibilitou o enorme sucesso de games feitos por times com menos de 10 pessoas como Journey, Hotline Miami e Soundshapes.
  2. Porque deve usar a tecnologia escolhida?
    1. A engine Unity 3D por mais que tenha seu foco voltado ao desenvolvimento de jogos em 3D, se utilizada da maneira correta, pode também ser usada ao fazer jogos em 2D. Suas maiores vantagens além da facilidade de uso está na possibilidade de fazer o port de um jogo para vários sistemas diferentes (como Windows, Linux, Android e iOS) de forma muito veloz e principalmente no fato de ser uma engine gratuita (com a opção de uma versão Pro sendo esta paga).


Who

  1. Quem pode se beneficiar deste projeto?
    1. Gamers em geral são beneficiados, mas os desenvolvedores e distribuidores também pois se trata de um produto a ser vendido.
  2. Quem poderá operar o sistema?
    1. Qualquer pessoa com as ferramentas básicas de input em um computador, isto é, um mouse e um teclado.
  3. Quem deverá participar do desenvolvimento do sistema?
    1. Para o desenvolvimento do sistema seriam necessários um time de programadores e um de direção artística em geral, pois como se trata de um projeto desenvolvido por poucas pessoas, e não por enormes times de desenvolvimento, os times seriam menos especializados em uma única área e dividiriam as funções de várias áreas como o desenvolvimento de uma história (se necessário), da trilha sonora, do level design e ao mesmo tempo os programadores tendo que fazer isso ser implementado ao game de forma funcional e principalmente divertida.


Where

  1. Onde os dados serão inseridos?
    1. O input de dados em qualquer game geralmente não é visível, e sim causa um efeito direto no que está acontecendo no jogo fazendo por exemplo o personagem se mover. Então os dados seriam inseridos no próprio game quando os botões de comando forem pressionados ou ao utilizar os menus do game.
  2. Onde os dados serão externalizados, publicados?
    1. Os dados seriam externalizados na própria tela, na forma, por exemplo, do personagem se movendo.
  3. Onde esta aplicação poderá ser usada?
    1. O game seria feito disponível nos sistemas Macintosh, Linux e Windows sem muitas dificuldades, sendo também possível criar uma versão para Android e iOS adaptando o game para que funcione utilizando de uma touchscreen.
  4. Onde os dados serão armazenadas?
    1. Os dados seriam armazenados no próprio dispositivo. Caso o game seja disponível na Steam, Playstation Network ou Xbox LIVE seria possível criar os seus "saves" e armazená-los por exemplo na Steam Cloud.
  5. Onde o software deverá ser hospedado?
    1. O software seria hospedado em qualquer distribuidora, visto que games Indie não utilizam de cópias físicas como os DVDs e Blu-Rays. Então ele se encontraria hospedado nos servidores da Valve com o Steam, ou nos da EA com o Origin, ou nos da Sony com a Playstation Network.


When

  1. Em quanto tempo pretende desenvolver o sistema?
    1. Em um período de aproximadamente 3 meses seria possível desenvolver o game com um bom nível de qualidade e até mesmo corrigir os bugs notados em playtesting, pois não se trata de um projeto em larga escala.
  2. Quais serão as fases e em quanto tempo cada uma?
    1. Primeiramente seria necessário preparar os scripts e os sprites necessários para conseguir começar o desenvolvimento do projeto, o que com a ajuda de sprites gratuitos fornecidos por artistas online ou até mesmo pela Unity isso levaria poucos dias.
    2. Depois das fundações estarem prontas, a fase seguinte estaria em desenvolver as mecânicas de jogo como controle de câmera, controle do personagem, inteligência artificial dos inimigos, fundos em paralaxe, animações, efeitos de mapa e o HUD (Head-up Display), o que levaria pouco mais de um mês para ser realizado.
    3. Por último, o resto do tempo seria utilizado no desenvolvimento final, como a confecção dos mapas, implementação da trilha sonora e a transição das cenas criadas no game.


How

  1. Como será dividido o desenvolvimento do sistema?
    1. O desenvolvimento do sistema seria separado entre o time artístico e o time de programadores que embora cada time estivesse encarregado de suas funções a comunicação constante entre ambos seria fundamental para que o game seja desenvolvido de maneira eficaz, pois a visão que o time artístico tem pro jogo deve ser tornada concreta pelo time de programação.
  2. Como será feita a entrada de dados?
    1. A entrada de dados será feita da forma tradicional, com um mouse e um teclado.
  3. Como será feita a saída de dados?
    1. A saída de dados será feita pelo monitor e pelo sistema de som do usuário.
  4. Descreva a 1a. funcionalidade?
    1. O game deverá receber input enviado pelo usuário, seja por um controle ou por um teclado, e processar esses dados dando o feedback visual adequado.
  5. Descreva a 2a. funcionalidade
    1. O game deverá ter várias animações e coisas que ocorrerão paralelamente e serão mostradas juntamente ao input do usuário, ou a ausência dele, como por exemplo:
      1. Animação para personagem em standby quando o usuário não aperta botão algum.
      2. Animação para o personagem correndo quando pressionada as teclas direcionais.
      3. Animação para o personagem pulado ao se apertar o botão correspondente a esse comando (como barra de espaço em um teclado ou o X em um controle Dualshock).
      4. Animação para o personagem morrendo quando for ativado este evento por qualquer fator.
      5. Animação para personagem sofrendo dano caso for ativado este evento por qualquer fator.
      6. Fundo em paralaxe acompanhando todos os movimentos do personagem.
      7. Câmera acompanhando os movimentos do personagem ou de algum evento cinemático que venha a acontecer.
      8. Transição de cenas e áreas do mapa.
      9. Efeitos de som para todas as animações e efeitos que ocorrem nas interações entre o jogador e o mapa.
      10. Trilha sonora que acompanha e varia vários segmentos do jogo, cada música deveria acompanhar o momento do game no qual o jogador se encontra, para ajudar a criar um ambiente mais imersivo para o jogador.


How much

  1. Quanto deverá custar o sistema?
    1. Para ser feito com alto nível seriam necessários alguns milhares de reais, utilizados principalmente na compra de licenças.
  2. Quantas pessoas deverão ser usadas?
    1. Com 2 times de aproximadamente 4 pessoas e formando parcerias com outros artistas e programadores caso for necessário seria possível a realização de um game de qualidade.
  3. Qual deverá ser o preço de aquisição do seu software para o usuário final?
    1. Para o usuário final seria cobrado um preço na faixa de 5 a 10 dólares.


Diagrama de Entidade-Relacionamento


Objetos

  • Personagem: um objeto do tipo Container, tendo portanto vários outros objetos "dentro" dele. Possui como atributos seus sprites, itens, stats, equipamento, experiência, meshes de colisão, texturas, sons e nível. As suas ações são compostas por vários scripts que vão agir dependendo do input que o jogador faz, como por exemplo pular, atacar, andar, correr e diversas interações com o mapa.
  • Inimigos: um objeto muito similar ao jogador, também contendo os mesmos atributos que um jogador, porém diferentemente dos atributos do jogador que vão mudando a media que o jogo progride, os atributos dos inimigos são estáticos e pré-determinados. Assim como seus atributos, as ações que um inimigo poderia fazer seriam determinadas pela inteligência artificial contida nele.
  • Mapa: O mapa também é um objeto do tipo container, seus atributos são as texturas, sons, BGM e imagens de fundo. Suas ações são determinar quais tipos de inimigo vão surgir ali, além de itens achados, e as interações possíveis de serem feitas ali (como subir escadas, abrir e fechar portas).
  • Câmera: O mais fundamental de um game é a câmera, pois mesmo que ela em si não seja visível, ela que permite que o jogador veja o que se passa ao longo do jogo. Os atributos que ela possui estão na sua forma, no caso desse jogo, para dar um efeito mais agradável para o jogador, ela não será um ponto recebendo luz de todas as direções, e sim um plano que recebe somente a luz que chega perpendicularmente a ele. As ações da câmera consistem basicamente em acompanhar a posição do jogador, tirando as cutscenes, que nelas a câmera deveria se mover de uma forma pré-programada.

Diagrama de Classes

Arquivo:DiagramadeClassesGame2D.pdf

Diagrama de Casos de Uso

Arquivo:DiagramadeCasodeUsoGame2D.pdf

Detalhamento de Casos de Uso


Requisitos Não-Funcionais do Aplicativo:

  • Transições rápidas entre fases.
  • Delay mínimo entre o input de comandos do usuário e o que ocorre na tela.
  • Acessível de todas as plataformas.
  • Atendendo todas as leis de Direitos Autorais.



Nome do Caso de Uso: Menu Principal.
Ator: Jogador.
Pré-Condição: Iniciar o arquivo executável do jogo.
Pós-Condição: Abre o menu principal.
Sequência de Eventos:

  • Usuário clica no arquivo executável.
  • São carregadas as informações necessárias.
  • Menu de opções é carregado na tela.
  • Usuário clica em Novo Jogo
  • O jogo passa para o Loop de jogo principal.

Sequências Alternativas:

  • Usuário clica em carregar jogo.
    • Save File é carregado no último estado em que o jogador o salvou.
  • Usuário clica em Sair do Jogo
    • O executável é fechado.
  • Usuário clica em Menu de opções.
    • Jogo passa para o Menu de opções.



Nome do Caso de Uso: Loop de Jogo.
Ator: Jogador.
Pré-Condição: Selecionar as opções: Novo jogo ou Carregar jogo.
Pós-Condição: O jogo começa de facto.
Sequência de Eventos:

  • Usuário em Novo Jogo/Carregar jogo.
  • São carregadas as informações necessárias.
  • O mapa de jogo é exibido, junto com o jogador em sua posição inicial, as posições iniciais dos inimigos e é mostrada a barra de HP e Mana do jogador.
  • O estado do jogo é constantemente atualizado, checando hitboxes, HP, Mana, Experiência, ações dos inimigos.
    • O jogador passa de fase.
    • Próxima fase é carregada e o loop prossegue.

Sequências Alternativas:

  • O jogador morre.
    • Carrega mensagem "You Died. Press any button to go back to the main menu."
    • Usuário tecla uma tecla qualquer.
    • Usuário retorna ao Menu Principal.
  • O jogador passa de nível.
    • Player Menu é aberto.
  • O jogador aperta Pause.
    • Abre o menu de Pause
  • O jogador tecla o botão que abre o Player Menu.
    • Player menu é aberto.




Nome do Caso de Uso: Pause.
Ator: Jogador.
Pré-Condição: Teclar o botão que pausa o jogo.
Pós-Condição: Carrega o menu do pause.
Sequência de Eventos:

  • Usuário tecla o botão do pause. (Esc é a tecla mais usada).
  • São carregadas as informações necessárias.
  • Menu do pause é carregado na tela.
  • Usuário clica em Salvar Jogo
  • Um arquivo com o seu Save File é criado, e caso existente ele é reescrito.

Sequências Alternativas:

  • Usuário clica em Sair de jogo (o sair de jogo do Pause só retornará o jogador ao Menu Principal, diferentemente do sair de jogo do Menu Principal que fechará o jogo.
    • Usuário retorna ao Menu principal
  • Usuário tecla Carregar jogo.
    • Ultimo save file é carregado.
  • Usuário tecla pause novamente.
    • O jogo é despausado e retorna ao Loop de jogo.



Nome do Caso de Uso: Menu de Opções.
Ator: Jogador.
Pré-Condição: Escolher essa opção no Menu Principal.
Pós-Condição: Faz alterações em opções como brilho e áudio.
Sequência de Eventos:

  • Usuário abre o menu de opções do menu principal.
  • São carregadas as informações necessárias.
  • Menu de opções é carregado na tela.
  • Usuário seleciona a dificuldade "Difícil." (Modifica os parâmetros dos inimigos multiplicando todos por uma constante maior que 1).
  • Usuário retorna ao Menu Principal.

Sequências Alternativas:

  • Usuário abre a opção de modificar Vídeo/Áudio.
    • Usuário aumenta o volume do jogo.
    • Usuário abaixa o brilho da tela.
    • Usuário retorna ao menu principal.



Nome do Caso de Uso: Player Menu.
Ator: Jogador.
Pré-Condição: Teclar o botão que abra o player menu.
Pós-Condição: Modifica equipamentos, skills, itens e 'hotkeys' do jogador.
Sequência de Eventos:

  • Usuário abre player menu.
  • São carregadas as informações necessárias.
  • Player menu é mostrado na tela.
  • Usuário atribui os pontos de seu último Level Up nos atributos desejados.
  • Usuário fecha o Player Menu e volta ao Loop de jogo.

Sequências Alternativas:

  • Usuário abre o Player Menu.
    • Usuário abre a sua seleção de habilidades (Skill tree).
    • Usuário aloca pontos nas habilidades desejadas (Caso uma skill anteriormente tinha 0 pontos ela é então liberada, cada ponto adicional irá aumentar o seu efeito, seja ele dano, cura, ou aumento temporário de um parâmetro).
    • Usuário fecha o player menu e volta ao Loop de jogo.
  • Usuário abre o player menu.
    • Usuário troca a armadura e a espada de seu personagem por uma de melhores parâmetros.
    • Usuário fecha o player menu e volta ao Loop de jogo.
  • Usuário abre o player menu.
    • Usuário abre a sua Skill tree.
    • Usuário aloca uma skill de sua preferência a tecla '1' de seu teclado, para que quando ele a tecle em combate a skill seja usada sem a necessidade de abrir o player menu novamente.
    • Usuário fecha o player menu e volta ao Loop de jogo.
  • Usuário abre ao player menu.
    • Usuário abre sua skill tree.
    • Usuário usa uma de suas skills.
    • Usuário volta ao Loop de jogo com sua skill sendo utilizada.



Protótipo

Demonstração

Arquivo:Gameplay.mp4

Trechos comentados da demonstração


  • O código responsável pela câmera seguir o personagem, que ocorre enquanto ele se locomove é o seguinte:

var target : Transform; var distance = 3.0; var height = 3.0; var damping = 5.0; var smoothRotation = true; var rotationDamping = 10.0; var lockRotation : boolean;

function Update () { var wantedPosition = target.TransformPoint(0, height, -distance); transform.position = Vector3.Lerp (transform.position, wantedPosition, Time.deltaTime * damping);

if (smoothRotation) { var wantedRotation = Quaternion.LookRotation(target.position - transform.position, target.up); transform.rotation = Quaternion.Slerp (transform.rotation, wantedRotation, Time.deltaTime * rotationDamping); }

else transform.LookAt (target, target.up); if(lockRotation){ transform.localRotation = Quaternion.EulerAngles(0,0,0); }}
O código usa a variável do tipo Transform, que trata-se de uma variável de posição tridimensional (pois embora o jogo seja em 2D, a plataforma usada para a criação do protótipo foi em 2D).

  • Para o deslocamento das plataformas e dos inimigos foi usado o mesmo código, que é o código a seguir:
  1. pragma strict

private var Xpos : float; private var Ypos : float; private var max : boolean;

var Vert : boolean; var maxAmount : int; var step : float;

function Start () { Xpos = transform.position.x; Ypos = transform.position.y; }

function Update () { if(Vert) { if(transform.position.y >= Ypos + maxAmount) { max = true; } else if(transform.position.y <= Ypos){ max = false; }

} else { if(transform.position.x >= Xpos + maxAmount){ max = true; } else if(transform.position.x <= Xpos){ max = false; } }

if(Vert) { if(!max) { transform.position.y += step; } else { transform.position.y -= step; } } else { if(!max) { transform.position.x += step; } else { transform.position.x -= step; }}}
Como podemos ver, a variável do tipo transform é usada em praticamente todos os scripts do jogo. E para determinar se o movimento da plataforma será vertical ou não, usamos a variável do tipo Boolean, que caso for marcada como vertial o código executará um movimento em transform.position.y e não em transform.position.x.

  • Para passar de fase na porta branca, foi utilizado um código extremamente simples:
  1. pragma strict

var Level = ""; function OnTriggerStay(other : Collider){ if(other.tag == "Player"){ if(Input.GetKeyUp("up")){ Application.LoadLevel(Level); } }}
Esse código verifica se o jogador está na frente da porta, e teclando a tecla direcional para cima. Quando isso ocorre ele carrega a próxima fase.

Diagrama de Sequência

Diagrama de Estados