Merge branch '33-basisownership-anhand-des-gkplayers' into 'development'

Resolve "Basisownership anhand des GKPlayers"

Closes #33

See merge request marcel.schwarz/software-projekt-2!54
This commit is contained in:
Marcel Schwarz 2020-05-09 16:39:03 +00:00
commit 3f73a6f64d
31 changed files with 520 additions and 503 deletions

View File

@ -10,24 +10,24 @@ import GameplayKit
class AtkBoostSkillComponent: GKComponent{ class AtkBoostSkillComponent: GKComponent{
let shapeNode: SKShapeNode let shapeNode: SKShapeNode
let labelNode: SKLabelNode let labelNode: SKLabelNode
init(text: String, texture: SKTexture?, anchorPoint: CGPoint) { init(text: String, texture: SKTexture?, anchorPoint: CGPoint) {
self.labelNode = SKLabelNode(text: text) self.labelNode = SKLabelNode(text: text)
self.shapeNode = SKShapeNode(circleOfRadius: 30) self.shapeNode = SKShapeNode(circleOfRadius: 30)
self.shapeNode.position = anchorPoint self.shapeNode.position = anchorPoint
self.labelNode.position = CGPoint(x: anchorPoint.x, y: anchorPoint.y - 15) self.labelNode.position = CGPoint(x: anchorPoint.x, y: anchorPoint.y - 15)
if texture != nil { if texture != nil {
shapeNode.fillTexture = texture shapeNode.fillTexture = texture
}else { }else {
shapeNode.fillColor = SKColor.gray shapeNode.fillColor = SKColor.gray
} }
super.init() super.init()
} }
required init?(coder: NSCoder) { required init?(coder: NSCoder) {
fatalError("init(coder:) has not been implemented") fatalError("init(coder:) has not been implemented")
} }
} }

View File

@ -24,7 +24,7 @@ class BackgroundComponent: GKComponent{
nodes.append(sky) nodes.append(sky)
} }
super.init() super.init()
} }
func update(){ func update(){
for node in nodes{ for node in nodes{

View File

@ -10,25 +10,25 @@ import SpriteKit
class BaseNode: SKSpriteNode{ class BaseNode: SKSpriteNode{
override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) { override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
// TODO: PopUp Einheiten + Close PopUp // TODO: PopUp Einheiten + Close PopUp
self.run( self.run(
SKAction.sequence( 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<UITouch>, with event: UIEvent?) { override func touchesMoved(_ touches: Set<UITouch>, with event: UIEvent?) {
// TODO: zeige Angirff Effect // TODO: zeige Angirff Effect
} }
override func touchesEnded(_ touches: Set<UITouch>, with event: UIEvent?) { override func touchesEnded(_ touches: Set<UITouch>, with event: UIEvent?) {
// TODO: Open Slider PopUp // TODO: Open Slider PopUp
} }
} }

View File

@ -18,7 +18,7 @@ class ButtonNode: SKSpriteNode {
} else { } else {
self.alpha = 0.3 self.alpha = 0.3
self.childNode(withName: "label")?.alpha = 0.3 self.childNode(withName: "label")?.alpha = 0.3
} }
} }
} }
@ -50,26 +50,26 @@ class ButtonNode: SKSpriteNode {
} }
self.addChild(label) self.addChild(label)
isUserInteractionEnabled = true isUserInteractionEnabled = true
}
override func touchesBegan(_ touches: Set<UITouch>, 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()
} }
}
override func touchesBegan(_ touches: Set<UITouch>, 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()
}
}
required init?(coder aDecoder: NSCoder) { required init?(coder aDecoder: NSCoder) {
fatalError("init(coder:) has not been implemented") fatalError("init(coder:) has not been implemented")
} }
} }

View File

@ -10,24 +10,24 @@ import GameplayKit
class DefBoostSkillComponent: GKComponent{ class DefBoostSkillComponent: GKComponent{
let shapeNode: SKShapeNode let shapeNode: SKShapeNode
let labelNode: SKLabelNode let labelNode: SKLabelNode
init(text: String, texture: SKTexture?, anchorPoint: CGPoint) { init(text: String, texture: SKTexture?, anchorPoint: CGPoint) {
self.labelNode = SKLabelNode(text: text) self.labelNode = SKLabelNode(text: text)
self.shapeNode = SKShapeNode(circleOfRadius: 30) self.shapeNode = SKShapeNode(circleOfRadius: 30)
self.shapeNode.position = anchorPoint self.shapeNode.position = anchorPoint
self.labelNode.position = CGPoint(x: anchorPoint.x, y: anchorPoint.y - 15) self.labelNode.position = CGPoint(x: anchorPoint.x, y: anchorPoint.y - 15)
if texture != nil { if texture != nil {
shapeNode.fillTexture = texture shapeNode.fillTexture = texture
}else { }else {
shapeNode.fillColor = SKColor.gray shapeNode.fillColor = SKColor.gray
} }
super.init() super.init()
} }
required init?(coder: NSCoder) { required init?(coder: NSCoder) {
fatalError("init(coder:) has not been implemented") fatalError("init(coder:) has not been implemented")
} }
} }

