# gabrielcamargogsilva/geometry-dash-poo architecture

> Architecture diagram of the GitHub repository gabrielcamargogsilva/geometry-dash-poo, generated by GitDiagram from its file tree, README and a sample of source files (last updated 2026-11-12). It is an AI-made overview: check details against the source.

- Interactive diagram: https://gitdiagram.com/gabrielcamargogsilva/geometry-dash-poo
- Repository: https://github.com/gabrielcamargogsilva/geometry-dash-poo

## Overview

Geometry Dash POO is a Java desktop game. The player starts or navigates through menus with keyboard and mouse; the controller routes those actions into game state and progression, while the view renders play and result screens. Phases are loaded from JSON, and local profile settings preserve customization and best progress. The graph reflects README descriptions and the supplied source/index references; some subsystem links rely on the index rather than full source excerpts.

Main entry points: [`src/geometrydash/model/service/GameModel.java`](https://github.com/gabrielcamargogsilva/geometry-dash-poo/blob/main/src/geometrydash/model/service/GameModel.java) (Game model), [`src/geometrydash/controller/GameController.java`](https://github.com/gabrielcamargogsilva/geometry-dash-poo/blob/main/src/geometrydash/controller/GameController.java) (Game controller), [`src/geometrydash/controller/InputController.java`](https://github.com/gabrielcamargogsilva/geometry-dash-poo/blob/main/src/geometrydash/controller/InputController.java) (Input handling), [`src/geometrydash/Main.java`](https://github.com/gabrielcamargogsilva/geometry-dash-poo/blob/main/src/geometrydash/Main.java) (Application startup)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_app["Application and input"]
  node_main["Application startup<br/>[Main.java]"]
  node_controller["Game controller"]
  node_input["Input handling"]
  node_loop["Game loop<br/>[GameLoop.java]"]
end

subgraph group_game["Game domain"]
  node_model["Game model<br/>[GameModel.java]"]
  node_game_service["Game service<br/>[GameService.java]"]
  node_state["Game state<br/>[GameState.java]"]
  node_obstacles["Obstacle types<br/>[Obstacle.java]"]
  node_phase["Phase data<br/>[Phase.java]"]
  node_phase_service["Phase service<br/>[PhaseService.java]"]
  node_phase_loader["JSON phase loader<br/>[PhaseLoader.java]"]
end

subgraph group_presentation["Presentation"]
  node_window["Game window<br/>[GameWindow.java]"]
  node_panel["Game panel<br/>[GamePanel.java]"]
  node_button["Menu button<br/>[MenuButton.java]"]
end

subgraph group_support["Audio and profile"]
  node_audio_service["Audio interface<br/>[AudioService.java]"]
  node_audio_manager["Audio manager<br/>[AudioManager.java]"]
  node_profile_service["Profile service"]
  node_profile_repo["Profile repository"]
  node_file_repo[("File profile store")]
  node_profile_store["Profile store adapter<br/>[ProfileStore.java]"]
end

node_player(("Player"))

node_player -->|"sends input"| node_input
node_main -->|"opens"| node_window
node_main -->|"creates"| node_controller
node_main -->|"creates"| node_model
node_main -->|"loads phase"| node_phase_service
node_main -->|"loads profile"| node_profile_service
node_main -->|"selects"| node_audio_manager
node_window -->|"hosts"| node_panel
node_controller -->|"registers"| node_input
node_controller -->|"starts"| node_loop
node_controller -->|"coordinates"| node_model
node_controller -->|"connects"| node_panel
node_controller -->|"uses"| node_audio_service
node_controller -->|"uses"| node_profile_store
node_input -->|"dispatches actions"| node_model
node_input -->|"reads buttons"| node_panel
node_input -->|"plays effects"| node_audio_service
node_input -->|"saves choices"| node_profile_service
node_input -->|"checks hover"| node_button
node_loop -->|"updates"| node_model
node_loop -->|"repaints"| node_panel
node_loop -->|"controls audio"| node_audio_service
node_loop -->|"persists record"| node_profile_service
node_panel -->|"renders state"| node_model
node_panel -->|"draws"| node_button
node_model -->|"tracks"| node_state
node_model -->|"checks collisions"| node_obstacles
node_model -->|"uses"| node_phase
node_phase_service -->|"delegates loading"| node_phase_loader
node_phase_loader -->|"builds"| node_phase
node_phase_loader -->|"creates"| node_obstacles
node_audio_manager -->|"implements"| node_audio_service
node_profile_service -->|"delegates"| node_profile_repo
node_file_repo -->|"implements"| node_profile_repo
node_profile_store -->|"delegates"| node_profile_repo
node_profile_repo -->|"implemented by"| node_file_repo

click node_main "https://github.com/gabrielcamargogsilva/geometry-dash-poo/blob/main/src/geometrydash/Main.java"
click node_controller "https://github.com/gabrielcamargogsilva/geometry-dash-poo/blob/main/src/geometrydash/controller/GameController.java"
click node_input "https://github.com/gabrielcamargogsilva/geometry-dash-poo/blob/main/src/geometrydash/controller/InputController.java"
click node_loop "https://github.com/gabrielcamargogsilva/geometry-dash-poo/blob/main/src/geometrydash/controller/GameLoop.java"
click node_model "https://github.com/gabrielcamargogsilva/geometry-dash-poo/blob/main/src/geometrydash/model/service/GameModel.java"
click node_game_service "https://github.com/gabrielcamargogsilva/geometry-dash-poo/blob/main/src/geometrydash/model/service/GameService.java"
click node_state "https://github.com/gabrielcamargogsilva/geometry-dash-poo/blob/main/src/geometrydash/model/entity/GameState.java"
click node_obstacles "https://github.com/gabrielcamargogsilva/geometry-dash-poo/blob/main/src/geometrydash/model/entity/Obstacle.java"
click node_phase "https://github.com/gabrielcamargogsilva/geometry-dash-poo/blob/main/src/geometrydash/model/entity/Phase.java"
click node_phase_service "https://github.com/gabrielcamargogsilva/geometry-dash-poo/blob/main/src/geometrydash/model/service/PhaseService.java"
click node_phase_loader "https://github.com/gabrielcamargogsilva/geometry-dash-poo/blob/main/src/geometrydash/model/service/PhaseLoader.java"
click node_window "https://github.com/gabrielcamargogsilva/geometry-dash-poo/blob/main/src/geometrydash/view/GameWindow.java"
click node_panel "https://github.com/gabrielcamargogsilva/geometry-dash-poo/blob/main/src/geometrydash/view/GamePanel.java"
click node_button "https://github.com/gabrielcamargogsilva/geometry-dash-poo/blob/main/src/geometrydash/view/component/MenuButton.java"
click node_audio_service "https://github.com/gabrielcamargogsilva/geometry-dash-poo/blob/main/src/geometrydash/audio/AudioService.java"
click node_audio_manager "https://github.com/gabrielcamargogsilva/geometry-dash-poo/blob/main/src/geometrydash/audio/AudioManager.java"
click node_profile_service "https://github.com/gabrielcamargogsilva/geometry-dash-poo/blob/main/src/geometrydash/model/service/PlayerProfileService.java"
click node_profile_repo "https://github.com/gabrielcamargogsilva/geometry-dash-poo/blob/main/src/geometrydash/model/repository/PlayerProfileRepository.java"
click node_file_repo "https://github.com/gabrielcamargogsilva/geometry-dash-poo/blob/main/src/geometrydash/model/repository/FilePlayerProfileRepository.java"
click node_profile_store "https://github.com/gabrielcamargogsilva/geometry-dash-poo/blob/main/src/geometrydash/persistence/ProfileStore.java"

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_main,node_controller,node_input,node_loop toneBlue
class node_model,node_game_service,node_state,node_obstacles,node_phase,node_phase_service,node_phase_loader toneAmber
class node_window,node_panel,node_button toneMint
class node_audio_service,node_audio_manager,node_profile_service,node_profile_repo,node_file_repo,node_profile_store toneRose
class node_player toneIndigo
```

## Components

### Application and input

- [Application startup](https://github.com/gabrielcamargogsilva/geometry-dash-poo/blob/main/src/geometrydash/Main.java): `src/geometrydash/Main.java`
- [Game controller](https://github.com/gabrielcamargogsilva/geometry-dash-poo/blob/main/src/geometrydash/controller/GameController.java): `src/geometrydash/controller/GameController.java`
- [Input handling](https://github.com/gabrielcamargogsilva/geometry-dash-poo/blob/main/src/geometrydash/controller/InputController.java): `src/geometrydash/controller/InputController.java`
- [Game loop](https://github.com/gabrielcamargogsilva/geometry-dash-poo/blob/main/src/geometrydash/controller/GameLoop.java): `src/geometrydash/controller/GameLoop.java`

### Game domain

- [Game model](https://github.com/gabrielcamargogsilva/geometry-dash-poo/blob/main/src/geometrydash/model/service/GameModel.java): `src/geometrydash/model/service/GameModel.java`
- [Game service](https://github.com/gabrielcamargogsilva/geometry-dash-poo/blob/main/src/geometrydash/model/service/GameService.java): `src/geometrydash/model/service/GameService.java`
- [Game state](https://github.com/gabrielcamargogsilva/geometry-dash-poo/blob/main/src/geometrydash/model/entity/GameState.java): `src/geometrydash/model/entity/GameState.java`
- [Obstacle types](https://github.com/gabrielcamargogsilva/geometry-dash-poo/blob/main/src/geometrydash/model/entity/Obstacle.java): `src/geometrydash/model/entity/Obstacle.java`
- [Phase data](https://github.com/gabrielcamargogsilva/geometry-dash-poo/blob/main/src/geometrydash/model/entity/Phase.java): `src/geometrydash/model/entity/Phase.java`
- [Phase service](https://github.com/gabrielcamargogsilva/geometry-dash-poo/blob/main/src/geometrydash/model/service/PhaseService.java): `src/geometrydash/model/service/PhaseService.java`
- [JSON phase loader](https://github.com/gabrielcamargogsilva/geometry-dash-poo/blob/main/src/geometrydash/model/service/PhaseLoader.java): `src/geometrydash/model/service/PhaseLoader.java`

### Presentation

- [Game window](https://github.com/gabrielcamargogsilva/geometry-dash-poo/blob/main/src/geometrydash/view/GameWindow.java): `src/geometrydash/view/GameWindow.java`
- [Game panel](https://github.com/gabrielcamargogsilva/geometry-dash-poo/blob/main/src/geometrydash/view/GamePanel.java): `src/geometrydash/view/GamePanel.java`
- [Menu button](https://github.com/gabrielcamargogsilva/geometry-dash-poo/blob/main/src/geometrydash/view/component/MenuButton.java): `src/geometrydash/view/component/MenuButton.java`

### Audio and profile

- [Audio interface](https://github.com/gabrielcamargogsilva/geometry-dash-poo/blob/main/src/geometrydash/audio/AudioService.java): `src/geometrydash/audio/AudioService.java`
- [Audio manager](https://github.com/gabrielcamargogsilva/geometry-dash-poo/blob/main/src/geometrydash/audio/AudioManager.java): `src/geometrydash/audio/AudioManager.java`
- [Profile service](https://github.com/gabrielcamargogsilva/geometry-dash-poo/blob/main/src/geometrydash/model/service/PlayerProfileService.java): `src/geometrydash/model/service/PlayerProfileService.java`
- [Profile repository](https://github.com/gabrielcamargogsilva/geometry-dash-poo/blob/main/src/geometrydash/model/repository/PlayerProfileRepository.java): `src/geometrydash/model/repository/PlayerProfileRepository.java`
- [File profile store](https://github.com/gabrielcamargogsilva/geometry-dash-poo/blob/main/src/geometrydash/model/repository/FilePlayerProfileRepository.java): `src/geometrydash/model/repository/FilePlayerProfileRepository.java`
- [Profile store adapter](https://github.com/gabrielcamargogsilva/geometry-dash-poo/blob/main/src/geometrydash/persistence/ProfileStore.java): `src/geometrydash/persistence/ProfileStore.java`

### Other components

- **Player**

## Connections

- Player → Input handling: sends input (evidence: `README.md`)
- Application startup → Game window: opens (evidence: `src/geometrydash/Main.java`)
- Application startup → Game controller: creates (evidence: `src/geometrydash/Main.java`)
- Application startup → Game model: creates (evidence: `src/geometrydash/Main.java`)
- Application startup → Phase service: loads phase (evidence: `src/geometrydash/Main.java`)
- Application startup → Profile service: loads profile (evidence: `src/geometrydash/Main.java`)
- Application startup → Audio manager: selects (evidence: `README.md`)
- Game window → Game panel: hosts (evidence: `src/geometrydash/view/GameWindow.java`)
- Game controller → Input handling: registers (evidence: `src/geometrydash/controller/GameController.java`)
- Game controller → Game loop: starts (evidence: `src/geometrydash/controller/GameController.java`)
- Game controller → Game model: coordinates (evidence: `src/geometrydash/controller/GameController.java`)
- Game controller → Game panel: connects (evidence: `src/geometrydash/controller/GameController.java`)
- Game controller → Audio interface: uses (evidence: `src/geometrydash/controller/GameController.java`)
- Game controller → Profile store adapter: uses (evidence: `src/geometrydash/controller/GameController.java`)
- Input handling → Game model: dispatches actions (evidence: `src/geometrydash/controller/InputController.java`)
- Input handling → Game panel: reads buttons (evidence: `src/geometrydash/controller/InputController.java`)
- Input handling → Audio interface: plays effects (evidence: `src/geometrydash/controller/InputController.java`)
- Input handling → Profile service: saves choices (evidence: `src/geometrydash/controller/InputController.java`)
- Input handling → Menu button: checks hover (evidence: `src/geometrydash/controller/InputController.java`)
- Game loop → Game model: updates (evidence: `src/geometrydash/controller/GameLoop.java`)
- Game loop → Game panel: repaints (evidence: `src/geometrydash/controller/GameLoop.java`)
- Game loop → Audio interface: controls audio (evidence: `src/geometrydash/controller/GameLoop.java`)
- Game loop → Profile service: persists record (evidence: `src/geometrydash/controller/GameLoop.java`)
- Game panel → Game model: renders state (evidence: `src/geometrydash/view/GamePanel.java`)
- Game panel → Menu button: draws (evidence: `src/geometrydash/view/GamePanel.java`)
- Game model → Game state: tracks (evidence: `src/geometrydash/model/service/GameModel.java`)
- Game model → Obstacle types: checks collisions (evidence: `src/geometrydash/model/service/GameModel.java`)
- Game model → Phase data: uses (evidence: `src/geometrydash/model/service/GameModel.java`)
- Phase service → JSON phase loader: delegates loading (evidence: `src/geometrydash/model/service/PhaseService.java`)
- JSON phase loader → Phase data: builds (evidence: `src/geometrydash/model/service/PhaseLoader.java`)
- JSON phase loader → Obstacle types: creates (evidence: `src/geometrydash/model/service/PhaseLoader.java`)
- Audio manager → Audio interface: implements (evidence: `src/geometrydash/audio/AudioManager.java`)
- Profile service → Profile repository: delegates (evidence: `src/geometrydash/model/service/PlayerProfileService.java`)
- File profile store → Profile repository: implements (evidence: `src/geometrydash/model/repository/FilePlayerProfileRepository.java`)
- Profile store adapter → Profile repository: delegates (evidence: `src/geometrydash/persistence/ProfileStore.java`)
- Profile repository → File profile store: implemented by (evidence: `src/geometrydash/model/repository/FilePlayerProfileRepository.java`)
