首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >试图用我称之为Swift的“活生生的模型”来建造某种东西。我想我可能做错了

试图用我称之为Swift的“活生生的模型”来建造某种东西。我想我可能做错了
EN

Stack Overflow用户
提问于 2015-09-08 14:36:03
回答 2查看 56关注 0票数 0

我正在努力建立我所说的“活生生的模式”。想象一下,我有一个虚拟生物,它有一个能量属性,它会随着时间的推移慢慢下降或上升,这取决于它当前的活动。一旦降到一定的水平,它自然就会入睡。然后,一旦它恢复到一定的水平,它就会自然地醒来。它可能有一个exhausted属性,如果这种能量处于其自然睡眠水平之下,并且它也是清醒的,那么它就是true。这些属性的变化--活动,无论生物是否耗尽,都会影响到生物的外观,每当这些东西发生变化时,就需要知道变化。精疲力竭不只是在延迟之后发生变化,而是在“能量”达到某一点时,或者当活动发生变化时发生变化。

所以你可以看到,有几个不同的概念都在一起工作,用普通的Swift编程来做这件事给了我一个结,这个结目前相当松散,但是慢慢地变得更紧、更复杂。

因此,我需要一些建议,如何以一种不会引起头痛和难以发现的问题的方式来处理这件事。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-09-08 17:43:08

您可以设置属性来表示发生在该生物身上的各种情况。然后,正如比尔兹利先生所建议的,在你的能源属性上使用didSet,并将它的价值与“行动点”进行比较。最后,可以使用NSTimer定期重置能量属性。

这允许您创建几个不同的生物实例,它们具有独特的能量水平,它们会因此而入睡或变得精疲力竭。

代码语言:javascript
复制
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()
票数 1
EN

Stack Overflow用户

发布于 2015-09-08 16:15:42

这里有一个实现,您可以使用它来启动。注意,我使用了一个结构,但是如果您在游戏中使用雪碧套件,您可能会将其更改为类并从SKSpriteNode继承。

代码语言:javascript
复制
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个属性。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32460575

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档