移动时修改SKNode上的属性

时间:2017-10-02 22:23:49

标签: ios swift sprite-kit sknode

我有一个SKNode的子类,充当我的"生物"。这些使用SKActions自动移动场景。我有兴趣修改(减少)能量'属性(Int)作为生物移动。

该生物不能保证移动SKAction的整个长度(它可以被中断),因此计算总距离然后在它开始移动时立即降低属性并不理想。我基本上喜欢说"节点每1秒移动一次,降低能量属性"。

我该怎么做?我不知所措!谢谢。

2 个答案:

答案 0 :(得分:3)

GameScene.swift课程中,您有一个update(deltaTime seconds: TimeInterval)功能,可以跟踪一秒钟的间隔。添加一个类级别变量来保存累积的时间,然后每隔一秒检查一下你的生物是否正在运行它的动作。

class GameScene : SKScene {
    private var accumulatedTime: TimeInterval = 0

    override func update(_ currentTime: TimeInterval) {    
        if (self.accumulatedTime == 0) {
            self.accumulatedTime = currentTime
        }

        if currentTime - self.accumulatedTime > 1 {
            if creatureNode.action(forKey: "moveActionKey") != nil {
               // TODO: Update energy status
            }

            // Reset counter
            self.accumulatedTime = currentTime
        }
    }
}

答案 1 :(得分:2)

如果您知道能量属性,那么只需将其用作持续时间,并使用move(by: SKAction。

如果你希望你的精力消耗殆尽,可以在一个组中使用SKAction.customAction来减少它

var previousTime = 0
let move = SKAction.moveBy(x:dx * energy,y:dy * energy,duration:energy)
let depreciateEnergy = SKAction.customAction(withDuration:energy,{(node,time) in node.energy -= (time - previuosTime);previousTime = time}) 
let group = [move,depreciateEnergy]
character.run(group,withKey:"character")

现在,如果您需要停止操作,只需拨打character.removeActionForKey("character"),您的能量计将保留剩余的能量。