# miro-jelaska/spaceinvaders architecture

> Architecture diagram of the GitHub repository miro-jelaska/spaceinvaders, generated by GitDiagram from its file tree, README and a sample of source files (last updated 2026-09-25). It is an AI-made overview: check details against the source.

- Interactive diagram: https://gitdiagram.com/miro-jelaska/spaceinvaders
- Repository: https://github.com/miro-jelaska/spaceinvaders

## Overview

Space Invaders is a Java desktop arcade game. The player steers and fires at an invader formation; the game loop updates actors, checks collisions, resolves queued events, and renders score/time, effects, and a win/loss overlay. The graph preserves the documented scoring, controls, and audio capabilities. Source excerpts support the main loop, collision, event, and rendering links; some command implementations and projectile classes were not sampled, so their internal wiring is shown only where the tree and documented flow support it.

Main entry points: [`src/game/Game.java`](https://github.com/miro-jelaska/spaceinvaders/blob/master/src/game/Game.java) (Game loop), [`src/events/commands`](https://github.com/miro-jelaska/spaceinvaders/tree/master/src/events/commands) (Game commands), [`src/actors/HeroShip.java`](https://github.com/miro-jelaska/spaceinvaders/blob/master/src/actors/HeroShip.java) (Hero ship), [`src/events/EventResolution.java`](https://github.com/miro-jelaska/spaceinvaders/blob/master/src/events/EventResolution.java) (Event resolution)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_runtime["Game Runtime"]
  node_game["Game loop<br/>[Game.java]"]
  node_input["Input handler<br/>[InputHandler.java]"]
  node_timer["Game timer<br/>[GameTimer.java]"]
end

subgraph group_entities["Actors and Effects"]
  node_hero["Hero ship<br/>[HeroShip.java]"]
  node_invaders["Invader ships<br/>[InvaderShip.java]"]
  node_hero_projectiles["Hero projectiles"]
  node_invader_projectiles["Invader projectiles"]
  node_vfx["Explosion effects<br/>[Explosion.java]"]
  node_vfx_manager["Effect manager<br/>[VfxManager.java]"]
end

subgraph group_resolution["Collision and Events"]
  node_collision["Collision detection"]
  node_events["Event resolution"]
  node_commands["Game commands"]
end

subgraph group_presentation["UI and Audio"]
  node_ribbon["Score and time<br/>[StatusRibbon.java]"]
  node_gameover["End screen"]
  node_audio["Sound playback"]
  node_tracks["Sound tracks"]
  node_sound_assets["Audio assets"]
end

node_player(("Player"))

node_player -->|"presses keys"| node_input
node_input -->|"tracks keys"| node_game
node_game -->|"moves and fires"| node_hero
node_hero -->|"queues shots"| node_events
node_game -->|"reads elapsed time"| node_timer
node_game -->|"updates"| node_hero
node_game -->|"updates"| node_invaders
node_game -->|"updates"| node_hero_projectiles
node_game -->|"updates"| node_invader_projectiles
node_game -->|"checks collisions"| node_collision
node_collision -->|"queues outcomes"| node_events
node_game -->|"resolves events"| node_events
node_events -->|"applies actions"| node_commands
node_commands -->|"creates or removes"| node_hero_projectiles
node_commands -->|"creates or removes"| node_invader_projectiles
node_commands -->|"moves or removes"| node_invaders
node_commands -->|"creates explosions"| node_vfx
node_commands -->|"plays effects"| node_audio
node_commands -->|"updates score"| node_ribbon
node_commands -->|"sets outcome"| node_gameover
node_game -->|"updates effects"| node_vfx_manager
node_vfx_manager -->|"removes finished"| node_vfx
node_game -->|"renders"| node_ribbon
node_game -->|"renders when ended"| node_gameover
node_game -->|"renders"| node_hero
node_game -->|"renders"| node_invaders
node_game -->|"renders"| node_hero_projectiles
node_game -->|"renders"| node_invader_projectiles
node_game -->|"renders"| node_vfx
node_audio -->|"looks up track"| node_tracks
node_tracks -->|"maps to files"| node_sound_assets

click node_game "https://github.com/miro-jelaska/spaceinvaders/blob/master/src/game/Game.java"
click node_input "https://github.com/miro-jelaska/spaceinvaders/blob/master/src/utilities/InputHandler.java"
click node_timer "https://github.com/miro-jelaska/spaceinvaders/blob/master/src/utilities/GameTimer.java"
click node_hero "https://github.com/miro-jelaska/spaceinvaders/blob/master/src/actors/HeroShip.java"
click node_invaders "https://github.com/miro-jelaska/spaceinvaders/blob/master/src/actors/InvaderShip.java"
click node_hero_projectiles "https://github.com/miro-jelaska/spaceinvaders/blob/master/src/actors/HeroProjectile.java"
click node_invader_projectiles "https://github.com/miro-jelaska/spaceinvaders/blob/master/src/actors/InvaderProjectile.java"
click node_collision "https://github.com/miro-jelaska/spaceinvaders/blob/master/src/collision/CollisionDetection.java"
click node_events "https://github.com/miro-jelaska/spaceinvaders/blob/master/src/events/EventResolution.java"
click node_commands "https://github.com/miro-jelaska/spaceinvaders/tree/master/src/events/commands"
click node_vfx "https://github.com/miro-jelaska/spaceinvaders/blob/master/src/vfx/Explosion.java"
click node_vfx_manager "https://github.com/miro-jelaska/spaceinvaders/blob/master/src/vfx/VfxManager.java"
click node_ribbon "https://github.com/miro-jelaska/spaceinvaders/blob/master/src/ui/StatusRibbon.java"
click node_gameover "https://github.com/miro-jelaska/spaceinvaders/blob/master/src/ui/GameOverScreenOverlay.java"
click node_audio "https://github.com/miro-jelaska/spaceinvaders/blob/master/src/utilities/SoundEffectPlayer.java"
click node_tracks "https://github.com/miro-jelaska/spaceinvaders/blob/master/src/resources/SoundEffectTracks.java"
click node_sound_assets "https://github.com/miro-jelaska/spaceinvaders/tree/master/src/resources"

classDef toneNeutral fill:#f8fafc,stroke:#334155,stroke-width:1.5px,color:#0f172a
classDef toneBlue fill:#dbeafe,stroke:#2563eb,stroke-width:1.5px,color:#172554
classDef toneAmber fill:#fef3c7,stroke:#d97706,stroke-width:1.5px,color:#78350f
classDef toneMint fill:#dcfce7,stroke:#16a34a,stroke-width:1.5px,color:#14532d
classDef toneRose fill:#ffe4e6,stroke:#e11d48,stroke-width:1.5px,color:#881337
classDef toneIndigo fill:#e0e7ff,stroke:#4f46e5,stroke-width:1.5px,color:#312e81
classDef toneTeal fill:#ccfbf1,stroke:#0f766e,stroke-width:1.5px,color:#134e4a
class node_game,node_input,node_timer toneBlue
class node_hero,node_invaders,node_hero_projectiles,node_invader_projectiles,node_vfx,node_vfx_manager toneAmber
class node_collision,node_events,node_commands toneMint
class node_ribbon,node_gameover,node_audio,node_tracks,node_sound_assets toneRose
class node_player toneIndigo
```

## Components

### Game Runtime

- [Game loop](https://github.com/miro-jelaska/spaceinvaders/blob/master/src/game/Game.java): `src/game/Game.java`
- [Input handler](https://github.com/miro-jelaska/spaceinvaders/blob/master/src/utilities/InputHandler.java): `src/utilities/InputHandler.java`
- [Game timer](https://github.com/miro-jelaska/spaceinvaders/blob/master/src/utilities/GameTimer.java): `src/utilities/GameTimer.java`

### Actors and Effects

- [Hero ship](https://github.com/miro-jelaska/spaceinvaders/blob/master/src/actors/HeroShip.java): `src/actors/HeroShip.java`
- [Invader ships](https://github.com/miro-jelaska/spaceinvaders/blob/master/src/actors/InvaderShip.java): `src/actors/InvaderShip.java`
- [Hero projectiles](https://github.com/miro-jelaska/spaceinvaders/blob/master/src/actors/HeroProjectile.java): `src/actors/HeroProjectile.java`
- [Invader projectiles](https://github.com/miro-jelaska/spaceinvaders/blob/master/src/actors/InvaderProjectile.java): `src/actors/InvaderProjectile.java`
- [Explosion effects](https://github.com/miro-jelaska/spaceinvaders/blob/master/src/vfx/Explosion.java): `src/vfx/Explosion.java`
- [Effect manager](https://github.com/miro-jelaska/spaceinvaders/blob/master/src/vfx/VfxManager.java): `src/vfx/VfxManager.java`

### Collision and Events

- [Collision detection](https://github.com/miro-jelaska/spaceinvaders/blob/master/src/collision/CollisionDetection.java): `src/collision/CollisionDetection.java`
- [Event resolution](https://github.com/miro-jelaska/spaceinvaders/blob/master/src/events/EventResolution.java): `src/events/EventResolution.java`
- [Game commands](https://github.com/miro-jelaska/spaceinvaders/tree/master/src/events/commands): `src/events/commands`

### UI and Audio

- [Score and time](https://github.com/miro-jelaska/spaceinvaders/blob/master/src/ui/StatusRibbon.java): `src/ui/StatusRibbon.java`
- [End screen](https://github.com/miro-jelaska/spaceinvaders/blob/master/src/ui/GameOverScreenOverlay.java): `src/ui/GameOverScreenOverlay.java`
- [Sound playback](https://github.com/miro-jelaska/spaceinvaders/blob/master/src/utilities/SoundEffectPlayer.java): `src/utilities/SoundEffectPlayer.java`
- [Sound tracks](https://github.com/miro-jelaska/spaceinvaders/blob/master/src/resources/SoundEffectTracks.java): `src/resources/SoundEffectTracks.java`
- [Audio assets](https://github.com/miro-jelaska/spaceinvaders/tree/master/src/resources): `src/resources`

### Other components

- **Player**

## Connections

- Player → Input handler: presses keys
- Input handler → Game loop: tracks keys
- Game loop → Hero ship: moves and fires
- Hero ship → Event resolution: queues shots
- Game loop → Game timer: reads elapsed time
- Game loop → Hero ship: updates
- Game loop → Invader ships: updates
- Game loop → Hero projectiles: updates
- Game loop → Invader projectiles: updates
- Game loop → Collision detection: checks collisions
- Collision detection → Event resolution: queues outcomes
- Game loop → Event resolution: resolves events
- Event resolution → Game commands: applies actions
- Game commands → Hero projectiles: creates or removes
- Game commands → Invader projectiles: creates or removes
- Game commands → Invader ships: moves or removes
- Game commands → Explosion effects: creates explosions
- Game commands → Sound playback: plays effects
- Game commands → Score and time: updates score
- Game commands → End screen: sets outcome
- Game loop → Effect manager: updates effects
- Effect manager → Explosion effects: removes finished
- Game loop → Score and time: renders
- Game loop → End screen: renders when ended
- Game loop → Hero ship: renders
- Game loop → Invader ships: renders
- Game loop → Hero projectiles: renders
- Game loop → Invader projectiles: renders
- Game loop → Explosion effects: renders
- Sound playback → Sound tracks: looks up track
- Sound tracks → Audio assets: maps to files