View File

@ -10,15 +10,15 @@ import GameplayKit
import SpriteKit import SpriteKit
class DefaultBaseComponent: GKComponent { class DefaultBaseComponent: GKComponent {
var spriteNode: BaseNode var spriteNode: BaseNode
init(texture: SKTexture, position: CGPoint) { init(texture: SKTexture, position: CGPoint) {
spriteNode = BaseNode(texture: texture, size: CGSize(width: 80, height: 80)) spriteNode = BaseNode(texture: texture, size: CGSize(width: 80, height: 80))
spriteNode.position = position spriteNode.position = position
super.init() super.init()
} }
required init?(coder aDecoder: NSCoder) { required init?(coder aDecoder: NSCoder) {
fatalError("init(coder:) has not been implemented") fatalError("init(coder:) has not been implemented")
} }
} }

View File

@ -10,17 +10,17 @@ import GameplayKit
import SpriteKit import SpriteKit
class ModalBackgroundComponent: GKComponent { class ModalBackgroundComponent: GKComponent {
let spriteNode: SKSpriteNode let spriteNode: SKSpriteNode
init(anchorPoint: CGPoint) { init(anchorPoint: CGPoint) {
let texture = SKTexture(imageNamed:"ModalBackground") let texture = SKTexture(imageNamed:"ModalBackground")
spriteNode = SKSpriteNode(texture: texture, size: texture.size()) spriteNode = SKSpriteNode(texture: texture, size: texture.size())
spriteNode.setScale(2) spriteNode.setScale(2)
spriteNode.position = anchorPoint spriteNode.position = anchorPoint
super.init() super.init()
} }
required init?(coder aDecoder: NSCoder) { required init?(coder aDecoder: NSCoder) {
fatalError("init(coder:) has not been implemented") fatalError("init(coder:) has not been implemented")
} }
} }

View File

@ -11,32 +11,32 @@ import SpriteKit
class ModalContentComponent: GKComponent{ class ModalContentComponent: GKComponent{
var header: SKLabelNode var header: SKLabelNode
var body: SKLabelNode var body: SKLabelNode
var footer: SKLabelNode var footer: SKLabelNode
init(header: String, body: String, footer: String , anchorPoint: CGPoint) { init(header: String, body: String, footer: String , anchorPoint: CGPoint) {
self.header = SKLabelNode(text: header) self.header = SKLabelNode(text: header)
self.header.position = CGPoint(x: anchorPoint.x, y: anchorPoint.y + 125) self.header.position = CGPoint(x: anchorPoint.x, y: anchorPoint.y + 125)
self.header.fontName = "HelveticaNeue-Bold" self.header.fontName = "HelveticaNeue-Bold"
self.header.fontSize = 40 self.header.fontSize = 40
self.body = SKLabelNode(text: body) self.body = SKLabelNode(text: body)
self.body.position = CGPoint(x: anchorPoint.x, y: anchorPoint.y - 20) self.body.position = CGPoint(x: anchorPoint.x, y: anchorPoint.y - 20)
self.body.numberOfLines = 2 self.body.numberOfLines = 2
self.body.preferredMaxLayoutWidth = 390 self.body.preferredMaxLayoutWidth = 390
self.body.horizontalAlignmentMode = SKLabelHorizontalAlignmentMode.center self.body.horizontalAlignmentMode = SKLabelHorizontalAlignmentMode.center
self.body.fontName = "HelveticaNeue-Bold" self.body.fontName = "HelveticaNeue-Bold"
self.body.fontSize = 40 self.body.fontSize = 40
self.footer = SKLabelNode(text: footer) self.footer = SKLabelNode(text: footer)
self.footer.position = CGPoint(x: anchorPoint.x, y: anchorPoint.y - 40) self.footer.position = CGPoint(x: anchorPoint.x, y: anchorPoint.y - 40)
self.footer.fontName = "HelveticaNeue-Bold" self.footer.fontName = "HelveticaNeue-Bold"
self.footer.fontSize = 40 self.footer.fontSize = 40
super.init() super.init()
} }
required init?(coder aDecoder: NSCoder) { required init?(coder aDecoder: NSCoder) {
fatalError("init(coder:) has not been implemented") fatalError("init(coder:) has not been implemented")
} }
} }

View File

@ -10,14 +10,14 @@ import GameplayKit
class SliderComponent: GKComponent { class SliderComponent: GKComponent {
var sliderNode: SliderNode var sliderNode: SliderNode
init(width: CGFloat, position: CGPoint) { init(width: CGFloat, position: CGPoint) {
sliderNode = SliderNode(width: width, position: position) sliderNode = SliderNode(width: width, position: position)
super.init() super.init()
} }
required init?(coder: NSCoder) { required init?(coder: NSCoder) {
fatalError("init(coder:) has not been implemented") fatalError("init(coder:) has not been implemented")
} }
} }

