我正在努力建立我所说的“活生生的模式”。想象一下,我有一个虚拟生物,它有一个能量属性,它会随着时间的推移慢慢下降或上升,这取决于它当前的活动。一旦降到一定的水平,它自然就会入睡。然后,一旦它恢复到一定的水平,它就会自然地醒来。它可能有一个exhausted属性,如果这种能量处于其自然睡眠水平之下,并且它也是清醒的,那么它就是true。这些属性的变化--活动,无论生物是否耗尽,都会影响到生物的外观,每当这些东西发生变化时,就需要知道变化。精疲力竭不只是在延迟之后发生变化,而是在“能量”达到某一点时,或者当活动发生变化时发生变化。
所以你可以看到,有几个不同的概念都在一起工作,用普通的Swift编程来做这件事给了我一个结,这个结目前相当松散,但是慢慢地变得更紧、更复杂。
因此,我需要一些建议,如何以一种不会引起头痛和难以发现的问题的方式来处理这件事。
发布于 2015-09-08 17:43:08
您可以设置属性来表示发生在该生物身上的各种情况。然后,正如比尔兹利先生所建议的,在你的能源属性上使用didSet,并将它的价值与“行动点”进行比较。最后,可以使用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()发布于 2015-09-08 16:15:42
这里有一个实现,您可以使用它来启动。注意,我使用了一个结构,但是如果您在游戏中使用雪碧套件,您可能会将其更改为类并从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
}
}我将您的生物的不同状态建模为具有关联值的枚举。您可以将这些值更改为任何标记从一种状态到另一种状态的变化的值。
通过对能量使用“didSet”属性观测器,可以在任何时候为能量设置新值时执行操作。总之,我们能够建模您的需求只有2个属性。
https://stackoverflow.com/questions/32460575
复制相似问题