From d80e80783a47169fb33fb1ddde29e7df19696bb4 Mon Sep 17 00:00:00 2001 From: Simon Kellner Date: Sat, 16 May 2020 16:38:46 +0200 Subject: [PATCH] change entity manager implementation to singleton --- .../GoldWars/Entities/EntityManager.swift | 13 +++++-- GoldWars/GoldWars/GameViewController.swift | 2 +- GoldWars/GoldWars/Scenes/GameScene.swift | 39 +++++++++---------- GoldWars/GoldWars/Scenes/MenuScene.swift | 18 ++++----- GoldWars/GoldWars/SettingsScene.swift | 19 +++++---- 5 files changed, 47 insertions(+), 44 deletions(-) diff --git a/GoldWars/GoldWars/Entities/EntityManager.swift b/GoldWars/GoldWars/Entities/EntityManager.swift index c66482d..fd2ce27 100644 --- a/GoldWars/GoldWars/Entities/EntityManager.swift +++ b/GoldWars/GoldWars/Entities/EntityManager.swift @@ -12,15 +12,22 @@ import GameKit class EntityManager { + static let sharedInstance = EntityManager() + var entities = Set() - let scene: SKScene + var scene: SKScene var isModal: Bool - init(scene: SKScene) { - self.scene = scene + private init() { isModal = false + scene = SKScene.init() } + func setScene(scene: SKScene){ + self.scene = scene + } + + func add(_ entity: GKEntity) { entities.insert(entity) if let spriteNode = entity.component(ofType: DefaultBaseComponent.self)?.spriteNode { diff --git a/GoldWars/GoldWars/GameViewController.swift b/GoldWars/GoldWars/GameViewController.swift index e4a2f43..05b2706 100644 --- a/GoldWars/GoldWars/GameViewController.swift +++ b/GoldWars/GoldWars/GameViewController.swift @@ -11,7 +11,7 @@ import SpriteKit import GameplayKit class GameViewController: UIViewController { - + override func viewDidLoad() { super.viewDidLoad() diff --git a/GoldWars/GoldWars/Scenes/GameScene.swift b/GoldWars/GoldWars/Scenes/GameScene.swift index dae1566..85d512e 100644 --- a/GoldWars/GoldWars/Scenes/GameScene.swift +++ b/GoldWars/GoldWars/Scenes/GameScene.swift @@ -12,20 +12,19 @@ import GameKit class GameScene: SKScene{ - var entityManager: EntityManager! var isMoveTouch = false var currentDraggedBasePos = CGPoint() var currentDraggedBase : Base? override func sceneDidLoad() { - entityManager = EntityManager(scene: self) - entityManager.add(HUD(size: self.size)) - entityManager.add(Background(size: self.size)) + EntityManager.sharedInstance.setScene(scene: self) + EntityManager.sharedInstance.add(HUD(size: self.size)) + EntityManager.sharedInstance.add(Background(size: self.size)) initMap() } func initMap() { - MapFactory(scene: self, entityManager: self.entityManager).loadMap(playerCount: 2) + MapFactory(scene: self, entityManager: EntityManager.sharedInstance).loadMap(playerCount: 2) } override func touchesEnded(_ touches: Set, with event: UIEvent?) { @@ -44,38 +43,38 @@ class GameScene: SKScene{ if atPoint(touchLocation) == base.component(ofType: DefaultBaseComponent.self)?.spriteNode { // TODO: change interaction based on collision instead of touchlocation - if !(entityManager.getTeamByBase(base: currentDraggedBase!) == entityManager.getTeamByBase(base: base)){ - entityManager.add(Modal(modaltype: .BaseAttack, + if !(EntityManager.sharedInstance.getTeamByBase(base: currentDraggedBase!) == EntityManager.sharedInstance.getTeamByBase(base: base)){ + EntityManager.sharedInstance.add(Modal(modaltype: .BaseAttack, base: currentDraggedBase!, anchorPoint: CGPoint(x: self.size.width / 2 , y: self.size.height / 2), - entityManager: entityManager, gameScene: self)) - entityManager.update((currentDraggedBase?.attackBase(base: base, units: 100))!) + entityManager: EntityManager.sharedInstance, gameScene: self)) + EntityManager.sharedInstance.update((currentDraggedBase?.attackBase(base: base, units: 100))!) }else { - entityManager.add(Modal(modaltype: .BaseAttack, + EntityManager.sharedInstance.add(Modal(modaltype: .BaseAttack, base: currentDraggedBase!, anchorPoint: CGPoint(x: self.size.width / 2 , y: self.size.height / 2), - entityManager: entityManager, gameScene: self)) + entityManager: EntityManager.sharedInstance, gameScene: self)) } } } } else { - for entity in entityManager.entities { + for entity in EntityManager.sharedInstance.entities { let spriteNode = entity.component(ofType: DefaultBaseComponent.self)?.spriteNode - if atPoint(touchLocation) == spriteNode && !entityManager.isModal { + if atPoint(touchLocation) == spriteNode && !EntityManager.sharedInstance.isModal { spriteNode?.touchesBegan(touches, with: event) - if !entityManager.isModal { + if !EntityManager.sharedInstance.isModal { for child in self.children { if(child.name != "fire"){ child.alpha = 0.3 } } - entityManager.add(Modal(modaltype: .BaseDetails, + EntityManager.sharedInstance.add(Modal(modaltype: .BaseDetails, base: entity as! Base, anchorPoint: CGPoint(x: self.size.width / 2 , y: self.size.height / 2), - entityManager: entityManager, gameScene: self)) + entityManager: EntityManager.sharedInstance, gameScene: self)) } } } @@ -95,12 +94,12 @@ class GameScene: SKScene{ } } - for e in entityManager.entities{ + for e in EntityManager.sharedInstance.entities{ if let body = e.component(ofType: ModalContentComponent.self)?.body{ body.text = "Schicke \( ((e.component(ofType: SliderComponent.self)?.sliderNode.getValue ?? 0) * CGFloat((e as! Modal).unitCount)).rounded(.up)) Einheiten " } } - let bases = entityManager.getBasesByPlayer(for: GKLocalPlayer.local) + let bases = EntityManager.sharedInstance.getBasesByPlayer(for: GKLocalPlayer.local) for base in bases { if atPoint(touchLocation) == base.component(ofType: DefaultBaseComponent.self)?.spriteNode{ @@ -124,7 +123,7 @@ class GameScene: SKScene{ } override func update(_ currentTime: TimeInterval) { - entityManager.getBackground()?.update(deltaTime: currentTime) - entityManager.getHUD()?.component(ofType: TimerComponent.self)?.update() + EntityManager.sharedInstance.getBackground()?.update(deltaTime: currentTime) + EntityManager.sharedInstance.getHUD()?.component(ofType: TimerComponent.self)?.update() } } diff --git a/GoldWars/GoldWars/Scenes/MenuScene.swift b/GoldWars/GoldWars/Scenes/MenuScene.swift index 2d86084..764a1da 100644 --- a/GoldWars/GoldWars/Scenes/MenuScene.swift +++ b/GoldWars/GoldWars/Scenes/MenuScene.swift @@ -9,14 +9,12 @@ import SpriteKit import SceneKit class MenuScene: SKScene { - - var entityManager: EntityManager! - + override func sceneDidLoad() { - entityManager = EntityManager(scene: self) + EntityManager.sharedInstance.setScene(scene: self) let midX = self.size.width / 2 let midY = self.size.height / 2 - entityManager.add(Button(name: "startGameButton", + EntityManager.sharedInstance.add(Button(name: "startGameButton", iconName: "", text: "Start Game", position: CGPoint(x: midX, y: midY), @@ -28,15 +26,15 @@ class MenuScene: SKScene { MatchmakingHelper.sharedInstance.presentMatchmaker(scene: self) } })) - entityManager.add(Button(name: "settingsButton", + EntityManager.sharedInstance.add(Button(name: "settingsButton", iconName: "", text: "Settings", position: CGPoint(x: midX, y: midY - 80 ), onButtonPress: { self.loadScene(scene: SettingsScene(size: self.size)) })) - entityManager.add(Background(size: self.size)) - entityManager.add(SpinningLogoEntity(position: CGPoint(x: midX, y: midY + 200))) + EntityManager.sharedInstance.add(Background(size: self.size)) + EntityManager.sharedInstance.add(SpinningLogoEntity(position: CGPoint(x: midX, y: midY + 200))) if SoundManager.sharedInstance.isMusicPlaying == false && SoundManager.sharedInstance.isMusicEnabled == true { SoundManager.sharedInstance.startMenuMusic() @@ -49,7 +47,7 @@ class MenuScene: SKScene { } override func update(_ currentTime: TimeInterval) { - entityManager.getBackground()!.update(deltaTime: currentTime) - entityManager.getButtonByName(buttonName: "startGameButton").component(ofType: ButtonComponent.self)?.buttonNode.isEnabled = GameCenterHelper.isAuthenticated + EntityManager.sharedInstance.getBackground()!.update(deltaTime: currentTime) + EntityManager.sharedInstance.getButtonByName(buttonName: "startGameButton").component(ofType: ButtonComponent.self)?.buttonNode.isEnabled = GameCenterHelper.isAuthenticated } } diff --git a/GoldWars/GoldWars/SettingsScene.swift b/GoldWars/GoldWars/SettingsScene.swift index 8eb22f5..a9cd9e0 100644 --- a/GoldWars/GoldWars/SettingsScene.swift +++ b/GoldWars/GoldWars/SettingsScene.swift @@ -9,21 +9,20 @@ import SpriteKit class SettingsScene: SKScene { - var entityManager: EntityManager! override func sceneDidLoad() { - entityManager = EntityManager(scene: self) + EntityManager.sharedInstance.setScene(scene: self) let positionX = self.size.width * 0.1 let positionY = self.size.height * 0.05 - entityManager.add(Button(name: "backToMenuScene", + EntityManager.sharedInstance.add(Button(name: "backToMenuScene", iconName: "", text: "Back", position: CGPoint(x: positionX, y: positionY), onButtonPress: { self.loadScene(scene: MenuScene(size: self.size)) })) - entityManager.add(Button(name: "StopMenuMusic", + EntityManager.sharedInstance.add(Button(name: "StopMenuMusic", iconName: "", text: "ON/OFF", position: CGPoint(x: self.size.width * 0.6, y: self.size.height / 2), @@ -36,7 +35,7 @@ class SettingsScene: SKScene { SoundManager.sharedInstance.startMenuMusic() } })) - entityManager.add(Button(name: "StopMovingBackground", + EntityManager.sharedInstance.add(Button(name: "StopMovingBackground", iconName: "", text: "MOVE/STOP", position: CGPoint(x: self.size.width * 0.6, y: self.size.height / 2 - 100), @@ -47,7 +46,7 @@ class SettingsScene: SKScene { BackgroundComponent.isMovingBackgroundEnabled = true } })) - entityManager.add(Label(fontnamed: "Courier-Bold", + EntityManager.sharedInstance.add(Label(fontnamed: "Courier-Bold", name: "SettingsLabel", text: "Settings", fontSize: 200.0, @@ -58,7 +57,7 @@ class SettingsScene: SKScene { isAnimationEnabled: true, isAnimationInfinite: true) ) - entityManager.add(Label(fontnamed: "Courier-Bold", + EntityManager.sharedInstance.add(Label(fontnamed: "Courier-Bold", name: "LabelMusic", text: "Music", fontSize: 50.0, fontColor: .black, @@ -68,7 +67,7 @@ class SettingsScene: SKScene { isAnimationEnabled: true, isAnimationInfinite: false) ) - entityManager.add(Label(fontnamed: "Courier-Bold", + EntityManager.sharedInstance.add(Label(fontnamed: "Courier-Bold", name: "LabelBackground", text: "Background", fontSize: 50.0, @@ -79,7 +78,7 @@ class SettingsScene: SKScene { isAnimationEnabled: true, isAnimationInfinite: false) ) - entityManager.add(Background(size: self.size)) + EntityManager.sharedInstance.add(Background(size: self.size)) } func loadScene(scene: SKScene) { @@ -88,7 +87,7 @@ class SettingsScene: SKScene { } override func update(_ currentTime: TimeInterval) { - entityManager.getBackground()!.update(deltaTime: currentTime) + EntityManager.sharedInstance.getBackground()!.update(deltaTime: currentTime) } }