diff --git a/GoldWars/GoldWars.xcodeproj/project.pbxproj b/GoldWars/GoldWars.xcodeproj/project.pbxproj index 42aeab1..199af2e 100644 --- a/GoldWars/GoldWars.xcodeproj/project.pbxproj +++ b/GoldWars/GoldWars.xcodeproj/project.pbxproj @@ -37,6 +37,8 @@ 9EA3ABEB245C6DFA006BC61D /* BaseNode.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9EA3ABEA245C6DFA006BC61D /* BaseNode.swift */; }; 9EA3ABED245C8143006BC61D /* ModalBackgroundComponent.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9EA3ABEC245C8143006BC61D /* ModalBackgroundComponent.swift */; }; 9EA3ABEF245C834B006BC61D /* ModalContentComponent.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9EA3ABEE245C834B006BC61D /* ModalContentComponent.swift */; }; + 9EBFD7552462CF5A00E1E219 /* SliderComponent.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9EBFD7542462CF5A00E1E219 /* SliderComponent.swift */; }; + 9EC7E48B2461FBF700396BCD /* SliderNode.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9EC7E48A2461FBF700396BCD /* SliderNode.swift */; }; 9EC86B9F245C88A300796EF3 /* Modal.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9EC86B9E245C88A300796EF3 /* Modal.swift */; }; 9EC86BA6245C8AD000796EF3 /* ModalType.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9EC86BA5245C8AD000796EF3 /* ModalType.swift */; }; AB1D759C245DD18100671525 /* MapProtocol.swift in Sources */ = {isa = PBXBuildFile; fileRef = AB1D759A245DD18100671525 /* MapProtocol.swift */; }; @@ -91,6 +93,8 @@ 9EA3ABEA245C6DFA006BC61D /* BaseNode.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BaseNode.swift; sourceTree = ""; }; 9EA3ABEC245C8143006BC61D /* ModalBackgroundComponent.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ModalBackgroundComponent.swift; sourceTree = ""; }; 9EA3ABEE245C834B006BC61D /* ModalContentComponent.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ModalContentComponent.swift; sourceTree = ""; }; + 9EBFD7542462CF5A00E1E219 /* SliderComponent.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SliderComponent.swift; sourceTree = ""; }; + 9EC7E48A2461FBF700396BCD /* SliderNode.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SliderNode.swift; sourceTree = ""; }; 9EC86B9E245C88A300796EF3 /* Modal.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Modal.swift; sourceTree = ""; }; 9EC86BA5245C8AD000796EF3 /* ModalType.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ModalType.swift; sourceTree = ""; }; 9ECD3699245C91F7008DEEBD /* GoldWars.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = GoldWars.entitlements; sourceTree = ""; }; @@ -185,6 +189,8 @@ 9E174C87245DF1FF00209FF0 /* BackgroundComponent.swift */, 9E04AFAE245E2B73002D5CFC /* AttackActionComponent.swift */, 2086465B2461B66200817C23 /* TimerComponent.swift */, + 9EBFD7542462CF5A00E1E219 /* SliderComponent.swift */, + 9EC7E48A2461FBF700396BCD /* SliderNode.swift */, ); path = Components; sourceTree = ""; @@ -381,8 +387,10 @@ AB1D759C245DD18100671525 /* MapProtocol.swift in Sources */, AB1D75A0245DEC0500671525 /* MapFactory.swift in Sources */, AB1D759D245DD18100671525 /* TwoPlayerDefaultTestMap.swift in Sources */, + 9EBFD7552462CF5A00E1E219 /* SliderComponent.swift in Sources */, ABA03DA0244BD54F00A66916 /* Base.swift in Sources */, 9E174C82245DD81D00209FF0 /* ButtonNode.swift in Sources */, + 9EC7E48B2461FBF700396BCD /* SliderNode.swift in Sources */, 9E174C84245DD8CE00209FF0 /* Button.swift in Sources */, 110360DB244B101A008610AF /* GameViewController.swift in Sources */, 2086465C2461B66200817C23 /* TimerComponent.swift in Sources */, diff --git a/GoldWars/GoldWars/Components/AtkBoostSkillComponent.swift b/GoldWars/GoldWars/Components/AtkBoostSkillComponent.swift index febccec..a2d36b3 100644 --- a/GoldWars/GoldWars/Components/AtkBoostSkillComponent.swift +++ b/GoldWars/GoldWars/Components/AtkBoostSkillComponent.swift @@ -10,8 +10,8 @@ import GameplayKit class AtkBoostSkillComponent: GKComponent{ - let shapeNode :SKShapeNode - let labelNode :SKLabelNode + let shapeNode: SKShapeNode + let labelNode: SKLabelNode init(text: String, texture: SKTexture?, anchorPoint: CGPoint) { self.labelNode = SKLabelNode(text: text) @@ -24,7 +24,6 @@ class AtkBoostSkillComponent: GKComponent{ shapeNode.fillColor = SKColor.gray } super.init() - } required init?(coder: NSCoder) { diff --git a/GoldWars/GoldWars/Components/AttackActionComponent.swift b/GoldWars/GoldWars/Components/AttackActionComponent.swift index c627fbb..ba46e1a 100644 --- a/GoldWars/GoldWars/Components/AttackActionComponent.swift +++ b/GoldWars/GoldWars/Components/AttackActionComponent.swift @@ -6,17 +6,13 @@ // Copyright © 2020 SP2. All rights reserved. // -import Foundation import GameplayKit -class AttackActionComponent : GKComponent { +class AttackActionComponent: GKComponent { init(unitCount: Int, adjacencyList: Array, position: CGPoint) { - - super.init() - } required init?(coder: NSCoder) { @@ -25,7 +21,7 @@ class AttackActionComponent : GKComponent { func action() { - + // Not implemented yet } } diff --git a/GoldWars/GoldWars/Components/BackgroundComponent.swift b/GoldWars/GoldWars/Components/BackgroundComponent.swift index 349cf2a..7239741 100644 --- a/GoldWars/GoldWars/Components/BackgroundComponent.swift +++ b/GoldWars/GoldWars/Components/BackgroundComponent.swift @@ -6,7 +6,6 @@ // Copyright © 2020 SP2. All rights reserved. // -import Foundation import GameplayKit class BackgroundComponent: GKComponent{ @@ -21,7 +20,7 @@ class BackgroundComponent: GKComponent{ sky.name = "clouds" sky.zPosition = -1 sky.size = CGSize(width: size.width, height: size.height) - sky.position = CGPoint(x: CGFloat(i) * sky.size.width , y: (size.height / 2)) + sky.position = CGPoint(x: CGFloat(i) * sky.size.width, y: (size.height / 2)) nodes.append(sky) } super.init() @@ -36,8 +35,6 @@ class BackgroundComponent: GKComponent{ } } - - required init?(coder: NSCoder) { fatalError("init(coder:) has not been implemented") } diff --git a/GoldWars/GoldWars/Components/BaseNode.swift b/GoldWars/GoldWars/Components/BaseNode.swift index 40e27fc..00da238 100644 --- a/GoldWars/GoldWars/Components/BaseNode.swift +++ b/GoldWars/GoldWars/Components/BaseNode.swift @@ -6,23 +6,20 @@ // Copyright © 2020 SP2. All rights reserved. // -import Foundation import SpriteKit - class BaseNode: SKSpriteNode{ override func touchesBegan(_ touches: Set, with event: UIEvent?) { // TODO: PopUp Einheiten + Close PopUp self.run( SKAction.sequence( - [ - SKAction.resize(byWidth: 20, height: 20, duration: 0.5), - SKAction.resize(byWidth: -20, height: -20, duration: 0.5) - ] + [ + SKAction.resize(byWidth: 20, height: 20, duration: 0.5), + SKAction.resize(byWidth: -20, height: -20, duration: 0.5) + ] ) ) - } override func touchesMoved(_ touches: Set, with event: UIEvent?) { diff --git a/GoldWars/GoldWars/Components/ButtonComponent.swift b/GoldWars/GoldWars/Components/ButtonComponent.swift index 57476db..0fe059f 100644 --- a/GoldWars/GoldWars/Components/ButtonComponent.swift +++ b/GoldWars/GoldWars/Components/ButtonComponent.swift @@ -6,14 +6,13 @@ // Copyright © 2020 SP2. All rights reserved. // -import Foundation import GameplayKit class ButtonComponent: GKComponent { - var buttonNode : ButtonNode + var buttonNode: ButtonNode - init(iconName: String, text: String, position: CGPoint, isEnabled:Bool , onButtonPress: @escaping () -> ()) { + init(iconName: String, text: String, position: CGPoint, isEnabled:Bool, onButtonPress: @escaping () -> ()) { buttonNode = ButtonNode(iconName: iconName, text: text, isEnabled: isEnabled, diff --git a/GoldWars/GoldWars/Components/ButtonNode.swift b/GoldWars/GoldWars/Components/ButtonNode.swift index d1d6ad2..2ebd012 100644 --- a/GoldWars/GoldWars/Components/ButtonNode.swift +++ b/GoldWars/GoldWars/Components/ButtonNode.swift @@ -6,12 +6,11 @@ // Copyright © 2020 SP2. All rights reserved. // -import Foundation import SpriteKit -class ButtonNode : SKSpriteNode { +class ButtonNode: SKSpriteNode { - var isEnabled:Bool{ + var isEnabled: Bool{ didSet{ if isEnabled { self.alpha = 1 @@ -25,7 +24,7 @@ class ButtonNode : SKSpriteNode { let onButtonPress: () -> () - init(iconName: String, text: String,isEnabled:Bool, position: CGPoint, onButtonPress: @escaping () -> ()) { + init(iconName: String, text: String, isEnabled: Bool, position: CGPoint, onButtonPress: @escaping () -> ()) { self.onButtonPress = onButtonPress self.isEnabled = isEnabled let texture = SKTexture(imageNamed: "yellow_button04") @@ -33,42 +32,39 @@ class ButtonNode : SKSpriteNode { self.position = position let label = SKLabelNode(fontNamed: "Courier-Bold") - label.fontSize = 30 label.fontColor = SKColor.black - label.zPosition = 1 label.verticalAlignmentMode = .center label.text = text label.name = "label" - if !iconName.isEmpty { + if iconName.isEmpty { + label.position = CGPoint(x: 0, y: 0) + } else { label.position = CGPoint(x: size.width * 0.25, y: 0) let icon = SKSpriteNode(imageNamed: iconName) icon.position = CGPoint(x: -size.width * 0.25, y: 0) icon.zPosition = 1 self.addChild(icon) - } else { - label.position = CGPoint(x: 0, y: 0) } self.addChild(label) isUserInteractionEnabled = true } override func touchesBegan(_ touches: Set, with event: UIEvent?) { - if isEnabled { let action = SKAction.sequence( [ SKAction.scale(by: (3/4), duration: 0.3), SKAction.scale(by: (4/3), duration: 0.3), - ]) + ] + ) self.childNode(withName: "label")?.run(action) self.run(action) onButtonPress() } - } diff --git a/GoldWars/GoldWars/Components/DefBoostSkillComponent.swift b/GoldWars/GoldWars/Components/DefBoostSkillComponent.swift index 62b9b23..01c0aef 100644 --- a/GoldWars/GoldWars/Components/DefBoostSkillComponent.swift +++ b/GoldWars/GoldWars/Components/DefBoostSkillComponent.swift @@ -10,8 +10,8 @@ import GameplayKit class DefBoostSkillComponent: GKComponent{ - let shapeNode :SKShapeNode - let labelNode :SKLabelNode + let shapeNode: SKShapeNode + let labelNode: SKLabelNode init(text: String, texture: SKTexture?, anchorPoint: CGPoint) { self.labelNode = SKLabelNode(text: text) @@ -24,7 +24,6 @@ class DefBoostSkillComponent: GKComponent{ shapeNode.fillColor = SKColor.gray } super.init() - } required init?(coder: NSCoder) { diff --git a/GoldWars/GoldWars/Components/DefaultBaseComponent.swift b/GoldWars/GoldWars/Components/DefaultBaseComponent.swift index f668990..715840b 100644 --- a/GoldWars/GoldWars/Components/DefaultBaseComponent.swift +++ b/GoldWars/GoldWars/Components/DefaultBaseComponent.swift @@ -6,14 +6,13 @@ // Copyright © 2020 SP2. All rights reserved. // -import Foundation import GameplayKit import SpriteKit class DefaultBaseComponent: GKComponent { var spriteNode: BaseNode - init(texture: SKTexture,position: CGPoint) { + init(texture: SKTexture, position: CGPoint) { spriteNode = BaseNode(texture: texture, size: CGSize(width: 80, height: 80)) spriteNode.position = position super.init() diff --git a/GoldWars/GoldWars/Components/ModalBackgroundComponent.swift b/GoldWars/GoldWars/Components/ModalBackgroundComponent.swift index 2d26122..e81fcf9 100644 --- a/GoldWars/GoldWars/Components/ModalBackgroundComponent.swift +++ b/GoldWars/GoldWars/Components/ModalBackgroundComponent.swift @@ -6,12 +6,11 @@ // Copyright © 2020 SP2. All rights reserved. // -import Foundation import GameplayKit import SpriteKit class ModalBackgroundComponent: GKComponent { - let spriteNode : SKSpriteNode + let spriteNode: SKSpriteNode init(anchorPoint: CGPoint) { let texture = SKTexture(imageNamed:"ModalBackground") diff --git a/GoldWars/GoldWars/Components/ModalContentComponent.swift b/GoldWars/GoldWars/Components/ModalContentComponent.swift index 7c4f803..df004a3 100644 --- a/GoldWars/GoldWars/Components/ModalContentComponent.swift +++ b/GoldWars/GoldWars/Components/ModalContentComponent.swift @@ -6,7 +6,6 @@ // Copyright © 2020 SP2. All rights reserved. // -import Foundation import GameplayKit import SpriteKit @@ -31,7 +30,7 @@ class ModalContentComponent: GKComponent{ self.body.fontSize = 40 self.footer = SKLabelNode(text: footer) - self.footer.position = CGPoint(x: anchorPoint.x, y: anchorPoint.y - 20) + self.footer.position = CGPoint(x: anchorPoint.x, y: anchorPoint.y - 40) self.footer.fontName = "HelveticaNeue-Bold" self.footer.fontSize = 40 super.init() diff --git a/GoldWars/GoldWars/Components/SliderComponent.swift b/GoldWars/GoldWars/Components/SliderComponent.swift new file mode 100644 index 0000000..dc46145 --- /dev/null +++ b/GoldWars/GoldWars/Components/SliderComponent.swift @@ -0,0 +1,23 @@ +// +// SliderComponent.swift +// GoldWars +// +// Created by Niko Jochim on 05.05.20. +// Copyright © 2020 SP2. All rights reserved. +// + +import GameplayKit + +class SliderComponent: GKComponent { + + var sliderNode: SliderNode + + init(width: CGFloat, position: CGPoint) { + sliderNode = SliderNode(width: width, position: position) + super.init() + } + + required init?(coder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } +} diff --git a/GoldWars/GoldWars/Components/SliderNode.swift b/GoldWars/GoldWars/Components/SliderNode.swift new file mode 100644 index 0000000..93f42d2 --- /dev/null +++ b/GoldWars/GoldWars/Components/SliderNode.swift @@ -0,0 +1,66 @@ +// +// SliderNode.swift +// GoldWars +// +// Created by Niko Jochim on 05.05.20. +// Copyright © 2020 SP2. All rights reserved. +// + +import SpriteKit + + +class SliderNode :SKNode { + + var sliderLine :SKShapeNode + var sliderKnob :SliderKnob + var width: CGFloat + + var getValue: CGFloat{ + get{ + return ((sliderKnob.position.x.rounded() - sliderKnob.min) / width) + } + } + + init(width: CGFloat, position: CGPoint) { + self.width = width + sliderLine = SKShapeNode(rectOf: CGSize(width: width, height: 8)) + sliderLine.position = position + sliderLine.fillColor = SKColor.white + sliderKnob = SliderKnob(circleOfRadius: 20) + sliderKnob.min = position.x - width / 2 + sliderKnob.max = position.x + width / 2 + sliderKnob.fillColor = SKColor.red + sliderKnob.zPosition = sliderLine.zPosition + 1 + sliderKnob.position = CGPoint(x: sliderLine.position.x, y: sliderLine.position.y + 1) + super.init() + + } + + required init?(coder aDecoder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } +} + +class SliderKnob: SKShapeNode { + var min = CGFloat() + var max = CGFloat() + + override func touchesMoved(_ touches: Set, with event: UIEvent?) { + + for touch in touches { + let touchLocation = touch.location(in: self.scene!) + + if self.position.x >= min - 1 && self.position.x <= max + 1{ + self.position.x = touchLocation.x + } + + if(self.position.x <= min){ + self.position.x = min + } + if(self.position.x >= max){ + self.position.x = max + } + } + } +} + diff --git a/GoldWars/GoldWars/Components/SpySkillComponent.swift b/GoldWars/GoldWars/Components/SpySkillComponent.swift index d4fb374..b193de5 100644 --- a/GoldWars/GoldWars/Components/SpySkillComponent.swift +++ b/GoldWars/GoldWars/Components/SpySkillComponent.swift @@ -10,8 +10,8 @@ import GameplayKit class SpySkillComponent: GKComponent{ - let shapeNode :SKShapeNode - let labelNode :SKLabelNode + let shapeNode: SKShapeNode + let labelNode: SKLabelNode init(text: String, texture: SKTexture?, anchorPoint: CGPoint) { self.labelNode = SKLabelNode(text: text) @@ -24,7 +24,6 @@ class SpySkillComponent: GKComponent{ shapeNode.fillColor = SKColor.gray } super.init() - } required init?(coder: NSCoder) { diff --git a/GoldWars/GoldWars/Components/TeamComponent.swift b/GoldWars/GoldWars/Components/TeamComponent.swift index dc24f45..379a1cc 100644 --- a/GoldWars/GoldWars/Components/TeamComponent.swift +++ b/GoldWars/GoldWars/Components/TeamComponent.swift @@ -11,7 +11,7 @@ import GameplayKit class TeamComponent: GKComponent { let team: Team - let fire:SKEmitterNode + let fire: SKEmitterNode init(team: Team, position: CGPoint) { fire = SKEmitterNode(fileNamed: "Fire")! @@ -20,7 +20,8 @@ class TeamComponent: GKComponent { fire.name = "fire" fire.particleColorSequence = nil fire.particleColorBlendFactor = 1.0 - switch team { + + switch team { case .team1: fire.particleColor = SKColor.red case .team2: fire.particleColor = SKColor.purple case .team3: fire.particleColor = SKColor.green diff --git a/GoldWars/GoldWars/Entities/Background.swift b/GoldWars/GoldWars/Entities/Background.swift index 423168e..6cc1b74 100644 --- a/GoldWars/GoldWars/Entities/Background.swift +++ b/GoldWars/GoldWars/Entities/Background.swift @@ -6,7 +6,6 @@ // Copyright © 2020 SP2. All rights reserved. // -import Foundation import GameplayKit class Background: GKEntity { @@ -16,7 +15,6 @@ class Background: GKEntity { addComponent(BackgroundComponent(size: size)) } - override func update(deltaTime seconds: TimeInterval) { component(ofType: BackgroundComponent.self)?.update() } @@ -24,7 +22,4 @@ class Background: GKEntity { required init?(coder: NSCoder) { fatalError("init(coder:) has not been implemented") } - - - } diff --git a/GoldWars/GoldWars/Entities/Base.swift b/GoldWars/GoldWars/Entities/Base.swift index 6ae0a10..70fe75d 100644 --- a/GoldWars/GoldWars/Entities/Base.swift +++ b/GoldWars/GoldWars/Entities/Base.swift @@ -9,24 +9,31 @@ import SpriteKit import GameplayKit -class Base : GKEntity { +class Base: GKEntity { + var unitCount: Int var adjacencyList: Array + var changeOwnerShip: Bool init(position: CGPoint, team: Team! = nil) { self.unitCount = 0 self.adjacencyList = [Base]() - + self.changeOwnerShip = false super.init() addComponent(DefaultBaseComponent(texture: SKTexture(imageNamed: "Base"), position: position)) if(team != nil){ addComponent(TeamComponent(team: team!, position: position)) - self.unitCount = 100 + self.unitCount = 500 } } - + func attackBase(base: Base, units:Int) -> [GKEntity]{ + base.changeOwnerShip = true + self.unitCount -= units + base.unitCount += units + return [self, base] + } required init?(coder: NSCoder) { fatalError("init(coder:) has not been implemented") diff --git a/GoldWars/GoldWars/Entities/Button.swift b/GoldWars/GoldWars/Entities/Button.swift index e2c52e2..8ac174d 100644 --- a/GoldWars/GoldWars/Entities/Button.swift +++ b/GoldWars/GoldWars/Entities/Button.swift @@ -6,24 +6,20 @@ // Copyright © 2020 SP2. All rights reserved. // -import Foundation import GameKit -class Button : GKEntity{ - let name : String +class Button: GKEntity{ + + let name: String var isEnabled = true init(name: String, iconName: String, text: String, position: CGPoint, onButtonPress: @escaping () -> ()) { self.name = name super.init() - self.addComponent(ButtonComponent(iconName: iconName, text: text,position: position, isEnabled: isEnabled, onButtonPress: onButtonPress)) + self.addComponent(ButtonComponent(iconName: iconName, text: text, position: position, isEnabled: isEnabled, onButtonPress: onButtonPress)) } - - - + required init?(coder: NSCoder) { fatalError("init(coder:) has not been implemented") } - - } diff --git a/GoldWars/GoldWars/Entities/EntityManager.swift b/GoldWars/GoldWars/Entities/EntityManager.swift index ab8f38e..0f7166c 100644 --- a/GoldWars/GoldWars/Entities/EntityManager.swift +++ b/GoldWars/GoldWars/Entities/EntityManager.swift @@ -6,7 +6,6 @@ // Copyright © 2020 SP2. All rights reserved. // -import Foundation import SpriteKit import GameplayKit @@ -14,7 +13,7 @@ class EntityManager { var entities = Set() let scene: SKScene - var isModal:Bool + var isModal: Bool init(scene: SKScene) { self.scene = scene @@ -61,9 +60,12 @@ class EntityManager { scene.addChild(node) } } - - + if let sliderNode = entity.component(ofType: SliderComponent.self)?.sliderNode { + scene.addChild(sliderNode.sliderKnob) + scene.addChild(sliderNode.sliderLine) + } } + func remove(_ entity: GKEntity) { if let spriteNode = entity.component(ofType: DefaultBaseComponent.self)?.spriteNode { spriteNode.removeFromParent() @@ -77,9 +79,26 @@ class EntityManager { modal.body.removeFromParent() modal.footer.removeFromParent() } + if let sliderNode = entity.component(ofType: SliderComponent.self)?.sliderNode { + sliderNode.sliderKnob.removeFromParent() + sliderNode.sliderLine.removeFromParent() + } entities.remove(entity) } + func update(_ entities: [GKEntity]){ + for entity in entities { + self.entities.update(with: entity) + let base = (entity as! Base) + + if base.changeOwnerShip { + base.addComponent(TeamComponent(team: (entities[0] as! Base).component(ofType: TeamComponent.self)!.team, position: (base.component(ofType: DefaultBaseComponent.self)?.spriteNode.position)!)) + base.changeOwnerShip = false + scene.addChild(base.component(ofType: TeamComponent.self)!.fire) + } + } + + } func getBaseByTeam(for team: Team) -> GKEntity? { for entity in entities { if let teamComponent = entity.component(ofType: TeamComponent.self), @@ -96,15 +115,28 @@ class EntityManager { return entities.filter{$0 is Base && ($0 as! Base).component(ofType: TeamComponent.self)?.team == team } as! Set } + func getTeamByBase(base: Base) -> Team? { + for entity in entities { + if entity is Base && entity == base{ + for component in entity.components{ + if component is TeamComponent { + return entity.component(ofType: TeamComponent.self)!.team + } + } + } + } + return nil + } + func getBackground() -> GKEntity? { return entities.filter{$0 is Background}[0] } - func getBaseNodeByTeam(for team: Team) -> SKSpriteNode?{ + func getBaseNodeByTeam(for team: Team) -> SKSpriteNode? { return getBaseByTeam(for: team)?.component(ofType: DefaultBaseComponent.self)?.spriteNode } - func getButtonByName(buttonName:String) -> Button{ + func getButtonByName(buttonName:String) -> Button { return entities.filter{$0 is Button && ($0 as! Button).name == buttonName }[0] as! Button } diff --git a/GoldWars/GoldWars/Entities/Modal.swift b/GoldWars/GoldWars/Entities/Modal.swift index 0d96a15..cdafa53 100644 --- a/GoldWars/GoldWars/Entities/Modal.swift +++ b/GoldWars/GoldWars/Entities/Modal.swift @@ -6,15 +6,15 @@ // Copyright © 2020 SP2. All rights reserved. // -import Foundation import GameplayKit -class Modal:GKEntity{ - +class Modal: GKEntity{ + var unitCount:Int + init(modaltype: ModalType, base: Base, anchorPoint: CGPoint) { + unitCount = base.unitCount super.init() - switch modaltype{ case .BaseDetails: addComponent(ModalBackgroundComponent(anchorPoint: anchorPoint)) @@ -22,8 +22,13 @@ class Modal:GKEntity{ body: "Diese Basis enthält \(base.unitCount) Einheiten", footer: "", anchorPoint: anchorPoint)) - default: - break + case .BaseAttack: + addComponent(ModalBackgroundComponent(anchorPoint: anchorPoint)) + addComponent(SliderComponent(width: 300, position: CGPoint(x: anchorPoint.x , y: anchorPoint.y - 80))) + addComponent(ModalContentComponent(header: "Angriff", + body: "Schicke \(unitCount / 2) Einheiten", + footer: "", + anchorPoint: anchorPoint)) } } diff --git a/GoldWars/GoldWars/Enums/ModalType.swift b/GoldWars/GoldWars/Enums/ModalType.swift index 3c98a25..40bcedf 100644 --- a/GoldWars/GoldWars/Enums/ModalType.swift +++ b/GoldWars/GoldWars/Enums/ModalType.swift @@ -6,8 +6,6 @@ // Copyright © 2020 SP2. All rights reserved. // -import Foundation - enum ModalType: String{ case BaseDetails case BaseAttack diff --git a/GoldWars/GoldWars/Partikels/Fire.sks b/GoldWars/GoldWars/Partikels/Fire.sks index 839f2ca..f25e78f 100644 Binary files a/GoldWars/GoldWars/Partikels/Fire.sks and b/GoldWars/GoldWars/Partikels/Fire.sks differ diff --git a/GoldWars/GoldWars/Scenes/GameScene.swift b/GoldWars/GoldWars/Scenes/GameScene.swift index f3c7ddf..b306854 100644 --- a/GoldWars/GoldWars/Scenes/GameScene.swift +++ b/GoldWars/GoldWars/Scenes/GameScene.swift @@ -28,17 +28,37 @@ class GameScene: SKScene{ } override func touchesEnded(_ touches: Set, with event: UIEvent?) { - guard let touch = touches.first else { return } let touchLocation = touch.location(in: self) - if !isMoveTouch { + if isMoveTouch{ + isMoveTouch = false + currentDraggedBase!.component(ofType: DefaultBaseComponent.self)?.spriteNode.position = currentDraggedBasePos + currentDraggedBase!.component(ofType: TeamComponent.self)?.fire.position = currentDraggedBasePos + for base in currentDraggedBase!.adjacencyList { + 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, + base: currentDraggedBase!, + anchorPoint: CGPoint(x: self.size.width / 2 , y: self.size.height / 2))) + entityManager.update((currentDraggedBase?.attackBase(base: base, units: 100))!) + }else { + entityManager.add(Modal(modaltype: .BaseAttack, + base: currentDraggedBase!, + anchorPoint: CGPoint(x: self.size.width / 2 , y: self.size.height / 2))) + } + + } + } + } + else { for entity in entityManager.entities { - let spriteNode = entity.component(ofType: DefaultBaseComponent.self)?.spriteNode if entityManager.isModal && entity.isMember(of: Modal.self) { @@ -48,7 +68,6 @@ class GameScene: SKScene{ child.alpha = 1 } } - } if atPoint(touchLocation) == spriteNode && !entityManager.isModal { @@ -58,7 +77,6 @@ class GameScene: SKScene{ if(child.name != "fire"){ child.alpha = 0.3 } - } entityManager.add(Modal(modaltype: .BaseDetails, base: entity as! Base, @@ -67,14 +85,6 @@ class GameScene: SKScene{ } } } - else { - isMoveTouch = false - currentDraggedBase!.component(ofType: DefaultBaseComponent.self)?.spriteNode.position = currentDraggedBasePos - currentDraggedBase!.component(ofType: TeamComponent.self)?.fire.position = currentDraggedBasePos - } - } - - override func touchesBegan(_ touches: Set, with event: UIEvent?) { } @@ -84,6 +94,17 @@ class GameScene: SKScene{ } let touchLocation = touch.location(in: self) + for child in children { + if atPoint(touchLocation) == child { + child.touchesMoved(touches, with: event) + } + } + + for e in entityManager.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.getBasesByTeam(for: .team1) for base in bases { @@ -91,7 +112,6 @@ class GameScene: SKScene{ if !isMoveTouch { currentDraggedBasePos = base.component(ofType: DefaultBaseComponent.self)!.spriteNode.position currentDraggedBase = base - } isMoveTouch = true @@ -106,11 +126,6 @@ class GameScene: SKScene{ } } } - - - - - } override func update(_ currentTime: TimeInterval) {