diff --git a/GoldWars/GoldWars/Components/AtkBoostSkillComponent.swift b/GoldWars/GoldWars/Components/AtkBoostSkillComponent.swift index 8829c19..facd9b3 100644 --- a/GoldWars/GoldWars/Components/AtkBoostSkillComponent.swift +++ b/GoldWars/GoldWars/Components/AtkBoostSkillComponent.swift @@ -18,7 +18,7 @@ class AtkBoostSkillComponent: GKComponent{ isEnabled: isEnabled, position: position, onButtonPress: { - var bases: Set = EntityManager.sharedInstance.getBasesByTeam(for: .team2) + var bases: Set = EntityManager.gameEMInstance.getBasesByTeam(for: .team2) bases.forEach{ base in if(base.unitType == .Defence){ base.unitType = .AttackDefence diff --git a/GoldWars/GoldWars/Components/DefBoostSkillComponent.swift b/GoldWars/GoldWars/Components/DefBoostSkillComponent.swift index 66ddba8..1d4a43d 100644 --- a/GoldWars/GoldWars/Components/DefBoostSkillComponent.swift +++ b/GoldWars/GoldWars/Components/DefBoostSkillComponent.swift @@ -13,12 +13,13 @@ class DefBoostSkillComponent: GKComponent{ var skillButtonNode: SkillButtonNode init(iconName: String, text: String, position: CGPoint, isEnabled:Bool) { + skillButtonNode = SkillButtonNode(iconName: iconName, text: text, isEnabled: isEnabled, position: position, onButtonPress: { - var bases: Set = EntityManager.sharedInstance.getBasesByTeam(for: .team2) + var bases: Set = EntityManager.gameEMInstance.getBasesByTeam(for: .team2) bases.forEach{ base in if(base.unitType == .Attack){ base.unitType = .AttackDefence diff --git a/GoldWars/GoldWars/Components/PlayerInfoComponent.swift b/GoldWars/GoldWars/Components/PlayerInfoComponent.swift index d48b6e9..26d1b1d 100644 --- a/GoldWars/GoldWars/Components/PlayerInfoComponent.swift +++ b/GoldWars/GoldWars/Components/PlayerInfoComponent.swift @@ -13,6 +13,7 @@ import GameKit class PlayerInfoComponent: GKComponent { + var entityManager = EntityManager.gameEMInstance var hostLabel:SKLabelNode var hostUnitsLabel:SKLabelNode @@ -44,8 +45,8 @@ class PlayerInfoComponent: GKComponent { } func update(){ - hostUnitsLabel.text = "\(EntityManager.sharedInstance.getUnitSum(by: host!))" - peerUnitsLabel.text = "\(EntityManager.sharedInstance.getUnitSum(by: peer!))" + hostUnitsLabel.text = "\(entityManager.getUnitSum(by: host!))" + peerUnitsLabel.text = "\(entityManager.getUnitSum(by: peer!))" } func setColor(labelNodes: [SKLabelNode]) -> Void { diff --git a/GoldWars/GoldWars/DataService.swift b/GoldWars/GoldWars/DataService.swift index d94a992..f12623f 100644 --- a/GoldWars/GoldWars/DataService.swift +++ b/GoldWars/GoldWars/DataService.swift @@ -43,6 +43,7 @@ class DataService { var snapshotModel: SnapshotModel? var gameHost: Host? var mapModel: MapGenerationModel? + var entityManager = EntityManager.gameEMInstance func addMove(playerMove: PlayerMove) { var equalMove = localPlayerMoves.filter { (ele) -> Bool in @@ -73,6 +74,6 @@ class DataService { func setMapModel(model: MapGenerationModel) { self.mapModel = model - MapFactory(scene: EntityManager.sharedInstance.scene, entityManager: EntityManager.sharedInstance).loadMap(fromModel: DataService.sharedInstance.mapModel!) + MapFactory(scene: entityManager.scene, entityManager: entityManager).loadMap(fromModel: DataService.sharedInstance.mapModel!) } } diff --git a/GoldWars/GoldWars/Entities/EntityManager.swift b/GoldWars/GoldWars/Entities/EntityManager.swift index a1c69d3..19f8a5c 100644 --- a/GoldWars/GoldWars/Entities/EntityManager.swift +++ b/GoldWars/GoldWars/Entities/EntityManager.swift @@ -12,7 +12,9 @@ import GameKit class EntityManager { - static let sharedInstance = EntityManager() + static let gameEMInstance = EntityManager() + static let menuEMInstance = EntityManager() + static let settingsEMInstance = EntityManager() var entities = Set() var scene: SKScene diff --git a/GoldWars/GoldWars/Entities/Modal.swift b/GoldWars/GoldWars/Entities/Modal.swift index 489aed4..d125291 100644 --- a/GoldWars/GoldWars/Entities/Modal.swift +++ b/GoldWars/GoldWars/Entities/Modal.swift @@ -10,6 +10,7 @@ import GameplayKit class Modal: GKEntity{ + var entityManager = EntityManager.gameEMInstance var unitCount:Int init(modaltype: ModalType, base: Base, anchorPoint: CGPoint, gameScene: GameScene, currentDraggedBase: Base?, touchLocation: CGPoint, collisionBase: Base?) { @@ -42,9 +43,9 @@ class Modal: GKEntity{ } func removeModalEntities(gameScene: SKScene){ - for entity in EntityManager.sharedInstance.entities { - if EntityManager.sharedInstance.isModal && entity.isMember(of: Modal.self) { - EntityManager.sharedInstance.remove(entity) + for entity in entityManager.entities { + if entityManager.isModal && entity.isMember(of: Modal.self) { + entityManager.remove(entity) } for child in gameScene.children { if(child.name != "fire"){ @@ -57,7 +58,7 @@ class Modal: GKEntity{ func sendUnits(currentDraggedBase: Base?, touchLocation: CGPoint, gameScene: GameScene, collisionBase: Base?){ for base in currentDraggedBase!.adjacencyList { if base == collisionBase { - EntityManager.sharedInstance.update((currentDraggedBase?.doPlayerMoveTypeToBase(base: base, playerMoveType: PlayerMoveType.AtkMove, units: Int(GameScene.sendUnits)))!) + entityManager.update((currentDraggedBase?.doPlayerMoveTypeToBase(base: base, playerMoveType: PlayerMoveType.AtkMove, units: Int(GameScene.sendUnits)))!) GameScene.sendUnits = 0 } } diff --git a/GoldWars/GoldWars/GameViewController.swift b/GoldWars/GoldWars/GameViewController.swift index 05b2706..d879e8c 100644 --- a/GoldWars/GoldWars/GameViewController.swift +++ b/GoldWars/GoldWars/GameViewController.swift @@ -17,15 +17,15 @@ class GameViewController: UIViewController { if let view = self.view as! SKView? { let scene = MenuScene(size: self.view.bounds.size) + EntityManager.menuEMInstance.setScene(scene: scene) scene.scaleMode = .aspectFill view.presentScene(scene) //TODO: create dev profile or remove on delivery view.showsFPS = true view.showsNodeCount = true - - GameCenterHelper.helper.viewController = self - MatchmakingHelper.sharedInstance.viewController = self - } + GameCenterHelper.helper.viewController = self + MatchmakingHelper.sharedInstance.viewController = self + } } override var shouldAutorotate: Bool { diff --git a/GoldWars/GoldWars/MatchmakingHelper.swift b/GoldWars/GoldWars/MatchmakingHelper.swift index 60dc5d2..ec5477a 100644 --- a/GoldWars/GoldWars/MatchmakingHelper.swift +++ b/GoldWars/GoldWars/MatchmakingHelper.swift @@ -37,6 +37,7 @@ class MatchmakingHelper: NSObject, GKMatchmakerViewControllerDelegate, GKMatchDe var nameSpieler1 = "" var menusc: MenuScene? let localPlayer: GKLocalPlayer = GKLocalPlayer.local + var entityManager = EntityManager.gameEMInstance static let sharedInstance = MatchmakingHelper() @@ -119,8 +120,8 @@ class MatchmakingHelper: NSObject, GKMatchmakerViewControllerDelegate, GKMatchDe if let snapshotModel = try? jsonDecoder.decode(SnapshotModel.self, from: data) { DataService.sharedInstance.snapshotModel = snapshotModel - EntityManager.sharedInstance.updateSnapshotModel(snapshotModel: snapshotModel) - EntityManager.sharedInstance.getTimer().startWithDuration(duration: 31) + entityManager.updateSnapshotModel(snapshotModel: snapshotModel) + entityManager.getTimer().startWithDuration(duration: 31) } if let mapModel = try? jsonDecoder.decode(MapGenerationModel.self, from: data) { @@ -182,7 +183,9 @@ class MatchmakingHelper: NSObject, GKMatchmakerViewControllerDelegate, GKMatchDe } self.delegate?.matchStarted() - self.menusc!.loadScene(scene: GameScene(size: self.menusc!.size)) + let scene = GameScene(size: self.menusc!.size) + self.entityManager.setScene(scene: scene) + self.menusc!.loadScene(scene: scene) MultiplayerNetwork.sharedInstance.sendHostIdentifier() }) } diff --git a/GoldWars/GoldWars/MultiplayerNetwork.swift b/GoldWars/GoldWars/MultiplayerNetwork.swift index 5cf2937..9535514 100644 --- a/GoldWars/GoldWars/MultiplayerNetwork.swift +++ b/GoldWars/GoldWars/MultiplayerNetwork.swift @@ -11,20 +11,20 @@ import Foundation import GameKit class MultiplayerNetwork{ - static let sharedInstance = MultiplayerNetwork() + static let sharedInstance = MultiplayerNetwork() var isSending = false - func sendData(data: Data) { - let mmHelper = MatchmakingHelper.sharedInstance - if let multiplayerMatch = mmHelper.mpMatch { - do { - try multiplayerMatch.sendData(toAllPlayers: data, with: .reliable) - } catch { - //TODO: Add logging - } - } - } + func sendData(data: Data) { + let mmHelper = MatchmakingHelper.sharedInstance + if let multiplayerMatch = mmHelper.mpMatch { + do { + try multiplayerMatch.sendData(toAllPlayers: data, with: .reliable) + } catch { + //TODO: Add logging + } + } + } func sendDataToHost(data: Data) { let mmHelper = MatchmakingHelper.sharedInstance @@ -38,7 +38,7 @@ class MultiplayerNetwork{ } } } - + func sendPlayerMoves(playerMoves: [PlayerMove]) { if MatchmakingHelper.sharedInstance.isServer == false { self.isSending = true @@ -47,7 +47,7 @@ class MultiplayerNetwork{ sendDataToHost(data: encoded) DataService.sharedInstance.localPlayerMoves.removeAll() } - } + } func sendHostIdentifier() { let encoder = JSONEncoder() @@ -66,5 +66,5 @@ class MultiplayerNetwork{ let encoded = (try? encoder.encode(mapModel))! sendData(data: encoded) } - + } diff --git a/GoldWars/GoldWars/RoundCalculatorService.swift b/GoldWars/GoldWars/RoundCalculatorService.swift index b9186c6..2a0a877 100644 --- a/GoldWars/GoldWars/RoundCalculatorService.swift +++ b/GoldWars/GoldWars/RoundCalculatorService.swift @@ -15,6 +15,7 @@ class RoundCalculatorService { var allPlayerMoves: [String: [PlayerMove]] = [:] var baseSpecificMoves: [Int: [String: [PlayerMove]]] = [:] + var entityManager = EntityManager.gameEMInstance var isCalculating = false @@ -110,9 +111,9 @@ class RoundCalculatorService { DataService.sharedInstance.localPlayerMoves.removeAll() MultiplayerNetwork.sharedInstance.sendSnapshotModelToPlayers() DataService.sharedInstance.snapshotModel = currentSnapshotModel - EntityManager.sharedInstance.updateSnapshotModel(snapshotModel: currentSnapshotModel!) + entityManager.updateSnapshotModel(snapshotModel: currentSnapshotModel!) sleep(1) - EntityManager.sharedInstance.getTimer().startWithDuration(duration: 31) + entityManager.getTimer().startWithDuration(duration: 31) os_log("Finished calculating Round", log: RoundCalculatorService.LOG, type: .info) } diff --git a/GoldWars/GoldWars/Scenes/GameScene.swift b/GoldWars/GoldWars/Scenes/GameScene.swift index 7618d1a..16519a3 100644 --- a/GoldWars/GoldWars/Scenes/GameScene.swift +++ b/GoldWars/GoldWars/Scenes/GameScene.swift @@ -12,26 +12,28 @@ import GameKit class GameScene: SKScene{ + var entityManager = EntityManager.gameEMInstance + var isMoveTouch = false var currentDraggedBase : Base? static var sendUnits: CGFloat = 0 var collisionBase: Base? override func sceneDidLoad() { - EntityManager.sharedInstance.setScene(scene: self) - EntityManager.sharedInstance.add(HUD(size: self.size)) - EntityManager.sharedInstance.add(Background(size: self.size)) + entityManager.setScene(scene: self) + entityManager.add(HUD(size: self.size)) + entityManager.add(Background(size: self.size)) initMap() } func initMap() { if (DataService.sharedInstance.gameHost?.playerName == GKLocalPlayer.local.displayName) { - let mapModel = MapFactory(scene: self, entityManager: EntityManager.sharedInstance).loadMap() + let mapModel = MapFactory(scene: self, entityManager: entityManager).loadMap() MultiplayerNetwork.sharedInstance.sendMapModelToPlayers(mapModel: mapModel) - DataService.sharedInstance.setSnapshotModel(snapshotModel: EntityManager.sharedInstance.getSnapshotModel()) + DataService.sharedInstance.setSnapshotModel(snapshotModel: entityManager.getSnapshotModel()) } if CommandLine.arguments.contains("--no-matchmaking") { - MapFactory(scene: self, entityManager: EntityManager.sharedInstance).loadMap() + _ = MapFactory(scene: self, entityManager: entityManager).loadMap() } } @@ -50,7 +52,7 @@ class GameScene: SKScene{ addAttackDetails(touchLocation: touchLocation) } else { - for entity in EntityManager.sharedInstance.entities { + for entity in entityManager.entities { let spriteNode = entity.component(ofType: DefaultBaseComponent.self)?.spriteNode //FIXME: this is confusing @@ -73,18 +75,18 @@ class GameScene: SKScene{ } checkSlider() - let bases = EntityManager.sharedInstance.getBasesByPlayer(for: GKLocalPlayer.local) + let bases = entityManager.getBasesByPlayer(for: GKLocalPlayer.local) checkBases(bases: bases, touchLocation: touchLocation) } override func update(_ currentTime: TimeInterval) { - EntityManager.sharedInstance.getBackground()?.update(deltaTime: currentTime) - EntityManager.sharedInstance.getHUD()?.component(ofType: TimerComponent.self)?.update() + entityManager.getBackground()?.update(deltaTime: currentTime) + entityManager.getHUD()?.component(ofType: TimerComponent.self)?.update() } func addBaseDetails(touchLocation: CGPoint, spriteNode: SKNode?, touches: Set, event: UIEvent?, entity: GKEntity){ - if atPoint(touchLocation) == spriteNode && !EntityManager.sharedInstance.isModal { + if atPoint(touchLocation) == spriteNode && !entityManager.isModal { spriteNode?.touchesBegan(touches, with: event) if let baseEntity = entity as? Base { if baseEntity.ownershipPlayer == GKLocalPlayer.local { @@ -93,11 +95,11 @@ class GameScene: SKScene{ child.alpha = 0.3 } } - EntityManager.sharedInstance.add(Modal(modaltype: .BaseDetails, - base: entity as! Base, - anchorPoint: CGPoint(x: self.size.width / 2 , y: self.size.height / 2), - gameScene: self, - currentDraggedBase: currentDraggedBase, touchLocation: touchLocation, collisionBase: collisionBase)) + entityManager.add(Modal(modaltype: .BaseDetails, + base: entity as! Base, + anchorPoint: CGPoint(x: self.size.width / 2 , y: self.size.height / 2), + gameScene: self, + currentDraggedBase: currentDraggedBase, touchLocation: touchLocation, collisionBase: collisionBase)) } } @@ -110,10 +112,10 @@ class GameScene: SKScene{ collisionBase = base // TODO: change interaction based on collision instead of touchlocation if currentDraggedBase!.unitCount > 1 { - EntityManager.sharedInstance.add(Modal(modaltype: .BaseAttack, - base: currentDraggedBase!, - anchorPoint: CGPoint(x: self.size.width / 2 , y: self.size.height / 2), - gameScene: self, currentDraggedBase: currentDraggedBase, touchLocation: touchLocation, collisionBase: collisionBase)) + entityManager.add(Modal(modaltype: .BaseAttack, + base: currentDraggedBase!, + anchorPoint: CGPoint(x: self.size.width / 2 , y: self.size.height / 2), + gameScene: self, currentDraggedBase: currentDraggedBase, touchLocation: touchLocation, collisionBase: collisionBase)) GameScene.sendUnits = CGFloat(currentDraggedBase!.unitCount / 2) } } @@ -121,7 +123,7 @@ class GameScene: SKScene{ } func checkSlider(){ - for e in EntityManager.sharedInstance.entities{ + for e in entityManager.entities{ if let body = e.component(ofType: ModalContentComponent.self)?.body{ GameScene.sendUnits = ((e.component(ofType: SliderComponent.self)?.sliderNode.getValue ?? 0) * CGFloat((e as! Modal).unitCount)).rounded(.up) diff --git a/GoldWars/GoldWars/Scenes/MenuScene.swift b/GoldWars/GoldWars/Scenes/MenuScene.swift index 764a1da..64699d2 100644 --- a/GoldWars/GoldWars/Scenes/MenuScene.swift +++ b/GoldWars/GoldWars/Scenes/MenuScene.swift @@ -9,12 +9,15 @@ import SpriteKit import SceneKit class MenuScene: SKScene { - + + var entityManager = EntityManager.menuEMInstance + override func sceneDidLoad() { - EntityManager.sharedInstance.setScene(scene: self) + + entityManager.setScene(scene: self) let midX = self.size.width / 2 let midY = self.size.height / 2 - EntityManager.sharedInstance.add(Button(name: "startGameButton", + entityManager.add(Button(name: "startGameButton", iconName: "", text: "Start Game", position: CGPoint(x: midX, y: midY), @@ -26,15 +29,16 @@ class MenuScene: SKScene { MatchmakingHelper.sharedInstance.presentMatchmaker(scene: self) } })) - EntityManager.sharedInstance.add(Button(name: "settingsButton", + entityManager.add(Button(name: "settingsButton", iconName: "", text: "Settings", position: CGPoint(x: midX, y: midY - 80 ), onButtonPress: { - self.loadScene(scene: SettingsScene(size: self.size)) + let scene = SettingsScene(size: self.size) + self.loadScene(scene: scene) })) - EntityManager.sharedInstance.add(Background(size: self.size)) - EntityManager.sharedInstance.add(SpinningLogoEntity(position: CGPoint(x: midX, y: midY + 200))) + entityManager.add(Background(size: self.size)) + entityManager.add(SpinningLogoEntity(position: CGPoint(x: midX, y: midY + 200))) if SoundManager.sharedInstance.isMusicPlaying == false && SoundManager.sharedInstance.isMusicEnabled == true { SoundManager.sharedInstance.startMenuMusic() @@ -43,11 +47,14 @@ class MenuScene: SKScene { func loadScene(scene: SKScene) { let transition = SKTransition.flipVertical(withDuration: 0.5) + entityManager.entities.removeAll() self.view?.presentScene(scene, transition: transition) } override func update(_ currentTime: TimeInterval) { - EntityManager.sharedInstance.getBackground()!.update(deltaTime: currentTime) - EntityManager.sharedInstance.getButtonByName(buttonName: "startGameButton").component(ofType: ButtonComponent.self)?.buttonNode.isEnabled = GameCenterHelper.isAuthenticated + if entityManager.entities.count != 0 { + entityManager.getBackground()!.update(deltaTime: currentTime) + entityManager.getButtonByName(buttonName: "startGameButton").component(ofType: ButtonComponent.self)?.buttonNode.isEnabled = GameCenterHelper.isAuthenticated + } } } diff --git a/GoldWars/GoldWars/SettingsScene.swift b/GoldWars/GoldWars/SettingsScene.swift index a9cd9e0..e568ed2 100644 --- a/GoldWars/GoldWars/SettingsScene.swift +++ b/GoldWars/GoldWars/SettingsScene.swift @@ -10,19 +10,23 @@ import SpriteKit class SettingsScene: SKScene { + var entityManager = EntityManager.settingsEMInstance + override func sceneDidLoad() { - EntityManager.sharedInstance.setScene(scene: self) + + entityManager.setScene(scene: self) let positionX = self.size.width * 0.1 let positionY = self.size.height * 0.05 - - EntityManager.sharedInstance.add(Button(name: "backToMenuScene", + print("SceneDidLoad Setting") + entityManager.add(Button(name: "backToMenuScene", iconName: "", text: "Back", position: CGPoint(x: positionX, y: positionY), onButtonPress: { - self.loadScene(scene: MenuScene(size: self.size)) + let scene = MenuScene(size: self.size) + self.loadScene(scene: scene) })) - EntityManager.sharedInstance.add(Button(name: "StopMenuMusic", + entityManager.add(Button(name: "StopMenuMusic", iconName: "", text: "ON/OFF", position: CGPoint(x: self.size.width * 0.6, y: self.size.height / 2), @@ -35,7 +39,7 @@ class SettingsScene: SKScene { SoundManager.sharedInstance.startMenuMusic() } })) - EntityManager.sharedInstance.add(Button(name: "StopMovingBackground", + entityManager.add(Button(name: "StopMovingBackground", iconName: "", text: "MOVE/STOP", position: CGPoint(x: self.size.width * 0.6, y: self.size.height / 2 - 100), @@ -46,7 +50,7 @@ class SettingsScene: SKScene { BackgroundComponent.isMovingBackgroundEnabled = true } })) - EntityManager.sharedInstance.add(Label(fontnamed: "Courier-Bold", + entityManager.add(Label(fontnamed: "Courier-Bold", name: "SettingsLabel", text: "Settings", fontSize: 200.0, @@ -57,7 +61,7 @@ class SettingsScene: SKScene { isAnimationEnabled: true, isAnimationInfinite: true) ) - EntityManager.sharedInstance.add(Label(fontnamed: "Courier-Bold", + entityManager.add(Label(fontnamed: "Courier-Bold", name: "LabelMusic", text: "Music", fontSize: 50.0, fontColor: .black, @@ -67,7 +71,7 @@ class SettingsScene: SKScene { isAnimationEnabled: true, isAnimationInfinite: false) ) - EntityManager.sharedInstance.add(Label(fontnamed: "Courier-Bold", + entityManager.add(Label(fontnamed: "Courier-Bold", name: "LabelBackground", text: "Background", fontSize: 50.0, @@ -78,16 +82,19 @@ class SettingsScene: SKScene { isAnimationEnabled: true, isAnimationInfinite: false) ) - EntityManager.sharedInstance.add(Background(size: self.size)) + entityManager.add(Background(size: self.size)) } func loadScene(scene: SKScene) { let transition = SKTransition.flipVertical(withDuration: 0.5) + entityManager.entities.removeAll() self.view?.presentScene(scene, transition: transition) } override func update(_ currentTime: TimeInterval) { - EntityManager.sharedInstance.getBackground()!.update(deltaTime: currentTime) + if entityManager.entities.count != 0 { + entityManager.getBackground()!.update(deltaTime: currentTime) + } } }