diff --git a/star-dash/star-dash.xcodeproj/project.pbxproj b/star-dash/star-dash.xcodeproj/project.pbxproj index 7b322b3b..80dcdfa7 100644 --- a/star-dash/star-dash.xcodeproj/project.pbxproj +++ b/star-dash/star-dash.xcodeproj/project.pbxproj @@ -8,6 +8,16 @@ /* Begin PBXBuildFile section */ 142D9F8F2BA15FBB005FE9E0 /* .swiftlint.yml in Resources */ = {isa = PBXBuildFile; fileRef = 142D9F8E2BA15FBB005FE9E0 /* .swiftlint.yml */; }; + 145F2C802BA203B400457549 /* Event.swift in Sources */ = {isa = PBXBuildFile; fileRef = 145F2C7F2BA203B400457549 /* Event.swift */; }; + 145F2C842BA22CA300457549 /* EventModifiable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 145F2C832BA22CA300457549 /* EventModifiable.swift */; }; + 14E2478E2BA22FCE0071FFC0 /* MoveEvent.swift in Sources */ = {isa = PBXBuildFile; fileRef = 14E2478D2BA22FCE0071FFC0 /* MoveEvent.swift */; }; + 14E247932BA2CA920071FFC0 /* DequeModule in Frameworks */ = {isa = PBXBuildFile; productRef = 14E247922BA2CA920071FFC0 /* DequeModule */; }; + 14E247952BA2CB480071FFC0 /* EventManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 14E247942BA2CB480071FFC0 /* EventManager.swift */; }; + 461148912BA1CDBF0073E7E1 /* SystemManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 461148902BA1CDBF0073E7E1 /* SystemManager.swift */; }; + 461148932BA1D04B0073E7E1 /* System.swift in Sources */ = {isa = PBXBuildFile; fileRef = 461148922BA1D04B0073E7E1 /* System.swift */; }; + 461148962BA1D53D0073E7E1 /* PositionSystem.swift in Sources */ = {isa = PBXBuildFile; fileRef = 461148952BA1D53D0073E7E1 /* PositionSystem.swift */; }; + 461148982BA1E41F0073E7E1 /* PhysicsSystem.swift in Sources */ = {isa = PBXBuildFile; fileRef = 461148972BA1E41F0073E7E1 /* PhysicsSystem.swift */; }; + 46B8C09A2BA328D900498705 /* GameEngine.swift in Sources */ = {isa = PBXBuildFile; fileRef = 46B8C0992BA328D900498705 /* GameEngine.swift */; }; 4E630EF62B9F7E070008F887 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4E630EF52B9F7E070008F887 /* AppDelegate.swift */; }; 4E630EF82B9F7E070008F887 /* SceneDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4E630EF72B9F7E070008F887 /* SceneDelegate.swift */; }; 4E630EFA2B9F7E070008F887 /* ViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4E630EF92B9F7E070008F887 /* ViewController.swift */; }; @@ -17,13 +27,6 @@ 4E630F0D2B9F7E090008F887 /* star_dashTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4E630F0C2B9F7E090008F887 /* star_dashTests.swift */; }; 4E630F172B9F7E090008F887 /* star_dashUITests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4E630F162B9F7E090008F887 /* star_dashUITests.swift */; }; 4E630F192B9F7E090008F887 /* star_dashUITestsLaunchTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4E630F182B9F7E090008F887 /* star_dashUITestsLaunchTests.swift */; }; - E6A745162BA057040080C1BE /* MTKRenderer.swift in Sources */ = {isa = PBXBuildFile; fileRef = E6A745112BA057040080C1BE /* MTKRenderer.swift */; }; - E6A745172BA057040080C1BE /* ControlView.swift in Sources */ = {isa = PBXBuildFile; fileRef = E6A745122BA057040080C1BE /* ControlView.swift */; }; - E6A745182BA057040080C1BE /* Renderer.swift in Sources */ = {isa = PBXBuildFile; fileRef = E6A745132BA057040080C1BE /* Renderer.swift */; }; - E6A745192BA057040080C1BE /* GameScene.swift in Sources */ = {isa = PBXBuildFile; fileRef = E6A745152BA057040080C1BE /* GameScene.swift */; }; - E6A7451B2BA0C1890080C1BE /* PlayerView.swift in Sources */ = {isa = PBXBuildFile; fileRef = E6A7451A2BA0C1890080C1BE /* PlayerView.swift */; }; - E6A7451D2BA0CAD90080C1BE /* JoystickView.swift in Sources */ = {isa = PBXBuildFile; fileRef = E6A7451C2BA0CAD90080C1BE /* JoystickView.swift */; }; - E6B550A12BA15E9C00DC7396 /* OverlayView.swift in Sources */ = {isa = PBXBuildFile; fileRef = E6B550A02BA15E9C00DC7396 /* OverlayView.swift */; }; 4E630F272B9F7E770008F887 /* Entity.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4E630F262B9F7E770008F887 /* Entity.swift */; }; 4E630F2A2B9F7EF60008F887 /* PositionComponent.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4E630F292B9F7EF60008F887 /* PositionComponent.swift */; }; 4E630F2C2B9F7F460008F887 /* Component.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4E630F2B2B9F7F460008F887 /* Component.swift */; }; @@ -38,6 +41,13 @@ 4E8660622BA0964A0035530D /* Obstacle.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4E8660612BA0964A0035530D /* Obstacle.swift */; }; 4E8660642BA096600035530D /* Tool.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4E8660632BA096600035530D /* Tool.swift */; }; 4E8660662BA097D40035530D /* PhysicsConstants.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4E8660652BA097D40035530D /* PhysicsConstants.swift */; }; + E6A745162BA057040080C1BE /* MTKRenderer.swift in Sources */ = {isa = PBXBuildFile; fileRef = E6A745112BA057040080C1BE /* MTKRenderer.swift */; }; + E6A745172BA057040080C1BE /* ControlView.swift in Sources */ = {isa = PBXBuildFile; fileRef = E6A745122BA057040080C1BE /* ControlView.swift */; }; + E6A745182BA057040080C1BE /* Renderer.swift in Sources */ = {isa = PBXBuildFile; fileRef = E6A745132BA057040080C1BE /* Renderer.swift */; }; + E6A745192BA057040080C1BE /* GameScene.swift in Sources */ = {isa = PBXBuildFile; fileRef = E6A745152BA057040080C1BE /* GameScene.swift */; }; + E6A7451B2BA0C1890080C1BE /* PlayerView.swift in Sources */ = {isa = PBXBuildFile; fileRef = E6A7451A2BA0C1890080C1BE /* PlayerView.swift */; }; + E6A7451D2BA0CAD90080C1BE /* JoystickView.swift in Sources */ = {isa = PBXBuildFile; fileRef = E6A7451C2BA0CAD90080C1BE /* JoystickView.swift */; }; + E6B550A12BA15E9C00DC7396 /* OverlayView.swift in Sources */ = {isa = PBXBuildFile; fileRef = E6B550A02BA15E9C00DC7396 /* OverlayView.swift */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ @@ -59,6 +69,15 @@ /* Begin PBXFileReference section */ 142D9F8E2BA15FBB005FE9E0 /* .swiftlint.yml */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.yaml; path = .swiftlint.yml; sourceTree = ""; }; + 145F2C7F2BA203B400457549 /* Event.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Event.swift; sourceTree = ""; }; + 145F2C832BA22CA300457549 /* EventModifiable.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = EventModifiable.swift; sourceTree = ""; }; + 14E2478D2BA22FCE0071FFC0 /* MoveEvent.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MoveEvent.swift; sourceTree = ""; }; + 14E247942BA2CB480071FFC0 /* EventManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = EventManager.swift; sourceTree = ""; }; + 461148902BA1CDBF0073E7E1 /* SystemManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SystemManager.swift; sourceTree = ""; }; + 461148922BA1D04B0073E7E1 /* System.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = System.swift; sourceTree = ""; }; + 461148952BA1D53D0073E7E1 /* PositionSystem.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PositionSystem.swift; sourceTree = ""; }; + 461148972BA1E41F0073E7E1 /* PhysicsSystem.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PhysicsSystem.swift; sourceTree = ""; }; + 46B8C0992BA328D900498705 /* GameEngine.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = GameEngine.swift; sourceTree = ""; }; 4E630EF22B9F7E070008F887 /* star-dash.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "star-dash.app"; sourceTree = BUILT_PRODUCTS_DIR; }; 4E630EF52B9F7E070008F887 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; 4E630EF72B9F7E070008F887 /* SceneDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SceneDelegate.swift; sourceTree = ""; }; @@ -72,13 +91,6 @@ 4E630F122B9F7E090008F887 /* star-dashUITests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = "star-dashUITests.xctest"; sourceTree = BUILT_PRODUCTS_DIR; }; 4E630F162B9F7E090008F887 /* star_dashUITests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = star_dashUITests.swift; sourceTree = ""; }; 4E630F182B9F7E090008F887 /* star_dashUITestsLaunchTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = star_dashUITestsLaunchTests.swift; sourceTree = ""; }; - E6A745112BA057040080C1BE /* MTKRenderer.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MTKRenderer.swift; sourceTree = ""; }; - E6A745122BA057040080C1BE /* ControlView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ControlView.swift; sourceTree = ""; }; - E6A745132BA057040080C1BE /* Renderer.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Renderer.swift; sourceTree = ""; }; - E6A745152BA057040080C1BE /* GameScene.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = GameScene.swift; sourceTree = ""; }; - E6A7451A2BA0C1890080C1BE /* PlayerView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = PlayerView.swift; sourceTree = ""; }; - E6A7451C2BA0CAD90080C1BE /* JoystickView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = JoystickView.swift; sourceTree = ""; }; - E6B550A02BA15E9C00DC7396 /* OverlayView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = OverlayView.swift; sourceTree = ""; }; 4E630F262B9F7E770008F887 /* Entity.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Entity.swift; sourceTree = ""; }; 4E630F292B9F7EF60008F887 /* PositionComponent.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PositionComponent.swift; sourceTree = ""; }; 4E630F2B2B9F7F460008F887 /* Component.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Component.swift; sourceTree = ""; }; @@ -93,6 +105,13 @@ 4E8660612BA0964A0035530D /* Obstacle.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Obstacle.swift; sourceTree = ""; }; 4E8660632BA096600035530D /* Tool.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Tool.swift; sourceTree = ""; }; 4E8660652BA097D40035530D /* PhysicsConstants.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PhysicsConstants.swift; sourceTree = ""; }; + E6A745112BA057040080C1BE /* MTKRenderer.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MTKRenderer.swift; sourceTree = ""; }; + E6A745122BA057040080C1BE /* ControlView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ControlView.swift; sourceTree = ""; }; + E6A745132BA057040080C1BE /* Renderer.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Renderer.swift; sourceTree = ""; }; + E6A745152BA057040080C1BE /* GameScene.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = GameScene.swift; sourceTree = ""; }; + E6A7451A2BA0C1890080C1BE /* PlayerView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = PlayerView.swift; sourceTree = ""; }; + E6A7451C2BA0CAD90080C1BE /* JoystickView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = JoystickView.swift; sourceTree = ""; }; + E6B550A02BA15E9C00DC7396 /* OverlayView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = OverlayView.swift; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -100,6 +119,7 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( + 14E247932BA2CA920071FFC0 /* DequeModule in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -120,6 +140,39 @@ /* End PBXFrameworksBuildPhase section */ /* Begin PBXGroup section */ + 145F2C7E2BA2039700457549 /* Events */ = { + isa = PBXGroup; + children = ( + 145F2C7F2BA203B400457549 /* Event.swift */, + 14E247942BA2CB480071FFC0 /* EventManager.swift */, + 145F2C832BA22CA300457549 /* EventModifiable.swift */, + 14E2478D2BA22FCE0071FFC0 /* MoveEvent.swift */, + ); + path = Events; + sourceTree = ""; + }; + 4611488F2BA1CD9E0073E7E1 /* Systems */ = { + isa = PBXGroup; + children = ( + 461148902BA1CDBF0073E7E1 /* SystemManager.swift */, + 461148922BA1D04B0073E7E1 /* System.swift */, + 461148952BA1D53D0073E7E1 /* PositionSystem.swift */, + 461148972BA1E41F0073E7E1 /* PhysicsSystem.swift */, + ); + path = Systems; + sourceTree = ""; + }; + 46B8C0982BA328BF00498705 /* GameEngine */ = { + isa = PBXGroup; + children = ( + 4611488F2BA1CD9E0073E7E1 /* Systems */, + 4E630F282B9F7EC20008F887 /* Components */, + 4E630F252B9F7E500008F887 /* Entities */, + 46B8C0992BA328D900498705 /* GameEngine.swift */, + ); + path = GameEngine; + sourceTree = ""; + }; 4E630EE92B9F7E070008F887 = { isa = PBXGroup; children = ( @@ -144,11 +197,12 @@ 4E630EF42B9F7E070008F887 /* star-dash */ = { isa = PBXGroup; children = ( + 46B8C0982BA328BF00498705 /* GameEngine */, E6A745142BA057040080C1BE /* GameScene */, E6A745102BA057040080C1BE /* Rendering */, 4E86605D2BA095CC0035530D /* Constants */, 4E630F352B9F91C20008F887 /* Enums */, - 4E630F252B9F7E500008F887 /* Entities */, + 145F2C7E2BA2039700457549 /* Events */, 4E630EF52B9F7E070008F887 /* AppDelegate.swift */, 4E630EF72B9F7E070008F887 /* SceneDelegate.swift */, 4E630EF92B9F7E070008F887 /* ViewController.swift */, @@ -177,40 +231,10 @@ path = "star-dashUITests"; sourceTree = ""; }; - E6A745102BA057040080C1BE /* Rendering */ = { - isa = PBXGroup; - children = ( - E6B5509F2BA15D2000DC7396 /* MTKRenderer */, - E6A745132BA057040080C1BE /* Renderer.swift */, - ); - path = Rendering; - sourceTree = ""; - }; - E6A745142BA057040080C1BE /* GameScene */ = { - isa = PBXGroup; - children = ( - E6A745152BA057040080C1BE /* GameScene.swift */, - ); - path = GameScene; - sourceTree = ""; - }; - E6B5509F2BA15D2000DC7396 /* MTKRenderer */ = { - isa = PBXGroup; - children = ( - E6A745112BA057040080C1BE /* MTKRenderer.swift */, - E6A7451A2BA0C1890080C1BE /* PlayerView.swift */, - E6A7451C2BA0CAD90080C1BE /* JoystickView.swift */, - E6A745122BA057040080C1BE /* ControlView.swift */, - E6B550A02BA15E9C00DC7396 /* OverlayView.swift */, - ); - path = MTKRenderer; - sourceTree = ""; - }; 4E630F252B9F7E500008F887 /* Entities */ = { isa = PBXGroup; children = ( 4E8660602BA0961F0035530D /* GameEntities */, - 4E630F282B9F7EC20008F887 /* Components */, 4E630F262B9F7E770008F887 /* Entity.swift */, 4E630F382B9F943B0008F887 /* EntityManager.swift */, ); @@ -257,6 +281,35 @@ path = GameEntities; sourceTree = ""; }; + E6A745102BA057040080C1BE /* Rendering */ = { + isa = PBXGroup; + children = ( + E6B5509F2BA15D2000DC7396 /* MTKRenderer */, + E6A745132BA057040080C1BE /* Renderer.swift */, + ); + path = Rendering; + sourceTree = ""; + }; + E6A745142BA057040080C1BE /* GameScene */ = { + isa = PBXGroup; + children = ( + E6A745152BA057040080C1BE /* GameScene.swift */, + ); + path = GameScene; + sourceTree = ""; + }; + E6B5509F2BA15D2000DC7396 /* MTKRenderer */ = { + isa = PBXGroup; + children = ( + E6A745112BA057040080C1BE /* MTKRenderer.swift */, + E6A7451A2BA0C1890080C1BE /* PlayerView.swift */, + E6A7451C2BA0CAD90080C1BE /* JoystickView.swift */, + E6A745122BA057040080C1BE /* ControlView.swift */, + E6B550A02BA15E9C00DC7396 /* OverlayView.swift */, + ); + path = MTKRenderer; + sourceTree = ""; + }; /* End PBXGroup section */ /* Begin PBXNativeTarget section */ @@ -274,6 +327,9 @@ dependencies = ( ); name = "star-dash"; + packageProductDependencies = ( + 14E247922BA2CA920071FFC0 /* DequeModule */, + ); productName = "star-dash"; productReference = 4E630EF22B9F7E070008F887 /* star-dash.app */; productType = "com.apple.product-type.application"; @@ -346,6 +402,9 @@ Base, ); mainGroup = 4E630EE92B9F7E070008F887; + packageReferences = ( + 14E247912BA2CA920071FFC0 /* XCRemoteSwiftPackageReference "swift-collections" */, + ); productRefGroup = 4E630EF32B9F7E070008F887 /* Products */; projectDirPath = ""; projectRoot = ""; @@ -413,16 +472,22 @@ files = ( 4E630F272B9F7E770008F887 /* Entity.swift in Sources */, 4E630F2C2B9F7F460008F887 /* Component.swift in Sources */, + 14E2478E2BA22FCE0071FFC0 /* MoveEvent.swift in Sources */, 4E8660622BA0964A0035530D /* Obstacle.swift in Sources */, + 461148932BA1D04B0073E7E1 /* System.swift in Sources */, 4E8660642BA096600035530D /* Tool.swift in Sources */, 4E630F392B9F943B0008F887 /* EntityManager.swift in Sources */, 4E630F302B9F83DE0008F887 /* SpriteComponent.swift in Sources */, 4E86605F2BA095E30035530D /* Collectible.swift in Sources */, 4E8660662BA097D40035530D /* PhysicsConstants.swift in Sources */, + 461148912BA1CDBF0073E7E1 /* SystemManager.swift in Sources */, + 145F2C842BA22CA300457549 /* EventModifiable.swift in Sources */, 4E630EFA2B9F7E070008F887 /* ViewController.swift in Sources */, 4E630F322B9F887C0008F887 /* PhysicsComponent.swift in Sources */, 4E630EF62B9F7E070008F887 /* AppDelegate.swift in Sources */, + 461148962BA1D53D0073E7E1 /* PositionSystem.swift in Sources */, 4E630F2A2B9F7EF60008F887 /* PositionComponent.swift in Sources */, + 14E247952BA2CB480071FFC0 /* EventManager.swift in Sources */, 4E630EF82B9F7E070008F887 /* SceneDelegate.swift in Sources */, E6A7451B2BA0C1890080C1BE /* PlayerView.swift in Sources */, E6A745162BA057040080C1BE /* MTKRenderer.swift in Sources */, @@ -433,8 +498,11 @@ E6B550A12BA15E9C00DC7396 /* OverlayView.swift in Sources */, 4E630F342B9F8FC00008F887 /* Player.swift in Sources */, 4E630F372B9F91DE0008F887 /* PlayerSprite.swift in Sources */, + 46B8C09A2BA328D900498705 /* GameEngine.swift in Sources */, + 461148982BA1E41F0073E7E1 /* PhysicsSystem.swift in Sources */, 4E630F2E2B9F81850008F887 /* HealthComponent.swift in Sources */, 4E86605C2BA095460035530D /* Monster.swift in Sources */, + 145F2C802BA203B400457549 /* Event.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -793,6 +861,25 @@ defaultConfigurationName = Release; }; /* End XCConfigurationList section */ + +/* Begin XCRemoteSwiftPackageReference section */ + 14E247912BA2CA920071FFC0 /* XCRemoteSwiftPackageReference "swift-collections" */ = { + isa = XCRemoteSwiftPackageReference; + repositoryURL = "https://github.com/apple/swift-collections.git"; + requirement = { + kind = upToNextMajorVersion; + minimumVersion = 1.1.0; + }; + }; +/* End XCRemoteSwiftPackageReference section */ + +/* Begin XCSwiftPackageProductDependency section */ + 14E247922BA2CA920071FFC0 /* DequeModule */ = { + isa = XCSwiftPackageProductDependency; + package = 14E247912BA2CA920071FFC0 /* XCRemoteSwiftPackageReference "swift-collections" */; + productName = DequeModule; + }; +/* End XCSwiftPackageProductDependency section */ }; rootObject = 4E630EEA2B9F7E070008F887 /* Project object */; } diff --git a/star-dash/star-dash.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved b/star-dash/star-dash.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved new file mode 100644 index 00000000..1a0f4251 --- /dev/null +++ b/star-dash/star-dash.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved @@ -0,0 +1,14 @@ +{ + "pins" : [ + { + "identity" : "swift-collections", + "kind" : "remoteSourceControl", + "location" : "https://github.com/apple/swift-collections.git", + "state" : { + "revision" : "94cf62b3ba8d4bed62680a282d4c25f9c63c2efb", + "version" : "1.1.0" + } + } + ], + "version" : 2 +} diff --git a/star-dash/star-dash/Events/Event.swift b/star-dash/star-dash/Events/Event.swift new file mode 100644 index 00000000..a4150334 --- /dev/null +++ b/star-dash/star-dash/Events/Event.swift @@ -0,0 +1,15 @@ +// +// Event.swift +// star-dash +// +// Created by Jason Qiu on 13/3/24. +// + +import Foundation + +protocol Event { + var timestamp: Date { get } + var entityId: EntityId { get } + + func execute(on target: EventModifiable) +} diff --git a/star-dash/star-dash/Events/EventManager.swift b/star-dash/star-dash/Events/EventManager.swift new file mode 100644 index 00000000..4ab6e198 --- /dev/null +++ b/star-dash/star-dash/Events/EventManager.swift @@ -0,0 +1,29 @@ +// +// EventManager.swift +// star-dash +// +// Created by Jason Qiu on 14/3/24. +// + +import DequeModule +import Foundation + +typealias EventQueue = Deque + +class EventManager { + private var events: EventQueue + + init() { + events = EventQueue() + } + + func add(event: Event) { + events.append(event) + } + + func executeAll(on target: EventModifiable) { + while let event = events.popFirst() { + event.execute(on: target) + } + } +} diff --git a/star-dash/star-dash/Events/EventModifiable.swift b/star-dash/star-dash/Events/EventModifiable.swift new file mode 100644 index 00000000..844297e0 --- /dev/null +++ b/star-dash/star-dash/Events/EventModifiable.swift @@ -0,0 +1,11 @@ +// +// EventModifiable.swift +// star-dash +// +// Created by Jason Qiu on 14/3/24. +// + +import Foundation + +/// EventModifiable represents objects that can be modified by events. +protocol EventModifiable { } diff --git a/star-dash/star-dash/Events/MoveEvent.swift b/star-dash/star-dash/Events/MoveEvent.swift new file mode 100644 index 00000000..475009e8 --- /dev/null +++ b/star-dash/star-dash/Events/MoveEvent.swift @@ -0,0 +1,25 @@ +// +// MoveEvent.swift +// star-dash +// +// Created by Jason Qiu on 14/3/24. +// + +import Foundation + +class MoveEvent: Event { + var entityId: EntityId + var timestamp: Date + + var displacement: CGVector + + init(entityId: EntityId, displacement: CGVector, timestamp: Date = Date.now) { + self.entityId = entityId + self.timestamp = timestamp + self.displacement = displacement + } + + func execute(on target: EventModifiable) { + // TODO: Use PositionSystem from target to modify entity of entityId + } +} diff --git a/star-dash/star-dash/Entities/Components/Component.swift b/star-dash/star-dash/GameEngine/Components/Component.swift similarity index 100% rename from star-dash/star-dash/Entities/Components/Component.swift rename to star-dash/star-dash/GameEngine/Components/Component.swift diff --git a/star-dash/star-dash/Entities/Components/HealthComponent.swift b/star-dash/star-dash/GameEngine/Components/HealthComponent.swift similarity index 100% rename from star-dash/star-dash/Entities/Components/HealthComponent.swift rename to star-dash/star-dash/GameEngine/Components/HealthComponent.swift diff --git a/star-dash/star-dash/Entities/Components/PhysicsComponent.swift b/star-dash/star-dash/GameEngine/Components/PhysicsComponent.swift similarity index 100% rename from star-dash/star-dash/Entities/Components/PhysicsComponent.swift rename to star-dash/star-dash/GameEngine/Components/PhysicsComponent.swift diff --git a/star-dash/star-dash/Entities/Components/PositionComponent.swift b/star-dash/star-dash/GameEngine/Components/PositionComponent.swift similarity index 100% rename from star-dash/star-dash/Entities/Components/PositionComponent.swift rename to star-dash/star-dash/GameEngine/Components/PositionComponent.swift diff --git a/star-dash/star-dash/Entities/Components/SpriteComponent.swift b/star-dash/star-dash/GameEngine/Components/SpriteComponent.swift similarity index 100% rename from star-dash/star-dash/Entities/Components/SpriteComponent.swift rename to star-dash/star-dash/GameEngine/Components/SpriteComponent.swift diff --git a/star-dash/star-dash/Entities/Entity.swift b/star-dash/star-dash/GameEngine/Entities/Entity.swift similarity index 100% rename from star-dash/star-dash/Entities/Entity.swift rename to star-dash/star-dash/GameEngine/Entities/Entity.swift diff --git a/star-dash/star-dash/Entities/EntityManager.swift b/star-dash/star-dash/GameEngine/Entities/EntityManager.swift similarity index 76% rename from star-dash/star-dash/Entities/EntityManager.swift rename to star-dash/star-dash/GameEngine/Entities/EntityManager.swift index c9706778..6ca87e28 100644 --- a/star-dash/star-dash/Entities/EntityManager.swift +++ b/star-dash/star-dash/GameEngine/Entities/EntityManager.swift @@ -41,4 +41,16 @@ class EntityManager { } self.entityMap[entity.id] = entity } + + func component(ofType type: T.Type, of entityId: EntityId) -> T? { + guard let components = entityComponentMap[entityId] else { + return nil + } + + guard let componentId = components.first(where: { componentMap[$0] is T }) else { + return nil + } + + return componentMap[componentId] as? T + } } diff --git a/star-dash/star-dash/Entities/GameEntities/Collectible.swift b/star-dash/star-dash/GameEngine/Entities/GameEntities/Collectible.swift similarity index 100% rename from star-dash/star-dash/Entities/GameEntities/Collectible.swift rename to star-dash/star-dash/GameEngine/Entities/GameEntities/Collectible.swift diff --git a/star-dash/star-dash/Entities/GameEntities/Monster.swift b/star-dash/star-dash/GameEngine/Entities/GameEntities/Monster.swift similarity index 100% rename from star-dash/star-dash/Entities/GameEntities/Monster.swift rename to star-dash/star-dash/GameEngine/Entities/GameEntities/Monster.swift diff --git a/star-dash/star-dash/Entities/GameEntities/Obstacle.swift b/star-dash/star-dash/GameEngine/Entities/GameEntities/Obstacle.swift similarity index 100% rename from star-dash/star-dash/Entities/GameEntities/Obstacle.swift rename to star-dash/star-dash/GameEngine/Entities/GameEntities/Obstacle.swift diff --git a/star-dash/star-dash/Entities/GameEntities/Player.swift b/star-dash/star-dash/GameEngine/Entities/GameEntities/Player.swift similarity index 100% rename from star-dash/star-dash/Entities/GameEntities/Player.swift rename to star-dash/star-dash/GameEngine/Entities/GameEntities/Player.swift diff --git a/star-dash/star-dash/Entities/GameEntities/Tool.swift b/star-dash/star-dash/GameEngine/Entities/GameEntities/Tool.swift similarity index 100% rename from star-dash/star-dash/Entities/GameEntities/Tool.swift rename to star-dash/star-dash/GameEngine/Entities/GameEntities/Tool.swift diff --git a/star-dash/star-dash/GameEngine/GameEngine.swift b/star-dash/star-dash/GameEngine/GameEngine.swift new file mode 100644 index 00000000..ac4c59d1 --- /dev/null +++ b/star-dash/star-dash/GameEngine/GameEngine.swift @@ -0,0 +1,37 @@ +// +// GameEngine.swift +// star-dash +// +// Created by Ho Jun Hao on 14/3/24. +// + +import Foundation + +class GameEngine { + private let systemManager: SystemManager + private let entityManager: EntityManager + private let eventManager: EventManager + + init(scene: GameScene) { + self.systemManager = SystemManager() + self.entityManager = EntityManager() + self.eventManager = EventManager() + // TODO: link game engine to renderer + + setUpSystems() + } + + func update(by deltaTime: TimeInterval) { + systemManager.update(by: deltaTime) + eventManager.executeAll(on: self) + } + + private func setUpSystems() { + systemManager.add(PositionSystem(entityManager, dispatcher: self)) + systemManager.add(PhysicsSystem(entityManager, dispatcher: self)) + } +} + +extension GameEngine: EventModifiable { + // TODO: functions of event modifiable +} diff --git a/star-dash/star-dash/GameEngine/Systems/PhysicsSystem.swift b/star-dash/star-dash/GameEngine/Systems/PhysicsSystem.swift new file mode 100644 index 00000000..ebe6cf75 --- /dev/null +++ b/star-dash/star-dash/GameEngine/Systems/PhysicsSystem.swift @@ -0,0 +1,69 @@ +// +// PhysicsSystem.swift +// star-dash +// +// Created by Ho Jun Hao on 13/3/24. +// + +import Foundation + +class PhysicsSystem: System { + var isActive: Bool + var dispatcher: EventModifiable? + var entityManager: EntityManager + + init(_ entityManager: EntityManager, dispatcher: EventModifiable? = nil) { + self.isActive = true + self.dispatcher = dispatcher + self.entityManager = entityManager + } + + func update(by deltaTime: TimeInterval) { + let physicsComponents = entityManager.componentMap.values.compactMap({ $0 as? PhysicsComponent }) + + for physicsComponent in physicsComponents { + physicsComponent.force = .zero + } + } + + func isMoving(_ entityId: EntityId) -> Bool { + guard let physicsComponent = getPhysicsComponent(of: entityId) else { + return false + } + + return physicsComponent.velocity != .zero + } + + func isJumping(_ entityId: EntityId) -> Bool { + guard let physicsComponent = getPhysicsComponent(of: entityId) else { + return false + } + + return physicsComponent.velocity.dy != .zero + } + + func applyForce(to entityId: EntityId, newForce: CGVector) { + guard let physicsComponent = getPhysicsComponent(of: entityId) else { + return + } + + let newForce = CGVector(dx: physicsComponent.force.dx + newForce.dx, + dy: physicsComponent.force.dy + newForce.dy) + + physicsComponent.force = newForce + } + + func sync(entityVelocityMap: [EntityId: CGVector]) { + for (entityId, newVelocity) in entityVelocityMap { + guard let physicsComponent = getPhysicsComponent(of: entityId) else { + continue + } + + physicsComponent.velocity = newVelocity + } + } + + private func getPhysicsComponent(of entityId: EntityId) -> PhysicsComponent? { + entityManager.component(ofType: PhysicsComponent.self, of: entityId) + } + } diff --git a/star-dash/star-dash/GameEngine/Systems/PositionSystem.swift b/star-dash/star-dash/GameEngine/Systems/PositionSystem.swift new file mode 100644 index 00000000..56a98ceb --- /dev/null +++ b/star-dash/star-dash/GameEngine/Systems/PositionSystem.swift @@ -0,0 +1,50 @@ +// +// PositionSystem.swift +// star-dash +// +// Created by Ho Jun Hao on 13/3/24. +// + +import Foundation + +class PositionSystem: System { + var isActive: Bool + var dispatcher: EventModifiable? + var entityManager: EntityManager + + init(_ entityManager: EntityManager, dispatcher: EventModifiable? = nil) { + self.isActive = true + self.entityManager = entityManager + self.dispatcher = dispatcher + } + + func move(entityId: EntityId, to newPosition: CGPoint) { + guard let positionComponent = getPositionComponent(of: entityId) else { + return + } + + positionComponent.setPosition(position: newPosition) + } + + func rotate(entityId: EntityId, to newRotation: Float) { + guard let positionComponent = getPositionComponent(of: entityId) else { + return + } + + positionComponent.setRotation(rotation: newRotation) + } + + func sync(entityPositionMap: [EntityId: CGPoint], entityRotationMap: [EntityId: Float]) { + for (entityId, newPosition) in entityPositionMap { + move(entityId: entityId, to: newPosition) + } + + for (entityId, newRotation) in entityRotationMap { + rotate(entityId: entityId, to: newRotation) + } + } + + private func getPositionComponent(of entityId: EntityId) -> PositionComponent? { + entityManager.component(ofType: PositionComponent.self, of: entityId) + } +} diff --git a/star-dash/star-dash/GameEngine/Systems/System.swift b/star-dash/star-dash/GameEngine/Systems/System.swift new file mode 100644 index 00000000..a1342509 --- /dev/null +++ b/star-dash/star-dash/GameEngine/Systems/System.swift @@ -0,0 +1,20 @@ +// +// System.swift +// star-dash +// +// Created by Ho Jun Hao on 13/3/24. +// + +import Foundation + +protocol System { + var isActive: Bool { get set } + var dispatcher: EventModifiable? { get set } + var entityManager: EntityManager { get set } + + func update(by deltaTime: TimeInterval) +} + +extension System { + func update(by deltaTime: TimeInterval) {} +} diff --git a/star-dash/star-dash/GameEngine/Systems/SystemManager.swift b/star-dash/star-dash/GameEngine/Systems/SystemManager.swift new file mode 100644 index 00000000..716245e7 --- /dev/null +++ b/star-dash/star-dash/GameEngine/Systems/SystemManager.swift @@ -0,0 +1,22 @@ +// +// SystemManager.swift +// star-dash +// +// Created by Ho Jun Hao on 13/3/24. +// + +import Foundation + +class SystemManager { + private var systems: [System] = [] + + func add(_ system: System) { + systems.append(system) + } + + func update(by deltaTime: TimeInterval) { + for system in systems where system.isActive { + system.update(by: deltaTime) + } + } +}