【问题标题】:Looking for ways to update instance's property per frame寻找每帧更新实例属性的方法
【发布时间】:2020-03-11 09:07:05
【问题描述】:

我实现了一个具有附加属性的 SKSpriteNode 子类。然后我创建了它的一个实例并尝试在每一帧修改它的属性值,但我遇到了一个错误。

有什么办法可以解决吗?

import SpriteKit
import GameplayKit

class SomeSprite: SKSpriteNode {
    var direction: CGVector = CGVector(dx: 0, dy: 0)
    convenience init() {
        self.init(imageNamed: "imgSprite")
    }
}

class GameScene: SKScene {
    override func didMove(to view: SKView) {
        //Create a sprite instance
        var sampleSprite = SomeSprite()
        sampleSprite.name = "Sprite"
        sampleSprite.zPosition = 1
        sampleSprite.position = CGPoint(x: 100, y: 100)
        sampleSprite.direction = CGVector(dx: 10, dy: 10)
        sampleSprite.setScale(1)
        self.addChild(sampleSprite)
    }

    override func update(_ currentTime: TimeInterval) {
        //Calculate before rendering frame
        self.enumerateChildNodes(withName: "Sprite") { (sprite, stop) in
            sprite.position = CGPoint(x: 150, y: 150) //This works properly
            sprite.direction = CGVector(dx: 15, dy: 15) //Error: Value of type SKNode has no member 'direction'
        }
    }
}

【问题讨论】:

    标签: ios swift sprite-kit


    【解决方案1】:

    enumerateChildNodes方法返回一个SKNodes列表

    您必须尝试将对象投射到您的类 SomeSprite

        override func update(_ currentTime: TimeInterval) {
            //Calculate before rendering frame
            self.enumerateChildNodes(withName: "Sprite") { (sprite, stop) in
                sprite.position = CGPoint(x: 150, y: 150) //This works properly
                if let someSprite = sprite as? SomeSprite {
                    someSprite.direction = CGVector(dx: 15, dy: 15)
                }
            }
        }
    

    【讨论】:

    • 对,真的只是性能推荐。但你是对的,我更新了答案。
    • 消除引用区域,这意味着不要调用scene.update(deltaTime)
    猜你喜欢
    • 2017-01-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-04
    • 2018-04-17
    • 1970-01-01
    • 1970-01-01
    • 2014-09-27
    相关资源
    最近更新 更多