Skip to content

DuAlmeida995/ObjectFlight

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

49 Commits
 
 
 
 
 
 

Repository files navigation

Refatoração de Jogo Shoot ’em Up com Programação Orientada a Objetos

Este projeto foi desenvolvido na disciplina Computação Orientada a Objetos (ACH2003) na EACH-USP, com o objetivo de aplicar, na prática, conceitos de orientação a objetos por meio da refatoração de um sistema existente.

O projeto consiste na reestruturação de um jogo do tipo shoot ’em up originalmente implementado de forma procedural, migrando para uma arquitetura orientada a objetos mais modular, extensível e de fácil manutenção.


Objetivo

O principal objetivo foi transformar um código com baixa organização e alta redundância em um sistema com:

  • separação clara de responsabilidades
  • redução de acoplamento
  • aumento de coesão
  • maior escalabilidade
  • melhor manutenibilidade

Problemas Identificados no Código Original

A implementação original, embora escrita em Java, seguia um modelo procedural com as seguintes limitações:

  • Repetição de lógica para colisão, atualização de estado e movimentação
  • Uso extensivo de arrays estáticos para gerenciamento de entidades
  • Ausência de encapsulamento (dados globais e mutáveis)
  • Forte acoplamento entre componentes
  • Baixa extensibilidade (adição de novas entidades exigia alterações em múltiplos pontos)
  • Complexidade crescente na manutenção

Arquitetura da Solução

A refatoração foi estruturada com base em princípios de orientação a objetos, priorizando composição, abstração e modularização.

Estrutura de Pacotes

O sistema foi organizado em pacotes com responsabilidades bem definidas:

  • jogo: ponto de entrada, loop principal e gerenciamento geral
  • mecanicas.bases: classes base reutilizáveis (movimento, vida, colisão, disparo)
  • mecanicas.jogador: implementação da entidade jogador
  • mecanicas.inimigos: inimigos comuns
  • mecanicas.chefes: entidades com comportamento complexo
  • mecanicas.powerups: itens coletáveis
  • mecanicas.projetil: modelagem e gerenciamento de projéteis
  • mecanicas.interfaces: contratos entre componentes
  • mecanicas.constantes: enums e estados do sistema

Essa divisão reduz acoplamento e permite evolução independente de cada módulo.


Modelagem de Entidades

As entidades do jogo foram modeladas com base em composição ao invés de herança profunda.

EntidadeBase

Classe responsável por encapsular atributos e comportamentos comuns:

  • posição (x, y)
  • raio (para colisão)
  • estado (ACTIVE, EXPLODING, INACTIVE)

Componentes Reutilizáveis

Funcionalidades foram extraídas para classes independentes:

  • MovimentoBase: atualização baseada em velocidade e delta de tempo
  • VidaBase: controle de vida, dano e invulnerabilidade
  • ExplosaoBase: controle temporal de explosões
  • DisparadorBase: gerenciamento de cadência de tiro

Essa abordagem reduz duplicação e permite reutilização entre diferentes entidades.


Uso de Interfaces

Interfaces foram utilizadas para definir contratos claros entre componentes:

  • Colidivel: padroniza verificação de colisão
  • EntidadeInimigo: comportamento comum de inimigos
  • PowerUp: ciclo de vida de itens coletáveis
  • Chefe: definição de comportamento de bosses

Essa estratégia desacopla implementação de uso e facilita extensão do sistema.


Gerenciamento de Entidades com Collections

O código original utilizava arrays estáticos, o que introduzia limitações de tamanho e complexidade de controle.

A refatoração substituiu essa abordagem por estruturas do Java Collections Framework:

  • List<Projetil> para projéteis
  • List<EntidadeInimigo> para inimigos
  • List<PowerUp> para power-ups

Benefícios Técnicos

  • Crescimento dinâmico das estruturas
  • Eliminação de controle manual de índices
  • Uso de removeIf para remoção eficiente
  • Uso de Iterator para remoção segura durante iteração
  • Redução de erros como ArrayIndexOutOfBoundsException

Loop Principal e Gerenciamento de Estado

O GameManager centraliza o fluxo do jogo:

  • atualização de entidades (update)
  • detecção de colisões
  • gerenciamento de spawns
  • remoção de entidades inativas
  • controle de fases

A lógica foi estruturada para minimizar efeitos colaterais e manter previsibilidade do estado do jogo.


Sistema de Fases

O sistema de fases foi projetado para ser orientado a dados.

  • Arquivos externos (fase1.txt, fase2.txt) definem eventos de spawn
  • Cada entrada contém tipo de entidade, posição, tempo e parâmetros
  • Um carregador (CarregadorFase) interpreta os dados e popula estruturas internas

Essa abordagem permite adicionar ou modificar fases sem alterar código.


Implementação de Chefes

Chefes foram modelados como extensões de entidades inimigas com comportamento especializado:

  • lógica de múltiplas fases baseada em vida
  • padrões de ataque dinâmicos
  • movimentação específica
  • barra de vida independente

O comportamento é encapsulado em classes próprias, evitando impacto em outras partes do sistema.


Sistema de Power-ups

Power-ups seguem um ciclo de vida bem definido:

  • spawn
  • atualização por tempo
  • detecção de colisão com jogador
  • ativação de efeito
  • expiração e remoção

Os efeitos são desacoplados da lógica principal do jogador, permitindo fácil adição de novos tipos.


Benefícios da Refatoração

A migração para orientação a objetos trouxe ganhos significativos:

  • redução de redundância
  • maior legibilidade
  • facilidade de manutenção
  • extensibilidade sem modificação de código existente
  • separação clara de responsabilidades
  • melhor organização estrutural

Tecnologias Utilizadas

  • Java
  • Java Collections Framework
  • Biblioteca gráfica GameLib (fornecida pela disciplina)

Execução

O projeto depende da biblioteca GameLib fornecida pela disciplina.
Para execução, basta compilar os arquivos .java e executar a classe principal.


Autores

  • Eduardo Almeida
  • Diogo Leonel dos Santos

Contexto Acadêmico

Projeto desenvolvido para a disciplina:

Computação Orientada a Objetos (ACH2003)
Professor: Flávio Luiz Coutinho
EACH – Universidade de São Paulo

About

Projeto de refatoração de um jogo em Java, migrando de um código procedural para uma arquitetura orientada a objetos baseada em composição, interfaces e coleções dinâmicas, com foco em escalabilidade, reuso e manutenção.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors

Languages