我试图构建我将要描述为“生活模式”的东西。想象一下,我有一个虚拟生物,它的能量属性会随着时间的推移而缓慢下降或上升,具体取决于它的当前活动。一旦它下降到一定程度,它自然会进入睡眠状态。然后一旦它回到某个水平,它就会自然地醒来。并且它可能具有exhausted
属性,如果该能量低于其自然睡眠水平,并且如果它也是清醒的,则为true
。这些属性发生变化 - 活动,生物是否耗尽,都会影响生物的外观,并且只要这些东西发生变化,外表就需要知道改变。尽管经过一段时间后,疲惫不会改变,但是当能量消耗时,它会发生变化。到达某一点,或当活动发生变化时。
所以你可以看到一些不同的概念在一起工作,使用常规的Swift编程这样做给我一个结,目前很松散,但是越来越紧,越来越复杂。
所以我需要一些关于如何以一种不会引起头痛和难以发现问题的方式处理这个问题的建议。
答案 0 :(得分:1)
这是一个可以帮助您入门的实现。注意,我使用了一个结构体,但是如果你为你的游戏使用Sprite Kit,你可以将它改为一个类并从SKSpriteNode继承。
enum CreatureState: Int {
case Active = 50
case Sleeping = 20
case Exhausted = 10
}
struct Creature {
var energy: Int {
didSet {
switch self.state {
case .Active:
if energy < CreatureState.Active.rawValue {
self.state = .Sleeping
}
else if energy < CreatureState.Sleeping.rawValue {
self.state = .Exhausted
}
case .Sleeping:
if energy > CreatureState.Sleeping.rawValue {
self.state = .Active
}
case .Exhausted:
if energy > CreatureState.Active.rawValue {
self.state = .Active
}
else if energy > CreatureState.Active.rawValue {
self.state = .Sleeping
}
}
}
}
var state: CreatureState
init(energyLevel: Int, state: CreatureState) {
self.energy = energyLevel
self.state = state
}
}
我将你的生物的不同状态建模为具有相关值的枚举。您可以将这些值更改为任何值,以标记从一个状态到另一个状态的更改。
使用&#39; didSet&#39;对能量的财产观察者,可以在设定新的能量值时随时执行动作。总的来说,我们只能使用2个属性来建模您的需求。
答案 1 :(得分:1)
您可以设置属性以表示生物发生事件的各个点。然后,正如比尔兹利先生建议的那样,在你的能量属性上使用didSet,并将其值与行动点进行比较&#34;。最后,您可以使用NSTimer定期重置能量属性。
这允许你创建几个不同的生物实例,这些生物实例具有独特的能量水平,它们会睡着或疲惫不堪。
enum MonsterState {
case Awake, Asleep, Exhausted
}
class Monster {
var monsterState = MonsterState.Awake
let drainRate: Int
let pointOfExhaustion: Int
var energy: Int {
didSet {
if energy <= pointOfExhaustion {
monsterState = .Exhausted
} else if energy <= 0 {
monsterState = .Asleep
}
}
}
init(energy: Int, pointOfExhaustion: Int, drainRate: Int) {
self.energy = energy
self.pointOfExhaustion = pointOfExhaustion
self.drainRate = drainRate
}
func weaken() {
NSTimer.scheduledTimerWithTimeInterval(1.0,
target: self, selector: "drainEnergyWithTimer:",
userInfo: ["pointsPerSecond": drainRate], repeats: true)
}
func drainEnergyWithTimer(timer: NSTimer) {
if let passedInfo = timer.userInfo as? [NSObject: AnyObject]{
let energyDecrease = passedInfo["pointsPerSecond"] as! Int
energy -= energyDecrease
}
if energy <= 0 {
timer.invalidate()
}
}
}
let godzilla = Monster(energy: 100, pointOfExhaustion: 12, drainRate: 3)
let mothra = Monster(energy: 150, pointOfExhaustion: 25, drainRate: 2)
godzilla.weaken()
mothra.weaken()