View File

@ -11,56 +11,56 @@ import SpriteKit
class SliderNode :SKNode { class SliderNode :SKNode {
var sliderLine :SKShapeNode var sliderLine :SKShapeNode
var sliderKnob :SliderKnob var sliderKnob :SliderKnob
var width: CGFloat var width: CGFloat
var getValue: CGFloat{ var getValue: CGFloat{
get{ get{
return ((sliderKnob.position.x.rounded() - sliderKnob.min) / width) return ((sliderKnob.position.x.rounded() - sliderKnob.min) / width)
} }
} }
init(width: CGFloat, position: CGPoint) { init(width: CGFloat, position: CGPoint) {
self.width = width self.width = width
sliderLine = SKShapeNode(rectOf: CGSize(width: width, height: 8)) sliderLine = SKShapeNode(rectOf: CGSize(width: width, height: 8))
sliderLine.position = position sliderLine.position = position
sliderLine.fillColor = SKColor.white sliderLine.fillColor = SKColor.white
sliderKnob = SliderKnob(circleOfRadius: 20) sliderKnob = SliderKnob(circleOfRadius: 20)
sliderKnob.min = position.x - width / 2 sliderKnob.min = position.x - width / 2
sliderKnob.max = position.x + width / 2 sliderKnob.max = position.x + width / 2
sliderKnob.fillColor = SKColor.red sliderKnob.fillColor = SKColor.red
sliderKnob.zPosition = sliderLine.zPosition + 1 sliderKnob.zPosition = sliderLine.zPosition + 1
sliderKnob.position = CGPoint(x: sliderLine.position.x, y: sliderLine.position.y + 1) sliderKnob.position = CGPoint(x: sliderLine.position.x, y: sliderLine.position.y + 1)
super.init() super.init()
} }
required init?(coder aDecoder: NSCoder) { required init?(coder aDecoder: NSCoder) {
fatalError("init(coder:) has not been implemented") fatalError("init(coder:) has not been implemented")
} }
} }
class SliderKnob: SKShapeNode { class SliderKnob: SKShapeNode {
var min = CGFloat() var min = CGFloat()
var max = CGFloat() var max = CGFloat()
override func touchesMoved(_ touches: Set<UITouch>, with event: UIEvent?) { override func touchesMoved(_ touches: Set<UITouch>, with event: UIEvent?) {
for touch in touches { for touch in touches {
let touchLocation = touch.location(in: self.scene!) let touchLocation = touch.location(in: self.scene!)
if self.position.x >= min - 1 && self.position.x <= max + 1{ if self.position.x >= min - 1 && self.position.x <= max + 1{
self.position.x = touchLocation.x self.position.x = touchLocation.x
} }
if(self.position.x <= min){ if(self.position.x <= min){
self.position.x = min self.position.x = min
} }
if(self.position.x >= max){ if(self.position.x >= max){
self.position.x = max self.position.x = max
} }
} }
} }
} }

View File

@ -10,25 +10,25 @@ import GameplayKit
class SpySkillComponent: GKComponent{ class SpySkillComponent: GKComponent{
let shapeNode: SKShapeNode let shapeNode: SKShapeNode
let labelNode: SKLabelNode let labelNode: SKLabelNode
init(text: String, texture: SKTexture?, anchorPoint: CGPoint) { init(text: String, texture: SKTexture?, anchorPoint: CGPoint) {
self.labelNode = SKLabelNode(text: text) self.labelNode = SKLabelNode(text: text)
self.shapeNode = SKShapeNode(circleOfRadius: 30) self.shapeNode = SKShapeNode(circleOfRadius: 30)
self.shapeNode.position = anchorPoint self.shapeNode.position = anchorPoint
self.labelNode.position = CGPoint(x: anchorPoint.x, y: anchorPoint.y - 15) self.labelNode.position = CGPoint(x: anchorPoint.x, y: anchorPoint.y - 15)
if texture != nil { if texture != nil {
shapeNode.fillTexture = texture shapeNode.fillTexture = texture
}else { }else {
shapeNode.fillColor = SKColor.gray shapeNode.fillColor = SKColor.gray
} }
super.init() super.init()
} }
required init?(coder: NSCoder) { required init?(coder: NSCoder) {
fatalError("init(coder:) has not been implemented") fatalError("init(coder:) has not been implemented")
} }
} }

View File

