diff --git a/Assets/Resources/Logo.png b/Assets/Resources/Logo.png index f2a4496..21eee3d 100644 Binary files a/Assets/Resources/Logo.png and b/Assets/Resources/Logo.png differ diff --git a/Assets/Resources/Logo.png.meta b/Assets/Resources/Logo.png.meta index adfefbe..65ce378 100644 --- a/Assets/Resources/Logo.png.meta +++ b/Assets/Resources/Logo.png.meta @@ -147,7 +147,8 @@ TextureImporter: secondaryTextures: [] spriteCustomMetadata: entries: [] - nameFileIdTable: {} + nameFileIdTable: + Logo_0: 1404028623067837608 mipmapLimitGroupName: pSDRemoveMatte: 0 userData: diff --git a/Assets/Scenes/HomeScene.unity b/Assets/Scenes/HomeScene.unity index 8003ab0..ee1f95c 100644 --- a/Assets/Scenes/HomeScene.unity +++ b/Assets/Scenes/HomeScene.unity @@ -155,7 +155,7 @@ RectTransform: m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0.5, y: 0.5} m_AnchorMax: {x: 0.5, y: 0.5} - m_AnchoredPosition: {x: 0, y: -110} + m_AnchoredPosition: {x: 8.3, y: -154.1} m_SizeDelta: {x: 160, y: 30} m_Pivot: {x: 0.5, y: 0.5} --- !u!114 &39408930 @@ -562,6 +562,7 @@ RectTransform: - {fileID: 666344588} - {fileID: 39408929} - {fileID: 1809963736} + - {fileID: 780585405} m_Father: {fileID: 0} m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0} @@ -605,7 +606,7 @@ RectTransform: m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0.5, y: 0.5} m_AnchorMax: {x: 0.5, y: 0.5} - m_AnchoredPosition: {x: 0, y: -45} + m_AnchoredPosition: {x: 8.3, y: -95.7} m_SizeDelta: {x: 160, y: 30} m_Pivot: {x: 0.5, y: 0.5} --- !u!114 &666344589 @@ -702,6 +703,81 @@ CanvasRenderer: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 666344587} m_CullTransparentMesh: 1 +--- !u!1 &780585404 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 780585405} + - component: {fileID: 780585407} + - component: {fileID: 780585406} + m_Layer: 5 + m_Name: GameObject + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &780585405 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 780585404} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 481473977} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0.5, y: 0.5} + m_AnchorMax: {x: 0.5, y: 0.5} + m_AnchoredPosition: {x: 8.3, y: 82.4} + m_SizeDelta: {x: 206.4181, y: 202.9899} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &780585406 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 780585404} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 1404028623067837608, guid: 7941bec4ab82ba5f8a978cf1b4d91010, type: 3} + m_Type: 0 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!222 &780585407 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 780585404} + m_CullTransparentMesh: 1 --- !u!1 &948896765 GameObject: m_ObjectHideFlags: 0 @@ -953,7 +1029,7 @@ RectTransform: m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0.5, y: 0.5} m_AnchorMax: {x: 0.5, y: 0.5} - m_AnchoredPosition: {x: 0, y: 15.000004} + m_AnchoredPosition: {x: 8.3, y: -40.7} m_SizeDelta: {x: 160, y: 30} m_Pivot: {x: 0.5, y: 0.5} --- !u!114 &1587889809 diff --git a/Documentation/Screenshots/gameplay.png b/Documentation/Screenshots/gameplay.png new file mode 100644 index 0000000..57095e8 Binary files /dev/null and b/Documentation/Screenshots/gameplay.png differ diff --git a/Documentation/Screenshots/home-page.png b/Documentation/Screenshots/home-page.png new file mode 100644 index 0000000..07fc519 Binary files /dev/null and b/Documentation/Screenshots/home-page.png differ diff --git a/Documentation/Screenshots/levels-selection.png b/Documentation/Screenshots/levels-selection.png new file mode 100644 index 0000000..9840e6f Binary files /dev/null and b/Documentation/Screenshots/levels-selection.png differ diff --git a/Documentation/UML/activity-diagram/activity-diagram-complete.puml b/Documentation/UML/activity-diagram/activity-diagram-complete.puml index a9063b2..3bc6ab1 100644 --- a/Documentation/UML/activity-diagram/activity-diagram-complete.puml +++ b/Documentation/UML/activity-diagram/activity-diagram-complete.puml @@ -8,11 +8,11 @@ repeat if (Le joueur percute un obstacle ?) then (Oui) :Le joueur meurt; :Augmenter le nombre d'essais de 1; - :Perdre toutes les pièces et bonus; + :Perdre toutes les bonus; else (Non) partition "Actions du joueur" { group Saut - if (L'utilisateur clique sur l'écran ?) then (Oui) + if (L'utilisateur appuie sur espace ?) then (Oui) :Le joueur effectue un saut; endif end group @@ -27,15 +27,15 @@ repeat end group endif - if (Le joueur clique sur un bonus dans son inventaire ?) then (Oui) + if (Le joueur percute un bonus ?) then (Oui) group Activation de Bonus :Le joueur clique sur un bonus dans l'inventaire; switch (Type de bonus) case (Temps ralenti) :Activer ralentissement du temps; - :Temps ralenti : 3 secondes; - case (Annulation d'obstacle) - :Supprimer tous les obstacles; + :Durée : 3 secondes; + case (Temps accéléré) + :Activer accélération du temps; :Durée : 3 secondes; endswitch end group @@ -54,9 +54,6 @@ repeat :Quitter le niveau; :Retour au menu principal; stop - case (Mode Checkpoint) - :Activer/Désactiver le mode Checkpoint; - :Reprendre la partie; case (Volume) :Modifier le volume sonore; :Revenir au menu de pause; @@ -72,7 +69,6 @@ repeat if (Le joueur touche la zone de fin ?) then (Oui) :Terminer le niveau; :Animation de fin de niveau; - :Conserver les pièces obtenues; break endif } diff --git a/Documentation/UML/activity-diagram/activity-diagram.puml b/Documentation/UML/activity-diagram/activity-diagram.puml index 0ac34cb..3f39a13 100644 --- a/Documentation/UML/activity-diagram/activity-diagram.puml +++ b/Documentation/UML/activity-diagram/activity-diagram.puml @@ -11,7 +11,7 @@ repeat :Perdre toutes les pièces et bonus; else (Non) partition "Actions du joueur" { - if (L'utilisateur clique sur l'écran ?) then (Oui) + if (L'utilisateur appuie sur espace ?) then (Oui) :Le joueur effectue un saut; note right **Saut** @@ -29,12 +29,12 @@ repeat end note endif - if (Le joueur clique sur un bonus dans son inventaire ?) then (Oui) + if (Le joueur percute un bonus ?) then (Oui) :Activer un bonus; note right **Activation de Bonus** - Déclenche l'effet du bonus sélectionné. - - Exemple : Invincibilité, Double saut. + - Exemple : Ralentissement du temps. end note endif } @@ -44,7 +44,7 @@ repeat :Arriver sur le menu de pause; note right **Menu de pause** - - Affiche les options : Reprendre, Quitter, Mode Checkpoint, Volume. + - Affiche les options : Reprendre, Quitter, Volume. end note endif } @@ -53,12 +53,6 @@ repeat if (Le joueur touche la zone de fin ?) then (Oui) :Terminer le niveau; :Afficher une animation de fin de niveau; - :Conserver les pièces obtenues; - note right - **Fin du Niveau** - - Succès enregistré. - - Les pièces collectées sont sauvegardées. - end note endif } endif diff --git a/Documentation/UML/activity-diagram/sub-activation-bonus.puml b/Documentation/UML/activity-diagram/sub-activation-bonus.puml index 6a1b106..4bb6903 100644 --- a/Documentation/UML/activity-diagram/sub-activation-bonus.puml +++ b/Documentation/UML/activity-diagram/sub-activation-bonus.puml @@ -5,9 +5,9 @@ start switch (Type de bonus) case (Temps ralenti) :Activer ralentissement du temps; - :Temps ralenti : 3 secondes; - case (Annulation d'obstacle) - :Supprimer tous les obstacles; + :Durée : 3 secondes; + case (Temps accéléré) + :Activer accélération du temps; :Durée : 3 secondes; endswitch stop diff --git a/Documentation/UML/activity-diagram/sub-bonus.puml b/Documentation/UML/activity-diagram/sub-bonus.puml index 7452333..bb4b7e6 100644 --- a/Documentation/UML/activity-diagram/sub-bonus.puml +++ b/Documentation/UML/activity-diagram/sub-bonus.puml @@ -1,7 +1,7 @@ @startuml sub-bonus start -if (Le joueur touche un bonus ?) then (Oui) +if (Le joueur percute un bonus ?) then (Oui) :Ajouter le bonus à l'inventaire; else (Non) endif diff --git a/Documentation/UML/activity-diagram/sub-bumper.puml b/Documentation/UML/activity-diagram/sub-bumper.puml deleted file mode 100644 index 350314a..0000000 --- a/Documentation/UML/activity-diagram/sub-bumper.puml +++ /dev/null @@ -1,10 +0,0 @@ -@startuml sub-bumper - -start -if (Le joueur touche un bumper ?) then (Oui) - :Effectuer un grand saut; -else (Non) -endif -stop - -@enduml diff --git a/Documentation/UML/activity-diagram/sub-forme.puml b/Documentation/UML/activity-diagram/sub-forme.puml index efc1035..fbd2de2 100644 --- a/Documentation/UML/activity-diagram/sub-forme.puml +++ b/Documentation/UML/activity-diagram/sub-forme.puml @@ -7,10 +7,6 @@ switch (Forme) :Mode fusée; case (Forme roue) :Mode roue; - case (Forme sens inversé) - :Mode sens inversé; - case (Forme gravité inversée) - :Mode gravité inversée; endswitch stop diff --git a/Documentation/UML/activity-diagram/sub-pause.puml b/Documentation/UML/activity-diagram/sub-pause.puml index 794e381..e6f216c 100644 --- a/Documentation/UML/activity-diagram/sub-pause.puml +++ b/Documentation/UML/activity-diagram/sub-pause.puml @@ -11,13 +11,10 @@ else (Quitter) :Quitter le niveau; :Retour au menu principal; stop -else (Mode Checkpoint) - :Activer/Désactiver le mode Checkpoint; - :Revenir au menu de pause; else (Volume) :Modifier le volume sonore; :Revenir au menu de pause; -else (Menu de sleection de niveau) +else (Menu de sélection de niveau) :Revenir au menu de selection de niveau; endif diff --git a/Documentation/UML/activity-diagram/sub-pieces.puml b/Documentation/UML/activity-diagram/sub-pieces.puml deleted file mode 100644 index 7b75761..0000000 --- a/Documentation/UML/activity-diagram/sub-pieces.puml +++ /dev/null @@ -1,10 +0,0 @@ -@startuml sub-pieces - -start -if (Le joueur touche une pièce ?) then (Oui) - :Ajouter la pièce au niveau; -else (Non) -endif -stop - -@enduml diff --git a/Documentation/UML/class-diagram-light.puml b/Documentation/UML/class-diagram-light.puml new file mode 100644 index 0000000..47e939e --- /dev/null +++ b/Documentation/UML/class-diagram-light.puml @@ -0,0 +1,303 @@ +@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 diff --git a/Documentation/UML/class-diagram.puml b/Documentation/UML/class-diagram.puml index 7c46b46..8643b3d 100644 --- a/Documentation/UML/class-diagram.puml +++ b/Documentation/UML/class-diagram.puml @@ -5,107 +5,581 @@ skinparam classAttributeIconSize 0 skinparam classFontStyle Bold hide enum methods -class GameManager { - - score: int - - isPaused: Boolean - + StartGame() - + RestartLevel() - + PauseGame() - + ResumeGame() - + UpdateScore(points: int) +package UnityEngine { + class GameObject { + } + class MonoBehaviour { + } + class Rigidbody2D { + } + class Transform { + } + class ParticleSystem { + } + class SpriteRenderer { + } + class Collider2D { + } + class Collision2D { + } + class Vector3 { + } + class Vector2 { + } + class Quaternion { + } + class Mathf { + {method} + Lerp(...) {static} + {method} + Round(...) {static} + {method} + Clamp(...) {static} + {method} + Sin(...) {static} + {method} + Abs(...) {static} + {method} + DeltaAngle(...) {static} + {method} + MoveTowardsAngle(...) {static} + {method} + RoundToInt(...) {static} + } + class Time { + {method} + deltaTime: float {static} {readOnly} + {method} + timeScale: float {static} + } + class Input { + {method} + GetKey(...) {static} + {method} + GetKeyDown(...) {static} + {method} + GetMouseButtonDown(...) {static} + {method} + GetMouseButtonUp(...) {static} + {method} + GetAxis(...) {static} + } + class Camera { + {method} + main: Camera {static} {readOnly} + {method} + ScreenToWorldPoint(...) + } + class Physics2D { + {method} + OverlapBoxAll(...) {static} + {method} + RaycastAll(...) {static} + {method} + OverlapPoint(...) {static} + {method} + OverlapAreaAll(...) {static} + } + class Resources { + {method} + Load(...) {static} + {method} + LoadAll(...) {static} + } + class PlayerPrefs { + {method} + GetFloat(...) {static} + {method} + SetFloat(...) {static} + {method} + HasKey(...) {static} + } + class AudioSource { + {method} + volume: float + {method} + clip: AudioClip + {method} + Play() + {method} + Pause() + } + class AudioClip { + } + class Slider { + } + class Button { + } + class Image { + } + class RectTransform { + } + class Bounds { + } + class Debug { + {method} + Log(...) {static} + {method} + LogWarning(...) {static} + {method} + LogError(...) {static} + } + class Application { + {method} + persistentDataPath: string {static} {readOnly} + {method} + dataPath: string {static} {readOnly} + {method} + Quit() {static} + } + class Canvas { + {method} + ForceUpdateCanvases() {static} + } + class UnityEngine.Object { + {method} + FindAnyObjectByType(...) {static} + } + class Renderer { + } +} + +package UnityEngine.SceneManagement { + class SceneManager { + {method} + LoadScene(...) {static} + {method} + LoadSceneAsync(...) {static} + {method} + GetActiveScene(...) {static} + } +} + +package UnityEngine.UI { + class Text { + } +} + +package TMPro { + class TMP_Text { + } +} + +package System { + package IO { + class Path { + {method} + Combine(...) {static} + {method} + GetFileNameWithoutExtension(...) {static} + } + class File { + {method} + Exists(...) {static} + {method} + ReadAllText(...) {static} + {method} + WriteAllText(...) {static} + {method} + Copy(...) {static} + {method} + GetExtension(...) {static} + {method} + GetFileName(...) {static} + {method} + GetFileNameWithoutExtension(...) {static} + } + class Directory { + {method} + Exists(...) {static} + {method} + CreateDirectory(...) {static} + } + } + package Collections { + class IEnumerator { + } + package Generic { + class List { + } + } + } +} + +package SimpleFileBrowser { + class FileBrowser { + {method} + WaitForLoadDialog(...) {static} + {method} + WaitForSaveDialog(...) {static} + {method} + Success: bool {static} {readOnly} + {method} + Result: string[*] {static} {readOnly} + {method} + PickMode: enumeration {static} {readOnly} + } +} + +class PlayerCamera { + {field} + playerObject: UnityEngine.GameObject + {field} + normalMinYFollow: float + {field} + shipMinYFollow: float + {field} + smoothSpeed: float + {field} - initialY: float + {field} + isPlaying: bool + + {method} - Start() + {method} - Update() +} +PlayerCamera --|> UnityEngine.MonoBehaviour +PlayerCamera --> UnityEngine.GameObject : <> +PlayerCamera ..> UnityEngine.Mathf : <> +PlayerCamera ..> UnityEngine.Time : <> +PlayerCamera ..> Player : <> +PlayerCamera ..> ShipGameMode : <> +PlayerCamera ..> UnityEngine.Transform : <> +PlayerCamera ..> UnityEngine.Vector3 : <> + +class Player { + {field} + RigidBody: UnityEngine.Rigidbody2D {get} {private set} + {field} + Transform: UnityEngine.Transform {get} {private set} + {field} + Particle: UnityEngine.ParticleSystem {get} {private set} + {field} + LevelsLoader: LevelsLoader {get} {set} + {field} + SpriteRenderer: UnityEngine.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: UnityEngine.Collision2D) + {method} + OnCollisionExit2D(collision: UnityEngine.Collision2D) + {method} + OnTriggerEnter2D(collision: UnityEngine.Collider2D) + {method} + ChangeGameMode(newMode: IGameMode) +} +Player --|> UnityEngine.MonoBehaviour +Player *--> UnityEngine.Rigidbody2D : <> +Player *--> UnityEngine.Transform : <> +Player *--> UnityEngine.ParticleSystem : <> +Player o--> LevelsLoader : <> +Player *--> UnityEngine.SpriteRenderer : <> +Player o--> IGameMode : <> +Player ..> UnityEngine.Resources : <> +Player ..> UnityEngine.Debug : <> +Player ..> ShipPortal : <> +Player ..> CubePortal : <> +Player ..> BonusBoostSpeed : <> +Player ..> BonusSlowSpeed : <> +Player ..> NormalGameMode : <> +Player ..> UnityEngine.Collision2D : <> +Player ..> UnityEngine.Collider2D : <> + +class PauseMenu { + {field} + pauseMenu: UnityEngine.GameObject + {field} + pauseButton: UnityEngine.GameObject + {field} + levelLoader: LevelLoader + {field} + volumeSlider: UnityEngine.UI.Slider + + {method} + Start() + {method} + ChangeVolume() + {method} + Pause() + {method} + Home() + {method} + Resume() +} +PauseMenu --|> UnityEngine.MonoBehaviour +PauseMenu --> UnityEngine.GameObject : <> +PauseMenu --> LevelLoader : <> +PauseMenu --> UnityEngine.UI.Slider : <> +PauseMenu ..> UnityEngine.PlayerPrefs : <> +PauseMenu ..> UnityEngine.Time : <> +PauseMenu ..> UnityEngine.SceneManagement.SceneManager : <> + +class MainMenu { + {method} + LaunchGame() + {method} + OpenImport() + {method} + QuitGame() + {method} + LevelEditor() + {method} + EditorChoice() + {method} + CreateLevel() +} +MainMenu --|> UnityEngine.MonoBehaviour +MainMenu ..> UnityEngine.SceneManagement.SceneManager : <> +MainMenu ..> UnityEngine.Application : <> + +class LevelStat { + {field} + JsonName: string {get} {set} + {field} + totalJumps: Integer + {field} + totalAttempts: Integer + {field} + progressionPercent: Integer + + {method} + {static} CreateFromJSON(jsonString: string): LevelStat +} +LevelStat ..> UnityEngine.JsonUtility : <> + +class LevelsLoader { + {field} + levels: System.Collections.Generic.List + {field} + levelCurrent: Level + + {method} - Start() + {method} - LoadAllLevels() + {method} - SaveLevelCurrent() + {method} + NextLevel() + {method} + PreviousLevel() + {method} + IncreaseTotalJumps() + {method} + IncreaseTotalAttempts() + {method} + CalculateCurrentProgressionPercent(playerPosition: UnityEngine.Vector3): Integer + {method} + RefreshLevels() +} +LevelsLoader --|> UnityEngine.MonoBehaviour +LevelsLoader *--> Level : <> +LevelsLoader ..> UnityEngine.TextAsset : <> +LevelsLoader ..> UnityEngine.Resources : <> +LevelsLoader ..> System.IO.Path : <> +LevelsLoader ..> UnityEngine.Application : <> +LevelsLoader ..> System.IO.File : <> +LevelsLoader ..> UnityEngine.JsonUtility : <> +LevelsLoader ..> LevelStat : <> +LevelsLoader ..> UnityEngine.Vector3 : <> +LevelsLoader ..> UnityEngine.Mathf : <> +LevelsLoader ..> WinnerWall : <> +LevelsLoader ..> UnityEngine.GameObject : <> +LevelsLoader ..> UnityEngine.Renderer : <> +LevelsLoader ..> System.Collections.Generic.List : <> + +class LevelLoader { + {field} + levelsLoader: LevelsLoader + {field} + audioSource: UnityEngine.AudioSource + {field} + progressionText: UnityEngine.UI.Text + {field} - groundY: float + + {method} - GetPrefab(type: string): UnityEngine.GameObject + {method} - LoadAudio() + {method} - LoadElements() + {method} + Start() + {method} + Update() +} +LevelLoader --|> UnityEngine.MonoBehaviour +LevelLoader o--> LevelsLoader : <> +LevelLoader *--> UnityEngine.AudioSource : <> +LevelLoader --> UnityEngine.UI.Text : <> +LevelLoader ..> System.IO.Path : <> +LevelLoader ..> UnityEngine.Resources : <> +LevelLoader ..> UnityEngine.PlayerPrefs : <> +LevelLoader ..> UnityEngine.GameObject : <> +LevelLoader ..> UnityEngine.Vector3 : <> +LevelLoader ..> UnityEngine.Quaternion : <> +LevelLoader ..> UnityEngine.Transform : <> +LevelLoader ..> WinnerWall : <> +LevelLoader ..> Level : <> +LevelLoader ..> Ground : <> +LevelLoader ..> UnityEngine.AudioClip : <> +LevelLoader ..> UnityEngine.Renderer : <> + +class LevelEditor { + {field} - currentBlock: UnityEngine.GameObject + {field} - isPlacingBlock: bool + {field} - currentScale: UnityEngine.Vector3 + {field} - scaleStep: float + {field} + blockGroupContainer: UnityEngine.Transform + {field} + buttonPrefabTemplate: UnityEngine.GameObject + {field} - currentPage: Integer + {field} - buttonsPerPage: Integer {constant} + {field} - blockPrefabs: System.Collections.Generic.List + {field} - currentButtons: System.Collections.Generic.List + {field} - resizingTarget: UnityEngine.GameObject + {field} - isResizing: bool + {field} - originalMousePos: UnityEngine.Vector3 + {field} - originalScale: UnityEngine.Vector3 + {field} - currentResizeAxis: ResizeAxis + + {method} - Start() + {method} - LoadPrefabs() + {method} - GenerateButtons() + {method} - ClearCurrentButtons() + {method} + NextPage() + {method} + PreviousPage() + {method} - SelectPrefab(prefab: UnityEngine.GameObject) + {method} - Update() + {method} - PlaceBlock() + {method} - TrySnapToNearbyBlock() + {method} - InstantiateAndPrepare(prefab: UnityEngine.GameObject, scaleOverride: UnityEngine.Vector3?) + {method} - HandleBlockRotation() +} +LevelEditor --|> UnityEngine.MonoBehaviour +LevelEditor o--> blockGroupContainer : <> +LevelEditor --> buttonPrefabTemplate : <> +LevelEditor *--> blockPrefabs : <> +LevelEditor *--> currentButtons : <> +LevelEditor o--> currentBlock : <> +LevelEditor o--> resizingTarget : <> +LevelEditor ..> UnityEngine.GameObject : <> +LevelEditor ..> UnityEngine.Vector3 : <> +LevelEditor ..> UnityEngine.Mathf : <> +LevelEditor ..> UnityEngine.Input : <> +LevelEditor ..> UnityEngine.Camera : <> +LevelEditor ..> UnityEngine.Physics2D : <> +LevelEditor ..> UnityEngine.Collider2D : <> +LevelEditor ..> UnityEngine.Bounds : <> +LevelEditor ..> UnityEngine.SpriteRenderer : <> +LevelEditor ..> UnityEngine.UI.Button : <> +LevelEditor ..> UnityEngine.UI.Image : <> +LevelEditor ..> UnityEngine.RectTransform : <> +LevelEditor ..> UnityEngine.Debug : <> +LevelEditor ..> System.Collections.Generic.List : <> +LevelEditor ..> UnityEngine.Resources : <> +LevelEditor ..> Player : <> ' (via tags) +LevelEditor ..> Ground : <> ' (via tags) +LevelEditor ..> Portal : <> ' (via tags) +LevelEditor ..> SmallObstacle : <> ' (via tags) +LevelEditor ..> Spike : <> ' (via tags) +LevelEditor ..> Block : <> ' (via tags) +LevelEditor ..> Bonus : <> ' (via tags) + +enum ResizeAxis <> { + None + Horizontal + Vertical +} +LevelEditor *--> ResizeAxis : <> + +class LevelElement { + {field} + type: string + {field} + x: float + {field} + y: float + {field} + scaleX: float + {field} + scaleY: float } class Level { - - name: String - - musicName: String - + StartLevel() - + EndLevel() - + CheckCompletion(): Boolean + {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: System.Collections.Generic.List + {field} + LastX: float {get} + + {method} + {static} CreateFromJSON(jsonString: string): Level +} +Level *--> LevelElement : <> +Level ..> UnityEngine.JsonUtility : <> +Level ..> System.Collections.Generic.List : <> + +class JSONImporter { + {field} + statusText: TMPro.TMP_Text + + {method} - Awake() + {method} - Start() + {method} + ImportJSON() + {method} - ShowFileBrowser(): System.Collections.IEnumerator + {method} - UpdateStatus(message: string, color: UnityEngine.Color) +} +JSONImporter --|> UnityEngine.MonoBehaviour +JSONImporter --> TMPro.TMP_Text : <> +JSONImporter ..> System.Collections.IEnumerator : <> +JSONImporter ..> SimpleFileBrowser.FileBrowser : <> +JSONImporter ..> System.IO.Path : <> +JSONImporter ..> System.IO.File : <> +JSONImporter ..> UnityEngine.Color : <> +JSONImporter ..> LevelsLoader : <> +JSONImporter ..> UnityEngine.Object : <> +JSONImporter ..> UnityEngine.Canvas : <> +JSONImporter ..> UnityEngine.SceneManagement.SceneManager : <> + +class JSONExporter { + {field} + statusText: TMPro.TMP_Text + {field} - editor: LevelEditor + {field} - levelsFolder: string + + {method} - Awake() + {method} - Start() + {method} + ExportJSON() + {method} - ShowSaveDialog(): System.Collections.IEnumerator + {method} - SetStatus(message: string, color: UnityEngine.Color) +} +JSONExporter --|> UnityEngine.MonoBehaviour +JSONExporter o--> LevelEditor : <> +JSONExporter --> TMPro.TMP_Text : <> +JSONExporter ..> System.Collections.IEnumerator : <> +JSONExporter ..> System.Collections.Generic.List : <> +JSONExporter ..> SimpleFileBrowser.FileBrowser : <> +JSONExporter ..> System.IO.Path : <> +JSONExporter ..> System.IO.File : <> +JSONExporter ..> System.IO.Directory : <> +JSONExporter ..> UnityEngine.Collider2D : <> +JSONExporter ..> UnityEngine.Object : <> +JSONExporter ..> UnityEngine.Vector3 : <> +JSONExporter ..> UnityEngine.Mathf : <> +JSONExporter ..> UnityEngine.JsonUtility : <> +JSONExporter ..> UnityEngine.Color : <> +JSONExporter ..> LevelsLoader : <> +JSONExporter ..> UnityEngine.Canvas : <> + +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: UnityEngine.Collision2D) {abstract} + {method} + OnCollisionExit(player: Player, collision: UnityEngine.Collision2D) {abstract} } -abstract class LevelElement { - - x: Float - - y: Float -} +class ShipGameMode implements IGameMode { + {field} - HorizontalSpeed: float {constant} + {field} - JumpForce: float {constant} + {field} - JumpKey: UnityEngine.KeyCode {constant} + {field} - UpperAngle: float {constant} + {field} - LowerAngle: float {constant} + {field} - RotationTransitionDuration: float {constant} -abstract class Obstacle extends LevelElement { - + TriggerEffect(player: Player) + {method} + Update(player: Player) + {method} - GetCurrentZAngle(player: Player): float + {method} - Jump(player: Player) + {method} + OnCollisionEnter(player: Player, collision: UnityEngine.Collision2D) + {method} + OnCollisionExit(player: Player, collision: UnityEngine.Collision2D) } +ShipGameMode ..|> IGameMode +ShipGameMode ..> Player : <> +ShipGameMode ..> UnityEngine.Vector2 : <> +ShipGameMode ..> UnityEngine.Input : <> +ShipGameMode ..> UnityEngine.KeyCode : <> +ShipGameMode ..> UnityEngine.Mathf : <> +ShipGameMode ..> UnityEngine.Time : <> +ShipGameMode ..> UnityEngine.Quaternion : <> +ShipGameMode ..> UnityEngine.SceneManagement.SceneManager : <> +ShipGameMode ..> UnityEngine.Collision2D : <> +ShipGameMode ..> LevelsLoader : <> -class Platform extends LevelElement { +class NormalGameMode implements IGameMode { + {field} - HorizontalSpeed: float {constant} + {field} - JumpForce: float {constant} + {field} - JumpKey: UnityEngine.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: UnityEngine.Collision2D) + {method} + OnCollisionExit(player: Player, collision: UnityEngine.Collision2D) } +NormalGameMode ..|> IGameMode +NormalGameMode ..> Player : <> +NormalGameMode ..> UnityEngine.Vector2 : <> +NormalGameMode ..> UnityEngine.Input : <> +NormalGameMode ..> UnityEngine.KeyCode : <> +NormalGameMode ..> UnityEngine.Mathf : <> +NormalGameMode ..> UnityEngine.Time : <> +NormalGameMode ..> UnityEngine.Quaternion : <> +NormalGameMode ..> UnityEngine.SceneManagement.SceneManager : <> +NormalGameMode ..> UnityEngine.Collision2D : <> +NormalGameMode ..> LevelsLoader : <> +NormalGameMode ..> UnityEngine.Vector3 : <> -class Spike extends Obstacle { - + TriggerEffect(player: Player) -} -class Portal extends LevelElement { - - destination: Vector2 - - type: PortalType - + Teleport(player: 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 { } -enum PortalType { - Normal, Gravity, Speed -} - -class Bumper extends LevelElement { - - bounceForce: Float - + Bounce(player: Player) -} - -class LevelEnd extends LevelElement { - + TriggerEndGame() -} - -class Collectible extends LevelElement { - - points: int - + Collect(player: Player) -} - -class Player { - - JUMP_FORCE: static const Float = 26.6581 - - SPEED: static const Float = 8.6 - - rigidBody: Rigidbody2D - - isColliding: Boolean - - isGrounded: Boolean - - gravityScale: Float - + Jump() - + IsJumping(): Boolean - + OnCollisionEnter2D(collision: Collision2D) - + OnCollisionExit2D(collision: Collision2D) - + ChangeGravity() - + Die() - + Respawn() - + CollectItem(item: Collectible) -} - -class LevelLoader { - + LoadLevel(jsonPath: String): Level - + UnloadLevel(level: Level) -} - -class LevelParser { - + ParseJSON(jsonData: String): Level -} - -class MusicManager { - - currentTrack: String - - volume: Float - + PlayMusic(musicPath: String) - + StopMusic() - + SetVolume(level: Float) -} - -GameManager *--> Level : <> -GameManager --> LevelLoader : <> -LevelLoader --> LevelParser : <> -Level *--> LevelElement : <> -GameManager *--> Player : <> -GameManager --> MusicManager : <> -Player --> LevelEnd : <> -Player --> Portal : <> -Player --> Collectible : <> -Obstacle --> Player : <> +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 diff --git a/Documentation/UML/state-diagram/state-diagram.puml b/Documentation/UML/state-diagram.puml similarity index 75% rename from Documentation/UML/state-diagram/state-diagram.puml rename to Documentation/UML/state-diagram.puml index 25fdb88..f6ce20e 100644 --- a/Documentation/UML/state-diagram/state-diagram.puml +++ b/Documentation/UML/state-diagram.puml @@ -1,4 +1,4 @@ -@startuml Geometry Dash - Diagramme d'etats du joueur +@startuml Geometry Dash - Diagramme d'états du joueur start @@ -16,12 +16,6 @@ repeat switch (Forme) case (Forme fusée) :Mode fusée; - case (Forme roue) - :Mode roue; - case (Forme sens inversé) - :Mode sens inversé; - case (Forme gravité inversée) - :Mode gravité inversée; endswitch if (Le joueur percute un obstacle ?) then (Oui) :Le joueur meurt; @@ -38,8 +32,8 @@ repeat :Le joueur meurt; stop endif - case (Annulation d'obstacle) - :Supprimer tous les obstacles; + case (Temps accéléré) + :Activer accélération du temps; :Durée : 3 secondes; endswitch } diff --git a/Documentation/UML/use-case-diagram.puml b/Documentation/UML/use-case-diagram.puml index 8a90d04..0e05c0f 100644 --- a/Documentation/UML/use-case-diagram.puml +++ b/Documentation/UML/use-case-diagram.puml @@ -4,100 +4,64 @@ left to right direction actor Joueur as Joueur - rectangle "Menu principal" { - usecase "Configurer les paramètres" as ConfigurerParametres usecase "Accéder à la sélection des niveaux" as SelectionNiveau - usecase "Accéder à l'éditeur de cartes" as EditeurCartes - usecase "Consulter les statistiques" as ConsulterStats - usecase "Voir les trophées et récompenses" as VoirTrophees + usecase "Accéder à l'éditeur de niveau" as EditeurNiveau + usecase "Importer un niveau" as ImporterNiveau + usecase "Quitter le jeu" as QuitterJeu } rectangle "Sélection des niveaux" { - usecase "Parcourir les niveaux disponibles" as ParcourirNiveaux - usecase "Afficher les détails d'un niveau" as AfficherDetailsNiveau + usecase "Parcourir les niveaux disponibles (passer au niveau suivant ou précédent)" as ParcourirNiveaux + usecase "Afficher les statistiques d'un niveau (nombre d'essais, nombre de sauts et progression record)" as AfficherDetailsNiveau usecase "Commencer un niveau" as CommencerNiveau } rectangle "Pendant un niveau" { - usecase "Sauter" as Sauter + usecase "Appuyer sur la barre d'espace" as Sauter + usecase "Voir la progression dans le niveau" as VoirProgression usecase "Mettre le jeu en pause" as MettrePause } -rectangle "Paramètres" { - usecase "Régler le volume du jeu" as ReglerVolume - usecase "Changer la musique de fond" as ChangerMusique - usecase "Lire les instructions d'aide" as LireAide -} - -rectangle "Création de cartes" { - usecase "Créer une nouvelle carte" as CreerNouvelleCarte - usecase "Modifier une carte existante" as ModifierCarte - usecase "Tester une carte" as TesterCarte - usecase "Partager une carte" as PartagerCarte - usecase "Télécharger des cartes de la communauté" as TelechargerCartes -} - -rectangle "Statistiques" { - usecase "Afficher les statistiques globales" as AfficherStatsGlobales - usecase "Afficher les statistiques de session" as AfficherStatsSession -} - -rectangle "Trophées et récompenses" { - usecase "Voir les trophées débloqués" as VoirTropheesDebloques - usecase "Voir les pièces collectées" as VoirPieces -} - rectangle "Menu Pause" { usecase "Continuer" as Continuer - usecase "Redémarrer la partie" as RedemarrerPartie - usecase "Retour à la sélection des maps" as RetourSelection + usecase "Revenir au menu principal" as RevenirMenuPrincipal + usecase "Régler le volume de la musique" as ReglerVolumeMusique + usecase "Voir le nombre d'essais, nombre de sauts et progression record" as StatistiquesNiveau } -Joueur --> ConfigurerParametres : <> -Joueur --> SelectionNiveau : <> -Joueur --> EditeurCartes : <> -Joueur --> ConsulterStats : <> -Joueur --> VoirTrophees : <> +rectangle "Création de niveaux" { + usecase "Créer un nouveau niveau" as CreerNouveauNiveau + usecase "Modifier un niveau existante" as ModifierNiveau + usecase "Tester un niveau" as TesterNiveau + usecase "Exporter un niveau" as ExporterNiveau +} -SelectionNiveau --> ParcourirNiveaux : <> -ParcourirNiveaux --> AfficherDetailsNiveau : <> -ParcourirNiveaux --> CommencerNiveau : <> +Joueur --> SelectionNiveau : <> +Joueur --> EditeurNiveau : <> +Joueur --> ImporterNiveau : <> +Joueur --> QuitterJeu : <> + +SelectionNiveau --> AfficherDetailsNiveau : <> +SelectionNiveau --> ParcourirNiveaux : <> +SelectionNiveau --> CommencerNiveau : <> CommencerNiveau --> Sauter : <> +CommencerNiveau --> VoirProgression : <> CommencerNiveau --> MettrePause : <> -ConfigurerParametres --> ReglerVolume : <> -ConfigurerParametres --> ChangerMusique : <> -ConfigurerParametres --> LireAide : <> - -EditeurCartes --> CreerNouvelleCarte : <> -EditeurCartes --> ModifierCarte : <> -EditeurCartes --> TelechargerCartes : <> -CreerNouvelleCarte --> TesterCarte : <> -ModifierCarte --> TesterCarte : <> -CreerNouvelleCarte --> PartagerCarte : <> -ModifierCarte --> PartagerCarte : <> - -TesterCarte--> Sauter : <> -TesterCarte--> MettrePause : <> - -ConsulterStats --> AfficherStatsGlobales : <> -ConsulterStats --> AfficherStatsSession : <> - -VoirTrophees --> VoirTropheesDebloques : <> -VoirTrophees --> VoirPieces : <> - MettrePause --> Continuer : <> -MettrePause --> RedemarrerPartie : <> -MettrePause --> RetourSelection : <> +MettrePause --> RevenirMenuPrincipal : <> +MettrePause --> ReglerVolumeMusique : <> +MettrePause --> StatistiquesNiveau : <> -RedemarrerPartie --> Sauter : <> -RedemarrerPartie --> MettrePause : <> +EditeurNiveau --> CreerNouveauNiveau : <> +EditeurNiveau --> ModifierNiveau : <> -Continuer --> Sauter : <> -Continuer --> MettrePause : <> +CreerNouveauNiveau --> TesterNiveau : <> +ModifierNiveau --> TesterNiveau : <> -RetourSelection --> ParcourirNiveaux : <> +CreerNouveauNiveau --> ExporterNiveau : <> +ModifierNiveau --> ExporterNiveau : <> @enduml diff --git a/Documentation/diagrammes.md b/Documentation/diagrammes.md index afcfa61..6a1a4f1 100644 --- a/Documentation/diagrammes.md +++ b/Documentation/diagrammes.md @@ -7,7 +7,7 @@ Les modélisations UML du projet sont générés à partir des fichiers `.puml` - [Diagramme de classes](./UML/class-diagram.puml) - [Diagramme d'activités](./UML/activity-diagram/activity-diagram.puml) - [Diagramme de cas d'utilisation](./UML/use-case-diagram.puml) -- [Diagramme d'états](./UML/state-diagram/state-diagram.puml) +- [Diagramme d'états](./UML/state-diagram.puml) ## Diagramme de Gantt diff --git a/README.md b/README.md index 37c4c62..3b4daba 100644 --- a/README.md +++ b/README.md @@ -35,3 +35,11 @@ cd cnam-geometry-dash # Ouvrir le projet avec Unity Hub ``` + +## Screenshots + +![Homepage](./Documentation/Screenshots/home-page.png) + +![Gameplay](./Documentation/Screenshots/gameplay.png) + +![Levels selection](./Documentation/Screenshots/levels-selection.png)