@startuml Geometry Dash - Diagramme de classe léger skinparam style strictuml skinparam classAttributeIconSize 0 skinparam classFontStyle Bold hide enum methods class PlayerCamera { {field} + playerObject: GameObject {field} + normalMinYFollow: float {field} + shipMinYFollow: float {field} + smoothSpeed: float {field} - initialY: float {field} + isPlaying: bool {method} - Start() {method} - Update() } class Player { {field} + RigidBody: Rigidbody2D {get} {private set} {field} + Transform: Transform {get} {private set} {field} + Particle: ParticleSystem {get} {private set} {field} + LevelsLoader: LevelsLoader {get} {set} {field} + SpriteRenderer: SpriteRenderer {get} {private set} {field} + IsColliding: bool {get} {set} {field} + HasStarted: bool {get} {set} {field} + CanJump: bool {get} {set} {field} + CurrentGameMode: IGameMode {get} {set} {field} + SpeedMultiplier: float {method} + Awake() {method} + Start() {method} + Update() {method} + OnCollisionEnter2D(collision: Collision2D) {method} + OnCollisionExit2D(collision: Collision2D) {method} + OnTriggerEnter2D(collision: Collider2D) {method} + ChangeGameMode(newMode: IGameMode) } Player o--> LevelsLoader : <> Player o--> IGameMode : <> class PauseMenu { {field} + pauseMenu: GameObject {field} + pauseButton: GameObject {field} + levelLoader: LevelLoader {field} + volumeSlider: Slider {method} + Start() {method} + ChangeVolume() {method} + Pause() {method} + Home() {method} + Resume() } PauseMenu --> LevelLoader : <> PauseMenu --> GameObject : <> PauseMenu --> Slider : <> class MainMenu { {method} + LaunchGame() {method} + OpenImport() {method} + QuitGame() {method} + LevelEditor() {method} + EditorChoice() {method} + CreateLevel() } class LevelStat { {field} + JsonName: string {get} {set} {field} + totalJumps: Integer {field} + totalAttempts: Integer {field} + progressionPercent: Integer {method} + {static} CreateFromJSON(jsonString: string): LevelStat } class LevelsLoader { {field} + levels: List {field} + levelCurrent: Level {method} - Start() {method} - LoadAllLevels() {method} - SaveLevelCurrent() {method} + NextLevel() {method} + PreviousLevel() {method} + IncreaseTotalJumps() {method} + IncreaseTotalAttempts() {method} + CalculateCurrentProgressionPercent(playerPosition: Vector3): Integer {method} + RefreshLevels() } LevelsLoader *--> Level : <> class LevelLoader { {field} + levelsLoader: LevelsLoader {field} + audioSource: AudioSource {field} + progressionText: Text {field} - groundY: float {method} - GetPrefab(type: string): GameObject {method} - LoadAudio() {method} - LoadElements() {method} + Start() {method} + Update() } LevelLoader o--> LevelsLoader : <> LevelLoader *--> AudioSource : <> LevelLoader --> Text : <> class LevelEditor { {field} - currentBlock: GameObject {field} - isPlacingBlock: bool {field} - currentScale: Vector3 {field} - scaleStep: float {field} + blockGroupContainer: Transform {field} + buttonPrefabTemplate: GameObject {field} - currentPage: Integer {field} - buttonsPerPage: Integer {constant} {field} - blockPrefabs: List {field} - currentButtons: List {field} - resizingTarget: GameObject {field} - isResizing: bool {field} - originalMousePos: Vector3 {field} - originalScale: Vector3 {field} - currentResizeAxis: ResizeAxis {method} - Start() {method} - LoadPrefabs() {method} - GenerateButtons() {method} - ClearCurrentButtons() {method} + NextPage() {method} + PreviousPage() {method} - SelectPrefab(prefab: GameObject) {method} - Update() {method} - PlaceBlock() {method} - TrySnapToNearbyBlock() {method} - InstantiateAndPrepare(prefab: GameObject, scaleOverride: Vector3?) {method} - HandleBlockRotation() } LevelEditor o--> blockGroupContainer : <> LevelEditor --> buttonPrefabTemplate : <> LevelEditor *--> blockPrefabs : <> LevelEditor *--> currentButtons : <> LevelEditor o--> currentBlock : <> LevelEditor o--> resizingTarget : <> LevelEditor *--> ResizeAxis : <> enum ResizeAxis <> { None Horizontal Vertical } class LevelElement { {field} + type: string {field} + x: float {field} + y: float {field} + scaleX: float {field} + scaleY: float } class Level { {field} + {static} {readOnly} LAST_X: Integer = 15 {field} + JsonName: string {get} {set} {field} + TotalJumps: Integer {get} {set} {field} + TotalAttempts: Integer {get} {set} {field} + ProgressionPercent: Integer {get} {set} {field} + ProgressionPercentMax: Integer {get} {set} {field} + name: string {field} + musicName: string {field} + order: Integer {field} + elements: List {field} + LastX: float {get} {method} + {static} CreateFromJSON(jsonString: string): Level } Level *--> LevelElement : <> class JSONImporter { {field} + statusText: TMP_Text {method} - Awake() {method} - Start() {method} + ImportJSON() {method} - ShowFileBrowser(): IEnumerator {method} - UpdateStatus(message: string, color: Color) } JSONImporter --> TMP_Text : <> class JSONExporter { {field} + statusText: TMP_Text {field} - editor: LevelEditor {field} - levelsFolder: string {method} - Awake() {method} - Start() {method} + ExportJSON() {method} - ShowSaveDialog(): IEnumerator {method} - SetStatus(message: string, color: Color) } JSONExporter o--> LevelEditor : <> JSONExporter --> TMP_Text : <> class SerializableElement <> { {field} + type: string {field} + x: float {field} + y: float {field} + scaleX: float {field} + scaleY: float } JSONExporter ..> SerializableElement : <> class LevelData <> { {field} + name: string {field} + musicName: string {field} + order: Integer {field} + elements: SerializableElement[*] } LevelData *--> SerializableElement : <> JSONExporter ..> LevelData : <> interface IGameMode <> { {method} + Update(player: Player) {abstract} {method} + OnCollisionEnter(player: Player, collision: Collision2D) {abstract} {method} + OnCollisionExit(player: Player, collision: Collision2D) {abstract} } class ShipGameMode implements IGameMode { {field} - HorizontalSpeed: float {constant} {field} - JumpForce: float {constant} {field} - JumpKey: KeyCode {constant} {field} - UpperAngle: float {constant} {field} - LowerAngle: float {constant} {field} - RotationTransitionDuration: float {constant} {method} + Update(player: Player) {method} - GetCurrentZAngle(player: Player): float {method} - Jump(player: Player) {method} + OnCollisionEnter(player: Player, collision: Collision2D) {method} + OnCollisionExit(player: Player, collision: Collision2D) } ShipGameMode ..|> IGameMode ShipGameMode ..> Player : <> class NormalGameMode implements IGameMode { {field} - HorizontalSpeed: float {constant} {field} - JumpForce: float {constant} {field} - JumpKey: KeyCode {constant} {field} - isRotating: bool {field} - targetRotationAngle: float {field} - rotationSpeed: float {readOnly} {method} + Update(player: Player) {method} - Jump(player: Player) {method} - PerformRotation(player: Player) {method} - IsJumping(player: Player): bool {method} - AlignRotation(player: Player) {method} - UpdateParticlePositionAndRotation(player: Player) {method} + OnCollisionEnter(player: Player, collision: Collision2D) {method} + OnCollisionExit(player: Player, collision: Collision2D) } NormalGameMode ..|> IGameMode NormalGameMode ..> Player : <> ' Tags class ShipPortal { } class CubePortal { } class BonusBoostSpeed { } class BonusSlowSpeed { } class Kill { } class Win { } class Ground { } class WinnerWall { } class Block { } class SmallObstacle { } class Spike { } class Portal { } class Bonus { } Player ..> ShipPortal : <> Player ..> CubePortal : <> Player ..> BonusBoostSpeed : <> Player ..> BonusSlowSpeed : <> ShipGameMode ..> Kill : <> ShipGameMode ..> Win : <> ShipGameMode ..> Ground : <> NormalGameMode ..> Kill : <> NormalGameMode ..> Win : <> LevelLoader ..> WinnerWall : <> LevelLoader ..> Ground : <> LevelEditor ..> Ground : <> LevelEditor ..> Block : <> LevelEditor ..> SmallObstacle : <> LevelEditor ..> Spike : <> LevelEditor ..> Portal : <> LevelEditor ..> Bonus : <> LevelsLoader ..> WinnerWall : <> @enduml