@ -11,22 +11,22 @@ import GameplayKit
class TeamComponent: GKComponent { class TeamComponent: GKComponent {
let team: Team let team: Team
let fire: SKEmitterNode let fire: SKEmitterNode
init(team: Team, position: CGPoint) { init(team: Team, position: CGPoint) {
fire = SKEmitterNode(fileNamed: "Fire")! fire = SKEmitterNode(fileNamed: "Fire")!
fire.zPosition = -1 fire.zPosition = -1
fire.position = position fire.position = position
fire.name = "fire" fire.name = "fire"
fire.particleColorSequence = nil fire.particleColorSequence = nil
fire.particleColorBlendFactor = 1.0 fire.particleColorBlendFactor = 1.0
switch team { switch team {
case .team1: fire.particleColor = SKColor.red case .team1: fire.particleColor = SKColor.red
case .team2: fire.particleColor = SKColor.purple case .team2: fire.particleColor = SKColor.purple
case .team3: fire.particleColor = SKColor.green case .team3: fire.particleColor = SKColor.green
case .team4: fire.particleColor = SKColor.gray case .team4: fire.particleColor = SKColor.gray
} }
self.team = team self.team = team
super.init() super.init()

View File

@ -14,7 +14,7 @@ class TimerComponent: GKComponent {
var endTime :Date! var endTime :Date!
var duration :Double var duration :Double
init(text: String, anchorPoint: CGPoint, duration: TimeInterval) { init(text: String, anchorPoint: CGPoint, duration: TimeInterval) {
self.labelNode = SKLabelNode(text: text) self.labelNode = SKLabelNode(text: text)
self.labelNode.fontColor = UIColor.black self.labelNode.fontColor = UIColor.black
self.labelNode.fontSize = CGFloat(45) self.labelNode.fontSize = CGFloat(45)

View File

@ -16,7 +16,7 @@ class Background: GKEntity {
} }
override func update(deltaTime seconds: TimeInterval) { override func update(deltaTime seconds: TimeInterval) {
component(ofType: BackgroundComponent.self)?.update() component(ofType: BackgroundComponent.self)?.update()
} }
required init?(coder: NSCoder) { required init?(coder: NSCoder) {

View File

@ -8,17 +8,20 @@
import SpriteKit import SpriteKit
import GameplayKit import GameplayKit
import GameKit
class Base: GKEntity { class Base: GKEntity {
var unitCount: Int var unitCount: Int
var adjacencyList: Array<Base> var adjacencyList: Array<Base>
var changeOwnerShip: Bool var changeOwnerShip: Bool
var ownerShipPlayer: GKPlayer?
init(position: CGPoint, team: Team! = nil) { init(position: CGPoint, player: GKPlayer? = nil, team: Team? = nil) {
self.unitCount = 0 self.unitCount = 0
self.adjacencyList = [Base]() self.adjacencyList = [Base]()
self.changeOwnerShip = false self.changeOwnerShip = false
self.ownerShipPlayer = player
super.init() super.init()
addComponent(DefaultBaseComponent(texture: SKTexture(imageNamed: "Base"), position: position)) addComponent(DefaultBaseComponent(texture: SKTexture(imageNamed: "Base"), position: position))
@ -28,12 +31,13 @@ class Base: GKEntity {
} }
} }
func attackBase(base: Base, units:Int) -> [GKEntity]{ func attackBase(base: Base, units:Int) -> [GKEntity]{
base.changeOwnerShip = true base.changeOwnerShip = true
self.unitCount -= units base.ownerShipPlayer = self.ownerShipPlayer
base.unitCount += units self.unitCount -= units
return [self, base] base.unitCount += units
} return [self, base]
}
required init?(coder: NSCoder) { required init?(coder: NSCoder) {
fatalError("init(coder:) has not been implemented") fatalError("init(coder:) has not been implemented")

View File

@ -13,42 +13,42 @@ class EntityManager {
var entities = Set<GKEntity>() var entities = Set<GKEntity>()
let scene: SKScene let scene: SKScene
var isModal: Bool var isModal: Bool
init(scene: SKScene) { init(scene: SKScene) {
self.scene = scene self.scene = scene
isModal = false isModal = false
} }
func add(_ entity: GKEntity) { func add(_ entity: GKEntity) {
entities.insert(entity) entities.insert(entity)
if let spriteNode = entity.component(ofType: DefaultBaseComponent.self)?.spriteNode { if let spriteNode = entity.component(ofType: DefaultBaseComponent.self)?.spriteNode {
scene.addChild(spriteNode) scene.addChild(spriteNode)
} }
if let fire = entity.component(ofType: TeamComponent.self)?.fire{ if let fire = entity.component(ofType: TeamComponent.self)?.fire{
scene.addChild(fire) scene.addChild(fire)
} }
if let spriteNode = entity.component(ofType: ModalBackgroundComponent.self)?.spriteNode { if let spriteNode = entity.component(ofType: ModalBackgroundComponent.self)?.spriteNode {
scene.addChild(spriteNode) scene.addChild(spriteNode)
isModal = true isModal = true
} }
if let modal = entity.component(ofType: ModalContentComponent.self) { if let modal = entity.component(ofType: ModalContentComponent.self) {
scene.addChild(modal.header) scene.addChild(modal.header)
scene.addChild(modal.body) scene.addChild(modal.body)
scene.addChild(modal.footer) scene.addChild(modal.footer)
} }
if let skill = entity.component(ofType: AtkBoostSkillComponent.self) { if let skill = entity.component(ofType: AtkBoostSkillComponent.self) {
scene.addChild(skill.shapeNode) scene.addChild(skill.shapeNode)
scene.addChild(skill.labelNode) scene.addChild(skill.labelNode)
} }
if let skill = entity.component(ofType: DefBoostSkillComponent.self) { if let skill = entity.component(ofType: DefBoostSkillComponent.self) {
scene.addChild(skill.shapeNode) scene.addChild(skill.shapeNode)
scene.addChild(skill.labelNode) scene.addChild(skill.labelNode)
} }
if let skill = entity.component(ofType: SpySkillComponent.self) { if let skill = entity.component(ofType: SpySkillComponent.self) {
scene.addChild(skill.shapeNode) scene.addChild(skill.shapeNode)
scene.addChild(skill.labelNode) scene.addChild(skill.labelNode)
} }
if let timer = entity.component(ofType: TimerComponent.self) { if let timer = entity.component(ofType: TimerComponent.self) {
scene.addChild(timer.labelNode) scene.addChild(timer.labelNode)
} }
@ -60,81 +60,81 @@ class EntityManager {
scene.addChild(node) scene.addChild(node)
} }
} }
if let sliderNode = entity.component(ofType: SliderComponent.self)?.sliderNode { if let sliderNode = entity.component(ofType: SliderComponent.self)?.sliderNode {
scene.addChild(sliderNode.sliderKnob) scene.addChild(sliderNode.sliderKnob)
scene.addChild(sliderNode.sliderLine) scene.addChild(sliderNode.sliderLine)
} }
} }
func remove(_ entity: GKEntity) { func remove(_ entity: GKEntity) {
if let spriteNode = entity.component(ofType: DefaultBaseComponent.self)?.spriteNode { if let spriteNode = entity.component(ofType: DefaultBaseComponent.self)?.spriteNode {
spriteNode.removeFromParent() spriteNode.removeFromParent()
} }
if let spriteNode = entity.component(ofType: ModalBackgroundComponent.self)?.spriteNode { if let spriteNode = entity.component(ofType: ModalBackgroundComponent.self)?.spriteNode {
spriteNode.removeFromParent() spriteNode.removeFromParent()
isModal = false isModal = false
} }
if let modal = entity.component(ofType: ModalContentComponent.self) { if let modal = entity.component(ofType: ModalContentComponent.self) {
modal.header.removeFromParent() modal.header.removeFromParent()
modal.body.removeFromParent() modal.body.removeFromParent()
modal.footer.removeFromParent() modal.footer.removeFromParent()
} }
if let sliderNode = entity.component(ofType: SliderComponent.self)?.sliderNode { if let sliderNode = entity.component(ofType: SliderComponent.self)?.sliderNode {
sliderNode.sliderKnob.removeFromParent() sliderNode.sliderKnob.removeFromParent()
sliderNode.sliderLine.removeFromParent() sliderNode.sliderLine.removeFromParent()
} }
entities.remove(entity) entities.remove(entity)
} }
func update(_ entities: [GKEntity]){ func update(_ entities: [GKEntity]){
for entity in entities { for entity in entities {
self.entities.update(with: entity) self.entities.update(with: entity)
let base = (entity as! Base) let base = (entity as! Base)
if base.changeOwnerShip { 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.addComponent(TeamComponent(team: (entities[0] as! Base).component(ofType: TeamComponent.self)!.team, position: (base.component(ofType: DefaultBaseComponent.self)?.spriteNode.position)!))
base.changeOwnerShip = false base.changeOwnerShip = false
scene.addChild(base.component(ofType: TeamComponent.self)!.fire) scene.addChild(base.component(ofType: TeamComponent.self)!.fire)
} }
} }
} }
func getBaseByTeam(for team: Team) -> GKEntity? { func getBaseByTeam(for team: Team) -> GKEntity? {
for entity in entities { for entity in entities {
if let teamComponent = entity.component(ofType: TeamComponent.self), if let teamComponent = entity.component(ofType: TeamComponent.self),
let _ = entity.component(ofType: DefaultBaseComponent.self) { let _ = entity.component(ofType: DefaultBaseComponent.self) {
if teamComponent.team == team { if teamComponent.team == team {
return entity return entity
} }
} }
} }
return nil return nil
} }
func getBasesByTeam(for team: Team) -> Set<Base> { func getBasesByTeam(for team: Team) -> Set<Base> {
return entities.filter{$0 is Base && ($0 as! Base).component(ofType: TeamComponent.self)?.team == team } as! Set<Base> return entities.filter{$0 is Base && ($0 as! Base).component(ofType: TeamComponent.self)?.team == team } as! Set<Base>
} }
func getTeamByBase(base: Base) -> Team? { func getTeamByBase(base: Base) -> Team? {
for entity in entities { for entity in entities {
if entity is Base && entity == base{ if entity is Base && entity == base{
for component in entity.components{ for component in entity.components{
if component is TeamComponent { if component is TeamComponent {
return entity.component(ofType: TeamComponent.self)!.team return entity.component(ofType: TeamComponent.self)!.team
} }
} }
} }
} }
return nil return nil
} }
func getBackground() -> GKEntity? { func getBackground() -> GKEntity? {
return entities.filter{$0 is Background}[0] 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 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 return entities.filter{$0 is Button && ($0 as! Button).name == buttonName }[0] as! Button

View File

@ -10,28 +10,28 @@ import GameplayKit
class HUD: GKEntity { class HUD: GKEntity {
init(size: CGSize) { init(size: CGSize) {
super.init() super.init()
addComponent(SpySkillComponent(text: "Spy", addComponent(SpySkillComponent(text: "Spy",
texture: nil, texture: nil,
anchorPoint: CGPoint(x: size.width * 0.75, y: size.height * 0.1))) anchorPoint: CGPoint(x: size.width * 0.75, y: size.height * 0.1)))
addComponent(AtkBoostSkillComponent(text: "Atk", addComponent(AtkBoostSkillComponent(text: "Atk",
texture: nil, texture: nil,
anchorPoint: CGPoint(x: size.width * 0.85, y: size.height * 0.1))) anchorPoint: CGPoint(x: size.width * 0.85, y: size.height * 0.1)))
addComponent(DefBoostSkillComponent(text: "Def", addComponent(DefBoostSkillComponent(text: "Def",
texture: nil, texture: nil,
anchorPoint: CGPoint(x: size.width * 0.95, y: size.height * 0.1))) anchorPoint: CGPoint(x: size.width * 0.95, y: size.height * 0.1)))
addComponent(TimerComponent(text: "", addComponent(TimerComponent(text: "",
anchorPoint: CGPoint(x: size.width * 0.5, y: size.height * 0.9), duration: 30)) anchorPoint: CGPoint(x: size.width * 0.5, y: size.height * 0.9), duration: 30))
} }
required init?(coder: NSCoder) { required init?(coder: NSCoder) {
fatalError("init(coder:) has not been implemented") fatalError("init(coder:) has not been implemented")
} }
} }

View File

@ -10,30 +10,40 @@ import GameplayKit
class Modal: GKEntity{ class Modal: GKEntity{
var unitCount:Int var unitCount:Int
init(modaltype: ModalType, base: Base, anchorPoint: CGPoint) { init(modaltype: ModalType, base: Base, anchorPoint: CGPoint) {
unitCount = base.unitCount unitCount = base.unitCount
super.init() super.init()
switch modaltype{ switch modaltype{
case .BaseDetails: case .BaseDetails:
addComponent(ModalBackgroundComponent(anchorPoint: anchorPoint)) addComponent(ModalBackgroundComponent(anchorPoint: anchorPoint))
addComponent(ModalContentComponent(header: "Basis Information", addComponent(ModalContentComponent(
body: "Diese Basis enthält \(base.unitCount) Einheiten", header: "Basis Information",
footer: "", body: "Diese Basis enthält \(base.unitCount) Einheiten",
anchorPoint: anchorPoint)) footer: "",
case .BaseAttack: anchorPoint: anchorPoint
addComponent(ModalBackgroundComponent(anchorPoint: anchorPoint)) )
addComponent(SliderComponent(width: 300, position: CGPoint(x: anchorPoint.x , y: anchorPoint.y - 80))) )
addComponent(ModalContentComponent(header: "Angriff", case .BaseAttack:
body: "Schicke \(unitCount / 2) Einheiten", addComponent(ModalBackgroundComponent(anchorPoint: anchorPoint))
footer: "", addComponent(SliderComponent(
anchorPoint: anchorPoint)) width: 300,
} position: CGPoint(x: anchorPoint.x , y: anchorPoint.y - 80)
} )
)
addComponent(ModalContentComponent(
header: "Angriff",
body: "Schicke \(unitCount / 2) Einheiten",
footer: "",
anchorPoint: anchorPoint
)
)
}
}
required init?(coder: NSCoder) { required init?(coder: NSCoder) {
fatalError("init(coder:) has not been implemented") fatalError("init(coder:) has not been implemented")
} }
} }

View File

@ -7,6 +7,6 @@
// //
enum ModalType: String{ enum ModalType: String{
case BaseDetails case BaseDetails
case BaseAttack case BaseAttack
} }

View File

@ -16,7 +16,7 @@ final class GameCenterHelper: NSObject {
var viewController: UIViewController? var viewController: UIViewController?
static var isAuthenticated: Bool { static var isAuthenticated: Bool {
return GKLocalPlayer.local.isAuthenticated return GKLocalPlayer.local.isAuthenticated
} }
override init() { override init() {
@ -24,7 +24,7 @@ final class GameCenterHelper: NSObject {
GKLocalPlayer.local.authenticateHandler = { gcAuthVC, error in GKLocalPlayer.local.authenticateHandler = { gcAuthVC, error in
NotificationCenter.default NotificationCenter.default
.post(name: .authenticationChanged, object: GKLocalPlayer.local.isAuthenticated) .post(name: .authenticationChanged, object: GKLocalPlayer.local.isAuthenticated)
if GKLocalPlayer.local.isAuthenticated { if GKLocalPlayer.local.isAuthenticated {
print("Authenticated to Game Center!") print("Authenticated to Game Center!")

View File

@ -23,9 +23,9 @@ class GameViewController: UIViewController {
view.showsFPS = true view.showsFPS = true
view.showsNodeCount = true view.showsNodeCount = true
GameCenterHelper.helper.viewController = self GameCenterHelper.helper.viewController = self
MatchmakingHelper.sharedInstance.viewController = self MatchmakingHelper.sharedInstance.viewController = self
} }
} }
override var shouldAutorotate: Bool { override var shouldAutorotate: Bool {

View File

@ -8,6 +8,7 @@
import Foundation import Foundation
import SpriteKit import SpriteKit
import GameKit
class TwoPlayerDefaultTestMap: MapProtocol { class TwoPlayerDefaultTestMap: MapProtocol {
@ -24,6 +25,8 @@ class TwoPlayerDefaultTestMap: MapProtocol {
// Create Bases // Create Bases
let basePlayerOne = Base( let basePlayerOne = Base(
position: CGPoint(x: self.size.width * 0.1, y: self.size.height / 2), position: CGPoint(x: self.size.width * 0.1, y: self.size.height / 2),
// ToDo: not final version. Better would be something like MatchmakingHelper.spieler1 but does not work yet
player: GKLocalPlayer.local,
team: .team1 team: .team1
) )

View File

@ -72,15 +72,15 @@ class MatchmakingHelper: NSObject, GKMatchmakerViewControllerDelegate, GKMatchDe
/* /*
Der User hat die Verbindung mit "Abbrechen" unterbrochen. GameCenter MatchMaking wird beendet. Der User hat die Verbindung mit "Abbrechen" unterbrochen. GameCenter MatchMaking wird beendet.
*/ */
func matchmakerViewControllerWasCancelled(_ viewController: GKMatchmakerViewController) { func matchmakerViewControllerWasCancelled(_ viewController: GKMatchmakerViewController) {
viewController.dismiss(animated: true, completion: nil) viewController.dismiss(animated: true, completion: nil)
delegate?.matchEnded() delegate?.matchEnded()
} }
/* /*
Wenn GameCenter kein match erstellen kann, wird der viewcontroller dismissed. Wenn GameCenter kein match erstellen kann, wird der viewcontroller dismissed.
*/ */
func matchmakerViewController(_ viewController: GKMatchmakerViewController, didFailWithError error: Error) { func matchmakerViewController(_ viewController: GKMatchmakerViewController, didFailWithError error: Error) {
viewController.dismiss(animated: true, completion: nil) viewController.dismiss(animated: true, completion: nil)
print("Error finding match", error.localizedDescription) print("Error finding match", error.localizedDescription)
@ -91,7 +91,7 @@ class MatchmakingHelper: NSObject, GKMatchmakerViewControllerDelegate, GKMatchDe
Gamecenter hat erfolgreich ein Match gefunden, das Spiel kann gestartet werden. Gamecenter hat erfolgreich ein Match gefunden, das Spiel kann gestartet werden.
expectedPlayerCount: Die verbleibende Anzahl von Spielern, die sich noch nicht mit dem Spiel verbunden haben expectedPlayerCount: Die verbleibende Anzahl von Spielern, die sich noch nicht mit dem Spiel verbunden haben
z.B 0 gibt an, dass keine weiteren Spieler benötigt werden um das Match zu starten z.B 0 gibt an, dass keine weiteren Spieler benötigt werden um das Match zu starten
*/ */
func matchmakerViewController(_ viewController: GKMatchmakerViewController, didFind match: GKMatch) { func matchmakerViewController(_ viewController: GKMatchmakerViewController, didFind match: GKMatch) {
viewController.dismiss(animated: true, completion: nil) viewController.dismiss(animated: true, completion: nil)
mpMatch = match mpMatch = match
@ -102,8 +102,8 @@ class MatchmakingHelper: NSObject, GKMatchmakerViewControllerDelegate, GKMatchDe
} }
/* /*
Vom match erhaltene Spielerdaten Vom match erhaltene Spielerdaten
*/ */
private func match(match: GKMatch!, didReceiveData data: NSData!,fromPlayer playerID: String!) { private func match(match: GKMatch!, didReceiveData data: NSData!,fromPlayer playerID: String!) {
if mpMatch != match { return } if mpMatch != match { return }
delegate?.matchReceivedData(match: match, data: data, fromPlayer: playerID) delegate?.matchReceivedData(match: match, data: data, fromPlayer: playerID)
@ -143,8 +143,8 @@ class MatchmakingHelper: NSObject, GKMatchmakerViewControllerDelegate, GKMatchDe
} }
/* /*
Ein Spieler wird als Host für das Match gewählt. Dieser ist Spieler 1. Im Anschluss wird die GameScene geladen. Ein Spieler wird als Host für das Match gewählt. Dieser ist Spieler 1. Im Anschluss wird die GameScene geladen.
*/ */
func startMatch() { func startMatch() {
mpMatch!.chooseBestHostingPlayer(completionHandler: { mpMatch!.chooseBestHostingPlayer(completionHandler: {

View File

@ -34,29 +34,29 @@ class GameScene: SKScene{
let touchLocation = touch.location(in: self) let touchLocation = touch.location(in: self)
if isMoveTouch{ if isMoveTouch{
isMoveTouch = false isMoveTouch = false
currentDraggedBase!.component(ofType: DefaultBaseComponent.self)?.spriteNode.position = currentDraggedBasePos currentDraggedBase!.component(ofType: DefaultBaseComponent.self)?.spriteNode.position = currentDraggedBasePos
currentDraggedBase!.component(ofType: TeamComponent.self)?.fire.position = currentDraggedBasePos currentDraggedBase!.component(ofType: TeamComponent.self)?.fire.position = currentDraggedBasePos
for base in currentDraggedBase!.adjacencyList { for base in currentDraggedBase!.adjacencyList {
if atPoint(touchLocation) == base.component(ofType: DefaultBaseComponent.self)?.spriteNode { if atPoint(touchLocation) == base.component(ofType: DefaultBaseComponent.self)?.spriteNode {
// TODO: change interaction based on collision instead of touchlocation // TODO: change interaction based on collision instead of touchlocation
if !(entityManager.getTeamByBase(base: currentDraggedBase!) == entityManager.getTeamByBase(base: base)){ if !(entityManager.getTeamByBase(base: currentDraggedBase!) == entityManager.getTeamByBase(base: base)){
entityManager.add(Modal(modaltype: .BaseAttack, entityManager.add(Modal(modaltype: .BaseAttack,
base: currentDraggedBase!, base: currentDraggedBase!,
anchorPoint: CGPoint(x: self.size.width / 2 , y: self.size.height / 2))) anchorPoint: CGPoint(x: self.size.width / 2 , y: self.size.height / 2)))
entityManager.update((currentDraggedBase?.attackBase(base: base, units: 100))!) entityManager.update((currentDraggedBase?.attackBase(base: base, units: 100))!)
}else { }else {
entityManager.add(Modal(modaltype: .BaseAttack, entityManager.add(Modal(modaltype: .BaseAttack,
base: currentDraggedBase!, base: currentDraggedBase!,
anchorPoint: CGPoint(x: self.size.width / 2 , y: self.size.height / 2))) anchorPoint: CGPoint(x: self.size.width / 2 , y: self.size.height / 2)))
} }
} }
} }
} }
else { else {
for entity in entityManager.entities { for entity in entityManager.entities {
let spriteNode = entity.component(ofType: DefaultBaseComponent.self)?.spriteNode let spriteNode = entity.component(ofType: DefaultBaseComponent.self)?.spriteNode
@ -94,16 +94,16 @@ class GameScene: SKScene{
} }
let touchLocation = touch.location(in: self) let touchLocation = touch.location(in: self)
for child in children { for child in children {
if atPoint(touchLocation) == child { if atPoint(touchLocation) == child {
child.touchesMoved(touches, with: event) child.touchesMoved(touches, with: event)
} }
} }
for e in entityManager.entities{ for e in entityManager.entities{
if let body = e.component(ofType: ModalContentComponent.self)?.body{ 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 " 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) let bases = entityManager.getBasesByTeam(for: .team1)

View File

@ -24,16 +24,16 @@ class MenuScene: SKScene {
if CommandLine.arguments.contains("--no-matchmaking") { if CommandLine.arguments.contains("--no-matchmaking") {
self.loadScene(scene: GameScene(size: self.size)) self.loadScene(scene: GameScene(size: self.size))
} else { } else {
MatchmakingHelper.sharedInstance.presentMatchmaker(scene: self) MatchmakingHelper.sharedInstance.presentMatchmaker(scene: self)
} }
})) }))
entityManager.add(Button(name: "settingsButton", entityManager.add(Button(name: "settingsButton",
iconName: "", iconName: "",
text: "Settings", text: "Settings",
position: CGPoint(x: midX, y: midY - 80 ), position: CGPoint(x: midX, y: midY - 80 ),
onButtonPress: { onButtonPress: {
//TODO: create Settings Scene //TODO: create Settings Scene
})) }))
entityManager.add(Background(size: self.size)) entityManager.add(Background(size: self.size))
} }