From 819fabcf30c3dd86b478f5bcd8f4a208389a60a5 Mon Sep 17 00:00:00 2001 From: HoJunHao2000 Date: Wed, 13 Mar 2024 22:49:59 +0800 Subject: [PATCH 01/10] Made the following changes - Add SystemManager - Add PositionSystem - Add PhyiscsSystem --- star-dash/star-dash.xcodeproj/project.pbxproj | 26 ++++++- .../{Entities => }/Components/Component.swift | 0 .../Components/HealthComponent.swift | 0 .../Components/PhysicsComponent.swift | 0 .../Components/PositionComponent.swift | 0 .../Components/SpriteComponent.swift | 0 .../star-dash/Systems/PhysicsSystem.swift | 77 +++++++++++++++++++ .../star-dash/Systems/PositionSystem.swift | 58 ++++++++++++++ star-dash/star-dash/Systems/System.swift | 19 +++++ .../star-dash/Systems/SystemManager.swift | 22 ++++++ 10 files changed, 201 insertions(+), 1 deletion(-) rename star-dash/star-dash/{Entities => }/Components/Component.swift (100%) rename star-dash/star-dash/{Entities => }/Components/HealthComponent.swift (100%) rename star-dash/star-dash/{Entities => }/Components/PhysicsComponent.swift (100%) rename star-dash/star-dash/{Entities => }/Components/PositionComponent.swift (100%) rename star-dash/star-dash/{Entities => }/Components/SpriteComponent.swift (100%) create mode 100644 star-dash/star-dash/Systems/PhysicsSystem.swift create mode 100644 star-dash/star-dash/Systems/PositionSystem.swift create mode 100644 star-dash/star-dash/Systems/System.swift create mode 100644 star-dash/star-dash/Systems/SystemManager.swift diff --git a/star-dash/star-dash.xcodeproj/project.pbxproj b/star-dash/star-dash.xcodeproj/project.pbxproj index dabe59c5..70d2be64 100644 --- a/star-dash/star-dash.xcodeproj/project.pbxproj +++ b/star-dash/star-dash.xcodeproj/project.pbxproj @@ -8,6 +8,10 @@ /* Begin PBXBuildFile section */ 142D9F8F2BA15FBB005FE9E0 /* .swiftlint.yml in Resources */ = {isa = PBXBuildFile; fileRef = 142D9F8E2BA15FBB005FE9E0 /* .swiftlint.yml */; }; + 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 */; }; 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 */; }; @@ -52,6 +56,10 @@ /* Begin PBXFileReference section */ 142D9F8E2BA15FBB005FE9E0 /* .swiftlint.yml */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.yaml; path = .swiftlint.yml; 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 = ""; }; 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 = ""; }; @@ -106,6 +114,17 @@ /* End PBXFrameworksBuildPhase section */ /* Begin PBXGroup section */ + 4611488F2BA1CD9E0073E7E1 /* Systems */ = { + isa = PBXGroup; + children = ( + 461148902BA1CDBF0073E7E1 /* SystemManager.swift */, + 461148922BA1D04B0073E7E1 /* System.swift */, + 461148952BA1D53D0073E7E1 /* PositionSystem.swift */, + 461148972BA1E41F0073E7E1 /* PhysicsSystem.swift */, + ); + path = Systems; + sourceTree = ""; + }; 4E630EE92B9F7E070008F887 = { isa = PBXGroup; children = ( @@ -130,6 +149,8 @@ 4E630EF42B9F7E070008F887 /* star-dash */ = { isa = PBXGroup; children = ( + 4611488F2BA1CD9E0073E7E1 /* Systems */, + 4E630F282B9F7EC20008F887 /* Components */, 4E86605D2BA095CC0035530D /* Constants */, 4E630F352B9F91C20008F887 /* Enums */, 4E630F252B9F7E500008F887 /* Entities */, @@ -165,7 +186,6 @@ isa = PBXGroup; children = ( 4E8660602BA0961F0035530D /* GameEntities */, - 4E630F282B9F7EC20008F887 /* Components */, 4E630F262B9F7E770008F887 /* Entity.swift */, 4E630F382B9F943B0008F887 /* EntityManager.swift */, ); @@ -369,18 +389,22 @@ 4E630F272B9F7E770008F887 /* Entity.swift in Sources */, 4E630F2C2B9F7F460008F887 /* Component.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 */, 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 */, 4E630EF82B9F7E070008F887 /* SceneDelegate.swift in Sources */, 4E630F342B9F8FC00008F887 /* Player.swift in Sources */, 4E630F372B9F91DE0008F887 /* PlayerSprite.swift in Sources */, + 461148982BA1E41F0073E7E1 /* PhysicsSystem.swift in Sources */, 4E630F2E2B9F81850008F887 /* HealthComponent.swift in Sources */, 4E86605C2BA095460035530D /* Monster.swift in Sources */, ); diff --git a/star-dash/star-dash/Entities/Components/Component.swift b/star-dash/star-dash/Components/Component.swift similarity index 100% rename from star-dash/star-dash/Entities/Components/Component.swift rename to star-dash/star-dash/Components/Component.swift diff --git a/star-dash/star-dash/Entities/Components/HealthComponent.swift b/star-dash/star-dash/Components/HealthComponent.swift similarity index 100% rename from star-dash/star-dash/Entities/Components/HealthComponent.swift rename to star-dash/star-dash/Components/HealthComponent.swift diff --git a/star-dash/star-dash/Entities/Components/PhysicsComponent.swift b/star-dash/star-dash/Components/PhysicsComponent.swift similarity index 100% rename from star-dash/star-dash/Entities/Components/PhysicsComponent.swift rename to star-dash/star-dash/Components/PhysicsComponent.swift diff --git a/star-dash/star-dash/Entities/Components/PositionComponent.swift b/star-dash/star-dash/Components/PositionComponent.swift similarity index 100% rename from star-dash/star-dash/Entities/Components/PositionComponent.swift rename to star-dash/star-dash/Components/PositionComponent.swift diff --git a/star-dash/star-dash/Entities/Components/SpriteComponent.swift b/star-dash/star-dash/Components/SpriteComponent.swift similarity index 100% rename from star-dash/star-dash/Entities/Components/SpriteComponent.swift rename to star-dash/star-dash/Components/SpriteComponent.swift diff --git a/star-dash/star-dash/Systems/PhysicsSystem.swift b/star-dash/star-dash/Systems/PhysicsSystem.swift new file mode 100644 index 00000000..0a637b86 --- /dev/null +++ b/star-dash/star-dash/Systems/PhysicsSystem.swift @@ -0,0 +1,77 @@ +// +// PhysicsSystem.swift +// star-dash +// +// Created by Ho Jun Hao on 13/3/24. +// + +import Foundation + +class PhysicsSystem: System { + var isActive: Bool + var entityManager: EntityManager + + init(_ entityManager: EntityManager) { + self.isActive = true + 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? { + guard let componentSet = entityManager.entityComponentMap[entityId] else { + return nil + } + + guard let physicsComponentId = componentSet.first( + where: { entityManager.componentMap[$0] is PhysicsComponent } + ) else { + return nil + } + + return entityManager.componentMap[physicsComponentId] as? PhysicsComponent + } + } diff --git a/star-dash/star-dash/Systems/PositionSystem.swift b/star-dash/star-dash/Systems/PositionSystem.swift new file mode 100644 index 00000000..04e0876e --- /dev/null +++ b/star-dash/star-dash/Systems/PositionSystem.swift @@ -0,0 +1,58 @@ +// +// PositionSystem.swift +// star-dash +// +// Created by Ho Jun Hao on 13/3/24. +// + +import Foundation + +class PositionSystem: System { + var isActive: Bool + var entityManager: EntityManager + + init(_ entityManager: EntityManager) { + self.isActive = true + self.entityManager = entityManager + } + + 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? { + guard let componentSet = entityManager.entityComponentMap[entityId] else { + return nil + } + + guard let positionComponentId = componentSet.first( + where: { entityManager.componentMap[$0] is PositionComponent } + ) else { + return nil + } + + return entityManager.componentMap[positionComponentId] as? PositionComponent + } +} diff --git a/star-dash/star-dash/Systems/System.swift b/star-dash/star-dash/Systems/System.swift new file mode 100644 index 00000000..203c0b97 --- /dev/null +++ b/star-dash/star-dash/Systems/System.swift @@ -0,0 +1,19 @@ +// +// System.swift +// star-dash +// +// Created by Ho Jun Hao on 13/3/24. +// + +import Foundation + +protocol System { + var isActive: Bool { 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/Systems/SystemManager.swift b/star-dash/star-dash/Systems/SystemManager.swift new file mode 100644 index 00000000..716245e7 --- /dev/null +++ b/star-dash/star-dash/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) + } + } +} From 297cd71b427125f0e3f76ab9e45a3aeeb30f21a0 Mon Sep 17 00:00:00 2001 From: jasonqiu212 Date: Thu, 14 Mar 2024 02:59:09 +0800 Subject: [PATCH 02/10] feat: add event protocols --- star-dash/star-dash.xcodeproj/project.pbxproj | 102 ++++++++++-------- star-dash/star-dash/Events/Event.swift | 15 +++ .../star-dash/Events/EventModifiable.swift | 11 ++ 3 files changed, 85 insertions(+), 43 deletions(-) create mode 100644 star-dash/star-dash/Events/Event.swift create mode 100644 star-dash/star-dash/Events/EventModifiable.swift diff --git a/star-dash/star-dash.xcodeproj/project.pbxproj b/star-dash/star-dash.xcodeproj/project.pbxproj index 7b322b3b..91986176 100644 --- a/star-dash/star-dash.xcodeproj/project.pbxproj +++ b/star-dash/star-dash.xcodeproj/project.pbxproj @@ -8,6 +8,8 @@ /* 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 */; }; 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 +19,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 +33,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 +61,8 @@ /* 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 = ""; }; 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 +76,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 +90,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 */ @@ -120,6 +124,15 @@ /* End PBXFrameworksBuildPhase section */ /* Begin PBXGroup section */ + 145F2C7E2BA2039700457549 /* Events */ = { + isa = PBXGroup; + children = ( + 145F2C7F2BA203B400457549 /* Event.swift */, + 145F2C832BA22CA300457549 /* EventModifiable.swift */, + ); + path = Events; + sourceTree = ""; + }; 4E630EE92B9F7E070008F887 = { isa = PBXGroup; children = ( @@ -149,6 +162,7 @@ 4E86605D2BA095CC0035530D /* Constants */, 4E630F352B9F91C20008F887 /* Enums */, 4E630F252B9F7E500008F887 /* Entities */, + 145F2C7E2BA2039700457549 /* Events */, 4E630EF52B9F7E070008F887 /* AppDelegate.swift */, 4E630EF72B9F7E070008F887 /* SceneDelegate.swift */, 4E630EF92B9F7E070008F887 /* ViewController.swift */, @@ -177,35 +191,6 @@ 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 = ( @@ -257,6 +242,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 */ @@ -419,6 +433,7 @@ 4E630F302B9F83DE0008F887 /* SpriteComponent.swift in Sources */, 4E86605F2BA095E30035530D /* Collectible.swift in Sources */, 4E8660662BA097D40035530D /* PhysicsConstants.swift in Sources */, + 145F2C842BA22CA300457549 /* EventModifiable.swift in Sources */, 4E630EFA2B9F7E070008F887 /* ViewController.swift in Sources */, 4E630F322B9F887C0008F887 /* PhysicsComponent.swift in Sources */, 4E630EF62B9F7E070008F887 /* AppDelegate.swift in Sources */, @@ -435,6 +450,7 @@ 4E630F372B9F91DE0008F887 /* PlayerSprite.swift in Sources */, 4E630F2E2B9F81850008F887 /* HealthComponent.swift in Sources */, 4E86605C2BA095460035530D /* Monster.swift in Sources */, + 145F2C802BA203B400457549 /* Event.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; diff --git a/star-dash/star-dash/Events/Event.swift b/star-dash/star-dash/Events/Event.swift new file mode 100644 index 00000000..ae16046c --- /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: Comparable { + var timestamp: TimeInterval { get } + var entityId: EntityId { get } + + func execute(on target: EventModifiable) +} 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 { } From 99f9ab9fa0737b7204dac330e23df8d6b2880f1d Mon Sep 17 00:00:00 2001 From: jasonqiu212 Date: Thu, 14 Mar 2024 13:12:10 +0800 Subject: [PATCH 03/10] fix: make event not conform to comparable to support usage of queue --- star-dash/star-dash/Events/Event.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/star-dash/star-dash/Events/Event.swift b/star-dash/star-dash/Events/Event.swift index ae16046c..6bef48df 100644 --- a/star-dash/star-dash/Events/Event.swift +++ b/star-dash/star-dash/Events/Event.swift @@ -7,7 +7,7 @@ import Foundation -protocol Event: Comparable { +protocol Event { var timestamp: TimeInterval { get } var entityId: EntityId { get } From a0e1e4e36dc2efb4ab4756acc35f257aa496211d Mon Sep 17 00:00:00 2001 From: jasonqiu212 Date: Thu, 14 Mar 2024 14:01:14 +0800 Subject: [PATCH 04/10] feat: add mock event --- star-dash/star-dash.xcodeproj/project.pbxproj | 4 +++ star-dash/star-dash/Events/Event.swift | 2 +- star-dash/star-dash/Events/MoveEvent.swift | 25 +++++++++++++++++++ 3 files changed, 30 insertions(+), 1 deletion(-) create mode 100644 star-dash/star-dash/Events/MoveEvent.swift diff --git a/star-dash/star-dash.xcodeproj/project.pbxproj b/star-dash/star-dash.xcodeproj/project.pbxproj index 91986176..ff10b2c0 100644 --- a/star-dash/star-dash.xcodeproj/project.pbxproj +++ b/star-dash/star-dash.xcodeproj/project.pbxproj @@ -10,6 +10,7 @@ 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 */; }; 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 */; }; @@ -63,6 +64,7 @@ 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 = ""; }; 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 = ""; }; @@ -129,6 +131,7 @@ children = ( 145F2C7F2BA203B400457549 /* Event.swift */, 145F2C832BA22CA300457549 /* EventModifiable.swift */, + 14E2478D2BA22FCE0071FFC0 /* MoveEvent.swift */, ); path = Events; sourceTree = ""; @@ -427,6 +430,7 @@ files = ( 4E630F272B9F7E770008F887 /* Entity.swift in Sources */, 4E630F2C2B9F7F460008F887 /* Component.swift in Sources */, + 14E2478E2BA22FCE0071FFC0 /* MoveEvent.swift in Sources */, 4E8660622BA0964A0035530D /* Obstacle.swift in Sources */, 4E8660642BA096600035530D /* Tool.swift in Sources */, 4E630F392B9F943B0008F887 /* EntityManager.swift in Sources */, diff --git a/star-dash/star-dash/Events/Event.swift b/star-dash/star-dash/Events/Event.swift index 6bef48df..a4150334 100644 --- a/star-dash/star-dash/Events/Event.swift +++ b/star-dash/star-dash/Events/Event.swift @@ -8,7 +8,7 @@ import Foundation protocol Event { - var timestamp: TimeInterval { get } + var timestamp: Date { get } var entityId: EntityId { get } func execute(on target: 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..ce174072 --- /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 + } +} From 399920386943ad62d159e73ea842231e1de31359 Mon Sep 17 00:00:00 2001 From: jasonqiu212 Date: Thu, 14 Mar 2024 14:05:30 +0800 Subject: [PATCH 05/10] feat: add collections package dependency --- star-dash/star-dash.xcodeproj/project.pbxproj | 27 +++++++++++++++++++ .../xcshareddata/swiftpm/Package.resolved | 15 +++++++++++ 2 files changed, 42 insertions(+) create mode 100644 star-dash/star-dash.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved diff --git a/star-dash/star-dash.xcodeproj/project.pbxproj b/star-dash/star-dash.xcodeproj/project.pbxproj index ff10b2c0..8f3d2295 100644 --- a/star-dash/star-dash.xcodeproj/project.pbxproj +++ b/star-dash/star-dash.xcodeproj/project.pbxproj @@ -11,6 +11,7 @@ 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 */; }; 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 */; }; @@ -106,6 +107,7 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( + 14E247932BA2CA920071FFC0 /* DequeModule in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -291,6 +293,9 @@ dependencies = ( ); name = "star-dash"; + packageProductDependencies = ( + 14E247922BA2CA920071FFC0 /* DequeModule */, + ); productName = "star-dash"; productReference = 4E630EF22B9F7E070008F887 /* star-dash.app */; productType = "com.apple.product-type.application"; @@ -363,6 +368,9 @@ Base, ); mainGroup = 4E630EE92B9F7E070008F887; + packageReferences = ( + 14E247912BA2CA920071FFC0 /* XCRemoteSwiftPackageReference "swift-collections" */, + ); productRefGroup = 4E630EF32B9F7E070008F887 /* Products */; projectDirPath = ""; projectRoot = ""; @@ -813,6 +821,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..eb481772 --- /dev/null +++ b/star-dash/star-dash.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved @@ -0,0 +1,15 @@ +{ + "originHash" : "51f90653b2c9f9f7064c0d52159b40bf7d222e5f314be23e62fe28520fec03db", + "pins" : [ + { + "identity" : "swift-collections", + "kind" : "remoteSourceControl", + "location" : "https://github.com/apple/swift-collections.git", + "state" : { + "revision" : "94cf62b3ba8d4bed62680a282d4c25f9c63c2efb", + "version" : "1.1.0" + } + } + ], + "version" : 3 +} From 33b9c2653712268f9cf31bce1b4f885b2eb9b25b Mon Sep 17 00:00:00 2001 From: jasonqiu212 Date: Thu, 14 Mar 2024 14:15:18 +0800 Subject: [PATCH 06/10] feat: add EventManager --- star-dash/star-dash.xcodeproj/project.pbxproj | 4 +++ star-dash/star-dash/Events/EventManager.swift | 29 +++++++++++++++++++ 2 files changed, 33 insertions(+) create mode 100644 star-dash/star-dash/Events/EventManager.swift diff --git a/star-dash/star-dash.xcodeproj/project.pbxproj b/star-dash/star-dash.xcodeproj/project.pbxproj index 8f3d2295..3916da70 100644 --- a/star-dash/star-dash.xcodeproj/project.pbxproj +++ b/star-dash/star-dash.xcodeproj/project.pbxproj @@ -12,6 +12,7 @@ 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 */; }; 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 */; }; @@ -66,6 +67,7 @@ 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 = ""; }; 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 = ""; }; @@ -132,6 +134,7 @@ isa = PBXGroup; children = ( 145F2C7F2BA203B400457549 /* Event.swift */, + 14E247942BA2CB480071FFC0 /* EventManager.swift */, 145F2C832BA22CA300457549 /* EventModifiable.swift */, 14E2478D2BA22FCE0071FFC0 /* MoveEvent.swift */, ); @@ -450,6 +453,7 @@ 4E630F322B9F887C0008F887 /* PhysicsComponent.swift in Sources */, 4E630EF62B9F7E070008F887 /* AppDelegate.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 */, diff --git a/star-dash/star-dash/Events/EventManager.swift b/star-dash/star-dash/Events/EventManager.swift new file mode 100644 index 00000000..b2242f3c --- /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) + } + } +} From 524c75ff0db97d752700a0ab11e9d206530fd09f Mon Sep 17 00:00:00 2001 From: jasonqiu212 Date: Thu, 14 Mar 2024 14:21:20 +0800 Subject: [PATCH 07/10] style: lint --- star-dash/star-dash.xcodeproj/project.pbxproj | 86 +++++++++---------- star-dash/star-dash/Events/EventManager.swift | 6 +- star-dash/star-dash/Events/MoveEvent.swift | 8 +- 3 files changed, 50 insertions(+), 50 deletions(-) diff --git a/star-dash/star-dash.xcodeproj/project.pbxproj b/star-dash/star-dash.xcodeproj/project.pbxproj index 3916da70..e4756257 100644 --- a/star-dash/star-dash.xcodeproj/project.pbxproj +++ b/star-dash/star-dash.xcodeproj/project.pbxproj @@ -22,6 +22,13 @@ 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 */; }; @@ -36,13 +43,6 @@ 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 */ @@ -81,6 +81,13 @@ 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 = ""; }; @@ -95,13 +102,6 @@ 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 */ @@ -199,6 +199,35 @@ 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 = ( @@ -250,35 +279,6 @@ 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 */ diff --git a/star-dash/star-dash/Events/EventManager.swift b/star-dash/star-dash/Events/EventManager.swift index b2242f3c..4ab6e198 100644 --- a/star-dash/star-dash/Events/EventManager.swift +++ b/star-dash/star-dash/Events/EventManager.swift @@ -12,15 +12,15 @@ 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/MoveEvent.swift b/star-dash/star-dash/Events/MoveEvent.swift index ce174072..475009e8 100644 --- a/star-dash/star-dash/Events/MoveEvent.swift +++ b/star-dash/star-dash/Events/MoveEvent.swift @@ -10,16 +10,16 @@ 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) { + + func execute(on target: EventModifiable) { // TODO: Use PositionSystem from target to modify entity of entityId } } From 06392dcc5e71c04ddfa72c2790d0eedc1adfea66 Mon Sep 17 00:00:00 2001 From: HoJunHao2000 Date: Thu, 14 Mar 2024 21:27:01 +0800 Subject: [PATCH 08/10] Add GameEngine skeleton --- star-dash/.DS_Store | Bin 6148 -> 6148 bytes star-dash/star-dash.xcodeproj/project.pbxproj | 132 ++++++++++-------- .../Components/Component.swift | 0 .../Components/HealthComponent.swift | 0 .../Components/PhysicsComponent.swift | 0 .../Components/PositionComponent.swift | 0 .../Components/SpriteComponent.swift | 0 .../{ => GameEngine}/Entities/Entity.swift | 0 .../Entities/EntityManager.swift | 0 .../Entities/GameEntities/Collectible.swift | 0 .../Entities/GameEntities/Monster.swift | 0 .../Entities/GameEntities/Obstacle.swift | 0 .../Entities/GameEntities/Player.swift | 0 .../Entities/GameEntities/Tool.swift | 0 .../star-dash/GameEngine/GameEngine.swift | 37 +++++ .../Systems/PhysicsSystem.swift | 4 +- .../Systems/PositionSystem.swift | 4 +- .../{ => GameEngine}/Systems/System.swift | 1 + .../Systems/SystemManager.swift | 0 19 files changed, 116 insertions(+), 62 deletions(-) rename star-dash/star-dash/{ => GameEngine}/Components/Component.swift (100%) rename star-dash/star-dash/{ => GameEngine}/Components/HealthComponent.swift (100%) rename star-dash/star-dash/{ => GameEngine}/Components/PhysicsComponent.swift (100%) rename star-dash/star-dash/{ => GameEngine}/Components/PositionComponent.swift (100%) rename star-dash/star-dash/{ => GameEngine}/Components/SpriteComponent.swift (100%) rename star-dash/star-dash/{ => GameEngine}/Entities/Entity.swift (100%) rename star-dash/star-dash/{ => GameEngine}/Entities/EntityManager.swift (100%) rename star-dash/star-dash/{ => GameEngine}/Entities/GameEntities/Collectible.swift (100%) rename star-dash/star-dash/{ => GameEngine}/Entities/GameEntities/Monster.swift (100%) rename star-dash/star-dash/{ => GameEngine}/Entities/GameEntities/Obstacle.swift (100%) rename star-dash/star-dash/{ => GameEngine}/Entities/GameEntities/Player.swift (100%) rename star-dash/star-dash/{ => GameEngine}/Entities/GameEntities/Tool.swift (100%) create mode 100644 star-dash/star-dash/GameEngine/GameEngine.swift rename star-dash/star-dash/{ => GameEngine}/Systems/PhysicsSystem.swift (93%) rename star-dash/star-dash/{ => GameEngine}/Systems/PositionSystem.swift (91%) rename star-dash/star-dash/{ => GameEngine}/Systems/System.swift (86%) rename star-dash/star-dash/{ => GameEngine}/Systems/SystemManager.swift (100%) diff --git a/star-dash/.DS_Store b/star-dash/.DS_Store index 7b08c2ced75b8c32f414192522d068f04f4aee7b..a70a71600000a49dd63199c30a6ef5aef92bb5f6 100644 GIT binary patch delta 57 zcmZoMXffE3%*3R*cJf0et;zjNJghl+oVimbFJQ8SvvenOGxISvY*u7`#xk*ieKR}9 GUw!~3zY?DS delta 57 zcmZoMXffE3%)}(9IQb!y*5rOB9@YxwaOTOA7cg1ES-O+CnfVwCHY+keW0}~%zL}ll GFFyeAA`vqH diff --git a/star-dash/star-dash.xcodeproj/project.pbxproj b/star-dash/star-dash.xcodeproj/project.pbxproj index c2732986..80dcdfa7 100644 --- a/star-dash/star-dash.xcodeproj/project.pbxproj +++ b/star-dash/star-dash.xcodeproj/project.pbxproj @@ -8,15 +8,16 @@ /* Begin PBXBuildFile section */ 142D9F8F2BA15FBB005FE9E0 /* .swiftlint.yml in Resources */ = {isa = PBXBuildFile; fileRef = 142D9F8E2BA15FBB005FE9E0 /* .swiftlint.yml */; }; - 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 */; }; 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 */; }; @@ -26,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 */; }; @@ -47,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 */ @@ -68,14 +69,15 @@ /* Begin PBXFileReference section */ 142D9F8E2BA15FBB005FE9E0 /* .swiftlint.yml */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.yaml; path = .swiftlint.yml; 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 = ""; }; 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 = ""; }; @@ -89,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 = ""; }; @@ -110,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 */ @@ -138,6 +140,17 @@ /* 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 = ( @@ -149,15 +162,15 @@ path = Systems; sourceTree = ""; }; - 145F2C7E2BA2039700457549 /* Events */ = { + 46B8C0982BA328BF00498705 /* GameEngine */ = { isa = PBXGroup; children = ( - 145F2C7F2BA203B400457549 /* Event.swift */, - 14E247942BA2CB480071FFC0 /* EventManager.swift */, - 145F2C832BA22CA300457549 /* EventModifiable.swift */, - 14E2478D2BA22FCE0071FFC0 /* MoveEvent.swift */, + 4611488F2BA1CD9E0073E7E1 /* Systems */, + 4E630F282B9F7EC20008F887 /* Components */, + 4E630F252B9F7E500008F887 /* Entities */, + 46B8C0992BA328D900498705 /* GameEngine.swift */, ); - path = Events; + path = GameEngine; sourceTree = ""; }; 4E630EE92B9F7E070008F887 = { @@ -184,13 +197,11 @@ 4E630EF42B9F7E070008F887 /* star-dash */ = { isa = PBXGroup; children = ( - 4611488F2BA1CD9E0073E7E1 /* Systems */, - 4E630F282B9F7EC20008F887 /* Components */, + 46B8C0982BA328BF00498705 /* GameEngine */, E6A745142BA057040080C1BE /* GameScene */, E6A745102BA057040080C1BE /* Rendering */, 4E86605D2BA095CC0035530D /* Constants */, 4E630F352B9F91C20008F887 /* Enums */, - 4E630F252B9F7E500008F887 /* Entities */, 145F2C7E2BA2039700457549 /* Events */, 4E630EF52B9F7E070008F887 /* AppDelegate.swift */, 4E630EF72B9F7E070008F887 /* SceneDelegate.swift */, @@ -220,35 +231,6 @@ 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 = ( @@ -299,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 */ @@ -487,6 +498,7 @@ 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 */, diff --git a/star-dash/star-dash/Components/Component.swift b/star-dash/star-dash/GameEngine/Components/Component.swift similarity index 100% rename from star-dash/star-dash/Components/Component.swift rename to star-dash/star-dash/GameEngine/Components/Component.swift diff --git a/star-dash/star-dash/Components/HealthComponent.swift b/star-dash/star-dash/GameEngine/Components/HealthComponent.swift similarity index 100% rename from star-dash/star-dash/Components/HealthComponent.swift rename to star-dash/star-dash/GameEngine/Components/HealthComponent.swift diff --git a/star-dash/star-dash/Components/PhysicsComponent.swift b/star-dash/star-dash/GameEngine/Components/PhysicsComponent.swift similarity index 100% rename from star-dash/star-dash/Components/PhysicsComponent.swift rename to star-dash/star-dash/GameEngine/Components/PhysicsComponent.swift diff --git a/star-dash/star-dash/Components/PositionComponent.swift b/star-dash/star-dash/GameEngine/Components/PositionComponent.swift similarity index 100% rename from star-dash/star-dash/Components/PositionComponent.swift rename to star-dash/star-dash/GameEngine/Components/PositionComponent.swift diff --git a/star-dash/star-dash/Components/SpriteComponent.swift b/star-dash/star-dash/GameEngine/Components/SpriteComponent.swift similarity index 100% rename from star-dash/star-dash/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 100% rename from star-dash/star-dash/Entities/EntityManager.swift rename to star-dash/star-dash/GameEngine/Entities/EntityManager.swift 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..796fb7de --- /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/Systems/PhysicsSystem.swift b/star-dash/star-dash/GameEngine/Systems/PhysicsSystem.swift similarity index 93% rename from star-dash/star-dash/Systems/PhysicsSystem.swift rename to star-dash/star-dash/GameEngine/Systems/PhysicsSystem.swift index 0a637b86..cd0806be 100644 --- a/star-dash/star-dash/Systems/PhysicsSystem.swift +++ b/star-dash/star-dash/GameEngine/Systems/PhysicsSystem.swift @@ -9,10 +9,12 @@ import Foundation class PhysicsSystem: System { var isActive: Bool + var dispatcher: EventModifiable var entityManager: EntityManager - init(_ entityManager: EntityManager) { + init(_ entityManager: EntityManager, dispatcher: EventModifiable) { self.isActive = true + self.dispatcher = dispatcher self.entityManager = entityManager } diff --git a/star-dash/star-dash/Systems/PositionSystem.swift b/star-dash/star-dash/GameEngine/Systems/PositionSystem.swift similarity index 91% rename from star-dash/star-dash/Systems/PositionSystem.swift rename to star-dash/star-dash/GameEngine/Systems/PositionSystem.swift index 04e0876e..29d36463 100644 --- a/star-dash/star-dash/Systems/PositionSystem.swift +++ b/star-dash/star-dash/GameEngine/Systems/PositionSystem.swift @@ -9,11 +9,13 @@ import Foundation class PositionSystem: System { var isActive: Bool + var dispatcher: EventModifiable var entityManager: EntityManager - init(_ entityManager: EntityManager) { + init(_ entityManager: EntityManager, dispatcher: EventModifiable) { self.isActive = true self.entityManager = entityManager + self.dispatcher = dispatcher } func move(entityId: EntityId, to newPosition: CGPoint) { diff --git a/star-dash/star-dash/Systems/System.swift b/star-dash/star-dash/GameEngine/Systems/System.swift similarity index 86% rename from star-dash/star-dash/Systems/System.swift rename to star-dash/star-dash/GameEngine/Systems/System.swift index 203c0b97..25ff8804 100644 --- a/star-dash/star-dash/Systems/System.swift +++ b/star-dash/star-dash/GameEngine/Systems/System.swift @@ -9,6 +9,7 @@ import Foundation protocol System { var isActive: Bool { get set } + var dispatcher: EventModifiable { get set } var entityManager: EntityManager { get set } func update(by deltaTime: TimeInterval) diff --git a/star-dash/star-dash/Systems/SystemManager.swift b/star-dash/star-dash/GameEngine/Systems/SystemManager.swift similarity index 100% rename from star-dash/star-dash/Systems/SystemManager.swift rename to star-dash/star-dash/GameEngine/Systems/SystemManager.swift From b1e195b84d833e010e78747bede239cc01fce67c Mon Sep 17 00:00:00 2001 From: HoJunHao2000 Date: Thu, 14 Mar 2024 21:29:08 +0800 Subject: [PATCH 09/10] fix syle issues --- star-dash/star-dash/GameEngine/GameEngine.swift | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/star-dash/star-dash/GameEngine/GameEngine.swift b/star-dash/star-dash/GameEngine/GameEngine.swift index 796fb7de..ac4c59d1 100644 --- a/star-dash/star-dash/GameEngine/GameEngine.swift +++ b/star-dash/star-dash/GameEngine/GameEngine.swift @@ -11,7 +11,7 @@ class GameEngine { private let systemManager: SystemManager private let entityManager: EntityManager private let eventManager: EventManager - + init(scene: GameScene) { self.systemManager = SystemManager() self.entityManager = EntityManager() @@ -20,12 +20,12 @@ class GameEngine { 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)) From fd9570d9182bd108812f9779bd30a676a22875e2 Mon Sep 17 00:00:00 2001 From: HoJunHao2000 Date: Fri, 15 Mar 2024 17:04:12 +0800 Subject: [PATCH 10/10] Made comment changes --- star-dash/star-dash/.DS_Store | Bin 6148 -> 0 bytes .../GameEngine/Entities/EntityManager.swift | 12 ++++++++++++ .../GameEngine/Systems/PhysicsSystem.swift | 16 +++------------- .../GameEngine/Systems/PositionSystem.swift | 16 +++------------- .../star-dash/GameEngine/Systems/System.swift | 2 +- 5 files changed, 19 insertions(+), 27 deletions(-) delete mode 100644 star-dash/star-dash/.DS_Store diff --git a/star-dash/star-dash/.DS_Store b/star-dash/star-dash/.DS_Store deleted file mode 100644 index 5b7104a34d5be3860a99f176541b6f0a3f6b4908..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6148 zcmeHKy-vem3_L@J3I;kdeos(|H~0wU33vgZWkI2-2uO_Ccx}!n3|rePwXTzr$n(HZ|Jea2iAC)u#YFS_5#+ytf{XVnl z*X?81wc6ke4O=U9i55G&qQmnc;fARf9(CA~w$+|v!tuY6*;F7ENCi@XRN&tzz?rQ! zKX=TS3Zw$5z+M4;KNPxR4ICWp)xlsZ0CC2&8Lw@ZAQnv!YvAC>3{AY0=%o@XhIl#i zC3rP(aP)FWEFThgme^3l?#}+j=#c7|F%?J!4i(Vdo3_yTe@p*i|5r|0Dv%2NQ3YhS zx?44TxR|Yz$JAL{==bz*BiHB*Hj0ThiuprF@#TnD^qS{2aB#G8=B=EV9|EdNS}O1x G3VZ?ns3k%G diff --git a/star-dash/star-dash/GameEngine/Entities/EntityManager.swift b/star-dash/star-dash/GameEngine/Entities/EntityManager.swift index c9706778..6ca87e28 100644 --- a/star-dash/star-dash/GameEngine/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/GameEngine/Systems/PhysicsSystem.swift b/star-dash/star-dash/GameEngine/Systems/PhysicsSystem.swift index cd0806be..ebe6cf75 100644 --- a/star-dash/star-dash/GameEngine/Systems/PhysicsSystem.swift +++ b/star-dash/star-dash/GameEngine/Systems/PhysicsSystem.swift @@ -9,10 +9,10 @@ import Foundation class PhysicsSystem: System { var isActive: Bool - var dispatcher: EventModifiable + var dispatcher: EventModifiable? var entityManager: EntityManager - init(_ entityManager: EntityManager, dispatcher: EventModifiable) { + init(_ entityManager: EntityManager, dispatcher: EventModifiable? = nil) { self.isActive = true self.dispatcher = dispatcher self.entityManager = entityManager @@ -64,16 +64,6 @@ class PhysicsSystem: System { } private func getPhysicsComponent(of entityId: EntityId) -> PhysicsComponent? { - guard let componentSet = entityManager.entityComponentMap[entityId] else { - return nil - } - - guard let physicsComponentId = componentSet.first( - where: { entityManager.componentMap[$0] is PhysicsComponent } - ) else { - return nil - } - - return entityManager.componentMap[physicsComponentId] as? 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 index 29d36463..56a98ceb 100644 --- a/star-dash/star-dash/GameEngine/Systems/PositionSystem.swift +++ b/star-dash/star-dash/GameEngine/Systems/PositionSystem.swift @@ -9,10 +9,10 @@ import Foundation class PositionSystem: System { var isActive: Bool - var dispatcher: EventModifiable + var dispatcher: EventModifiable? var entityManager: EntityManager - init(_ entityManager: EntityManager, dispatcher: EventModifiable) { + init(_ entityManager: EntityManager, dispatcher: EventModifiable? = nil) { self.isActive = true self.entityManager = entityManager self.dispatcher = dispatcher @@ -45,16 +45,6 @@ class PositionSystem: System { } private func getPositionComponent(of entityId: EntityId) -> PositionComponent? { - guard let componentSet = entityManager.entityComponentMap[entityId] else { - return nil - } - - guard let positionComponentId = componentSet.first( - where: { entityManager.componentMap[$0] is PositionComponent } - ) else { - return nil - } - - return entityManager.componentMap[positionComponentId] as? 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 index 25ff8804..a1342509 100644 --- a/star-dash/star-dash/GameEngine/Systems/System.swift +++ b/star-dash/star-dash/GameEngine/Systems/System.swift @@ -9,7 +9,7 @@ import Foundation protocol System { var isActive: Bool { get set } - var dispatcher: EventModifiable { get set } + var dispatcher: EventModifiable? { get set } var entityManager: EntityManager { get set } func update(by deltaTime: TimeInterval)