SpriteKitElements 0.4.2

SpriteKitElements 0.4.2

测试已测试
语言语言 SwiftSwift
许可证 MIT
发布最新发布2016年11月
SwiftSwift 版本3.0
SPM支持 SPM

Nicholas Cross维护。



  • 作者
  • Nicholas Cross

build status

一个小型的 Swift 框架,用于在不需要子类的情况下将附加功能附加到任何 SKNode。这意味着您可以在 Xcode 中设计场景,并将可重用的行为附加到任何 SKNode,例如 SKLightNode、SKEmitterNode 等。

SpriteElementScene(类)

您必须使用自定义的 SKScene 子类 SpriteElementScene,但您可以将元素附加到任何 SKNode 而不必子类化。

您可以使用 SpriteElementScenefunc attachElement(element: SpriteElement, toNode node: SKNode) 方法将元素附加到场景中的节点。

SpriteElement(协议)

在接口中实现任何可选方法,以在场景生命周期中对节点执行特定操作。

    //Called when an element is first attached to a node
    func didAttach(toNode node: SKNode, inScene scene:SpriteElementScene)

    //Called during scene update, delta is the time since the last scene update
    func update(atTime currentTime: TimeInterval, delta: TimeInterval, node: SKNode)

    func didEvaluateActions(_ node: SKNode)

    func didSimulatePhysics(_ node: SKNode)

    func didApplyConstraints(_ node: SKNode)

    func didFinishUpdate(_ node: SKNode)

    func didMove(toView view: SKView, node: SKNode)

    func willMove(fromView view: SKView, node: SKNode)

    func didChange(size oldSize: CGSize, node: SKNode)

    func didBegin(contact: SKPhysicsContact, node: SKNode)

    func didEnd(contact: SKPhysicsContact, node: SKNode)

SpriteEssence(类)

为了最大限度地提高元素的复用性,您应尽可能避免在元素中维护状态。

如果需要为要实施的行为维护每个节点的状态,您可以使用 SpriteEssence 类在类型安全的方式中为您的元素维护与当前处理的节点独特相关的附加状态。

示例

此示例的源代码可以在此处找到。

联系开始

将此元素附加到任何 SKSpriteNode 的SKSpriteNode将逐步改变颜色,因为它与具有相同附加元素的节点碰撞。您可以在示例项目中查看此操作。

import Foundation
import SpriteKit
import SpriteKitElements

class ColorElement : SpriteElement {

    let hue = SpriteEssence<CGFloat>()

    func createBody() -> SKPhysicsBody {
        let body = SKPhysicsBody(circleOfRadius: 40)
        body.categoryBitMask = 1
        body.contactTestBitMask = 1
        body.collisionBitMask = 1
        body.affectedByGravity = true
        return body;
    }

    func didAttach(toNode node: SKNode, inScene scene: SpriteElementScene) {
        hue[node] = 0
        node.physicsBody = createBody()
    }

    func didBegin(contact: SKPhysicsContact, node: SKNode) {
        if let shapeNode = node as? SKShapeNode, let h = hue[node] {
            if h > 0.9 {
                hue[node] = 0
            }
            else {
                hue[node] = h + 0.05
            }

            shapeNode.strokeColor = UIColor(hue: h, saturation: 1, brightness: 0.9, alpha: 1)
        }
    }

}

元素附加和场景更新

任何 y 位置小于 -500 的精灵节点都将从场景中移除

class RemoveOffScreen: SpriteElement {

    let timeInterval = SpriteEssence<TimeInterval>()

    func didAttach(toNode node: SKNode, inScene scene: SpriteElementScene) {
        timeInterval[node] = 0
    }

    func update(atTime currentTime: TimeInterval, delta: TimeInterval, node: SKNode) {
        guard currentTime > timeInterval[node]! + 1 else {
            //This does not need to be done on every frame
            return
        }

        timeInterval[node] = currentTime

        if node.position.y < -500 {
            node.removeFromParent()
        }
    }
}