测试已测试 | ✓ |
语言语言 | SwiftSwift |
许可证 | MIT |
发布最新发布 | 2016年11月 |
SwiftSwift 版本 | 3.0 |
SPM支持 SPM | ✗ |
由Nicholas Cross维护。
一个小型的 Swift 框架,用于在不需要子类的情况下将附加功能附加到任何 SKNode。这意味着您可以在 Xcode 中设计场景,并将可重用的行为附加到任何 SKNode,例如 SKLightNode、SKEmitterNode 等。
您必须使用自定义的 SKScene
子类 SpriteElementScene
,但您可以将元素附加到任何 SKNode 而不必子类化。
您可以使用 SpriteElementScene
的 func attachElement(element: SpriteElement, toNode node: SKNode)
方法将元素附加到场景中的节点。
在接口中实现任何可选方法,以在场景生命周期中对节点执行特定操作。
//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 类在类型安全的方式中为您的元素维护与当前处理的节点独特相关的附加状态。
此示例的源代码可以在此处找到。
将此元素附加到任何 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()
}
}
}