This repository was archived by the owner on Mar 9, 2023. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathStateMachineComponent.swift
More file actions
111 lines (89 loc) · 3 KB
/
StateMachineComponent.swift
File metadata and controls
111 lines (89 loc) · 3 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
//
// StateMachineComponent.swift
// Bomberman
//
// Created by Wolfgang Schreurs on 02/05/16.
//
//
import GameplayKit
class StateMachineComponent: GKComponent {
let stateMachine: StateMachine
var currentState: State? {
return self.stateMachine.currentState as! State?
}
var canRoam: Bool {
var canRoam = false
canRoam = self.stateMachine.state(forClass: MoveState.self) != nil
return canRoam
}
var canAttack: Bool {
var canAttack = false
canAttack = self.stateMachine.state(forClass: AttackState.self) != nil
return canAttack
}
init(game: Game, entity: Entity, states: [State]) {
self.stateMachine = StateMachine(game: game, entity: entity, states: states)
super.init()
}
required init?(coder aDecoder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
override func update(deltaTime seconds: TimeInterval) {
super.update(deltaTime: seconds)
self.stateMachine.update(deltaTime: seconds)
}
func enterRoamState() {
self.stateMachine.enter(MoveState.self)
}
func enterAttackState() {
self.stateMachine.enter(AttackState.self)
}
func enterSpawnState() {
if (self.stateMachine.currentState is SpawnState) == false {
if let creature = self.entity as? Creature, creature.lives >= 0 {
if let configComponent = creature.component(ofType: ConfigComponent.self) {
creature.health = configComponent.health
}
}
self.stateMachine.enter(SpawnState.self)
}
}
func enterCheerState() {
if (self.stateMachine.currentState is CheerState) == false {
self.stateMachine.enter(CheerState.self)
}
}
func enterFloatState() {
if (self.stateMachine.currentState is FloatState) == false {
self.stateMachine.enter(FloatState.self)
}
}
func enterDecayState() {
if (self.stateMachine.currentState is DecayState) == false {
self.stateMachine.enter(DecayState.self)
}
}
func enterDestroyState() {
if (self.stateMachine.currentState is DestroyState) == false {
if let creature = self.entity as? Creature {
if creature.lives >= 0 {
creature.lives -= 1
}
}
self.stateMachine.enter(DestroyState.self)
}
}
func enterHitState(_ damage: Int = 1) {
if (self.stateMachine.currentState is HitState) == false {
if let creature = self.entity as? Creature {
creature.health -= damage
}
self.stateMachine.enter(HitState.self)
}
}
func enterControlState() {
if (self.stateMachine.currentState is ControlState) == false {
self.stateMachine.enter(ControlState.self)
}
}
}