Skip to content

About

Created this project to refactor a space invaders game that uses JFrame and swig into and Object Oriented approach for my class. Pretty fun with custom levels through exe. Also has local coop

Resources

Stars

1 star

Watchers

0 watching

Forks

Repository files navigation

Space Invaders - IFSC

Como executar

Pré-requisitos

  • Java 21
  • Gradle (incluído via wrapper)

Executando o jogo

Modo Single Player

./gradlew run

Modo Cooperativo (2 jogadores)

./gradlew run --args="coop"

Controles

  • Jogador 1: A e D movem, espaço atira
  • Jogador 2 (modo coop): J e L movem, K atira

Diagrama de Classes

classDiagram
    direction TB
    
    class App {
        +main(args: String[])$
    }
    
    class GameConfig {
        +TILE_SIZE: int$
        +COLUNAS: int$
        +LINHAS: int$
        +LARGURA_TELA: int$
        +ALTURA_TELA: int$
        +FPS: int$
        +VELOCIDADE_JOGADOR: int$
        +LARGURA_PROJETIL: int$
        +ALTURA_PROJETIL: int$
        +VELOCIDADE_PROJETIL: int$
        +LARGURA_NAVE: int$
        +ALTURA_NAVE: int$
        +LARGURA_ALIEN: int$
        +ALTURA_ALIEN: int$
    }
    
    class CorEVidaAliens {
        <<enum>>
        BRANCO
        AMARELO
        AZUL
        ROSA
        -nivel: int
        -pontosDeVida: int
        -nomeSprite: String
        +getNivel(): int
        +getPontosDeVida(): int
        +getNomeSprite(): String
        +calcularPontos(): int
    }
    
    class Renderable {
        <<interface>>
        +renderizar(g: Graphics)
    }
    
    class Entidade {
        <<abstract>>
        #x: int
        #y: int
        #largura: int
        #altura: int
        +Entidade(x: int, y: int, largura: int, altura: int)
        +getX(): int
        +getY(): int
        +getLargura(): int
        +getAltura(): int
        +setX(x: int)
        +setY(y: int)
        +setLargura(largura: int)
        +setAltura(altura: int)
        +mover(deltaX: int, deltaY: int)
        +colideCom(outra: Entidade): boolean
        +processarColisaoProjetilAlien(projeteis: List~Projetil~, aliens: List~Alien~): int$
        +verificarColisaoJogadorAlien(jogador: Jogador, aliens: List~Alien~): boolean$
        +renderizar(g: Graphics)*
    }
    
    class Alien {
        -tipo: CorEVidaAliens
        -vidaAtual: int
        -sprite: Image
        -vivo: boolean
        +Alien(x: int, y: int, largura: int, altura: int, tipo: CorEVidaAliens, sprite: Image)
        +renderizar(g: Graphics)
        +receberDano(dano: int)
        +estaVivo(): boolean
        +calcularPontos(): int
        +getTipo(): CorEVidaAliens
        +getNivel(): int
        +getVidaAtual(): int
        +getVidaMaxima(): int
        +setVidaAtual(vida: int)
        +setVivo(vivo: boolean)
    }
    
    class Jogador {
        -velocidade: int
        -sprite: Image
        -limiteMinX: int
        -limiteMaxX: int
        -playerId: int
        -projeteis: List~Projetil~
        +Jogador(xInicial: int, yInicial: int, largura: int, altura: int, velocidade: int, sprite: Image, limiteMinX: int, limiteMaxX: int, playerId: int)
        +renderizar(g: Graphics)
        +moverEsquerda()
        +moverDireita()
        +atirar(larguraProjetil: int, alturaProjetil: int, velocidadeProjetil: int)
        +atualizarProjeteis(alturaTela: int)
        +getProjeteis(): List~Projetil~
        ~getProjeiteisParaColisao(): List~Projetil~
        +getPlayerId(): int
    }
    
    class Projetil {
        -velocityY: int
        -usado: boolean
        -playerId: int
        +Projetil(x: int, y: int, largura: int, altura: int, velocityY: int, playerId: int)
        +renderizar(g: Graphics)
        +mover()
        +isOffScreen(heightLimit: int): boolean
        +marcarComoUsado()
        +isUsado(): boolean
        +getPlayerId(): int
        +setUsado(usado: boolean)
    }
    
    class EntidadeManager {
        <<abstract>>
        #entidades: List~T~
        #larguraTela: int
        #alturaTela: int
        +EntidadeManager(larguraTela: int, alturaTela: int)
        +adicionarEntidade(entidade: T)
        +limpar()
        +contarEntidades(filtro: Predicate~T~): long
        +renderizar(g: Graphics)
        #getEntidadesInternas(): List~T~
        +atualizar(): boolean*
    }
    
    class GerenciadorDeAliens {
        -velocidadeX: int
        +GerenciadorDeAliens(larguraTela: int, alturaTela: int)
        +adicionarAlien(alien: Alien)
        +atualizar(): boolean
        +atualizar(posicaoYJogadores: int): boolean
        +moverAliens(posicaoYJogadores: int): boolean
        +verificarColisoes(projeteis: List~Projetil~): int
        +todosMortos(): boolean
        +getVelocidadeX(): int
        +setVelocidadeX(velocidade: int)
        +getQuantidadeAliensVivos(): int
    }
    
    class GerenciadorDeFases {
        -tileSize: int
        -alienImagens: Map~CorEVidaAliens, Image~
        -random: Random
        -faseAtual: int
        +GerenciadorDeFases(tileSize: int, alienImagens: Map~CorEVidaAliens, Image~)
        +criarAliensParaFase(): List~Alien~
        -escolherArranjoParaFase(): String
        -carregarArranjoDoArquivo(nomeArquivo: String): List~Alien~
        -obterTipoAlienPorChar(c: char): CorEVidaAliens
        -criarArranjoSimples(): List~Alien~
        +proximaFase()
        +getFaseAtual(): int
    }
    
    class GameLauncher {
        +iniciarJogo(args: String[])
        -processarArgumentos(args: String[]): boolean
        -criarEConfigurarJanela(modoCoop: boolean)
        -configurarJanela(janela: JFrame)
        -finalizarConfiguracao(janela: JFrame, motor: MotorDoJogo)
    }
    
    class MotorDoJogo {
        -jogador1: Jogador
        -jogador2: Jogador
        -gerenciador: GerenciadorDeAliens
        -gerenciadorFases: GerenciadorDeFases
        -loop: Timer
        -modoCoop: boolean
        -pontuacao: int
        -gameOver: boolean
        -pausado: boolean
        -imagensCarregadas: Map~String, Image~
        -alienImagens: Map~CorEVidaAliens, Image~
        +MotorDoJogo(coop: boolean)
        -carregarImagens()
        -carregarImagem(nome: String): Image
        +getImagemNave1(): Image
        +getImagemNave2(): Image
        +getAlienImagens(): Map~CorEVidaAliens, Image~
        +adicionarPontos(pontos: int)
        +terminarJogo()
        +getPontuacao(): int
        +setPontuacao(pontuacao: int)
        +isGameOver(): boolean
        +isPausado(): boolean
        +isJogando(): boolean
        +processarInput(keyCode: int)
        -adicionarAliensNaFase()
        +paintComponent(g: Graphics)
        +actionPerformed(e: ActionEvent)
        +keyReleased(e: KeyEvent)
    }

    Renderable <|.. Entidade
    Renderable <|.. EntidadeManager
    Entidade <|-- Alien
    Entidade <|-- Jogador
    Entidade <|-- Projetil
    EntidadeManager <|-- GerenciadorDeAliens

    Jogador *-- "0..*" Projetil
    GerenciadorDeAliens o-- "0..*" Alien
    MotorDoJogo *-- "1" Jogador : jogador1
    MotorDoJogo *-- "0..1" Jogador : jogador2
    MotorDoJogo *-- "1" GerenciadorDeAliens
    MotorDoJogo *-- "1" GerenciadorDeFases
    Alien *-- "1" CorEVidaAliens

    App ..> GameLauncher
    GameLauncher ..> MotorDoJogo
    GerenciadorDeFases ..> Alien
    MotorDoJogo ..> GameConfig
    Entidade ..> Projetil
    Entidade ..> Alien
    Entidade ..> Jogador
    GerenciadorDeAliens ..> Projetil

Loading

About

Created this project to refactor a space invaders game that uses JFrame and swig into and Object Oriented approach for my class. Pretty fun with custom levels through exe. Also has local coop

Resources

Stars

1 star

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages