Skip to content

Commit

Permalink
Merge pull request #81 from rrbox/feat/subclass-support
Browse files Browse the repository at this point in the history
Feat/subclass support
  • Loading branch information
rrbox authored Nov 2, 2022
2 parents c97910e + 7a5d3c6 commit 6eba1ac
Show file tree
Hide file tree
Showing 9 changed files with 294 additions and 143 deletions.
3 changes: 2 additions & 1 deletion Sources/SKNodeBuilder/Foundation/Builder.swift
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
//
// File.swift
// Builder.swift
//
//
// Created by rrbox on 2022/09/09.
Expand All @@ -9,6 +9,7 @@ import SpriteKit

/// ビルダーの起点となる構造体です.
public struct Builder<T: ProcessorProtocol> {

let nodeInit: NodeInit<T.Node>
let processor: T

Expand Down
4 changes: 3 additions & 1 deletion Sources/SKNodeBuilder/Foundation/NodeInit.swift
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
//
// NodeMake.swift
// NodeInit.swift
//
//
// Created by rrbox on 2022/09/08.
Expand All @@ -22,6 +22,7 @@ enum StandardParams<Node: SKNode>: NodeInitType {

/// ノードを遅延生成する構造体です.
public struct NodeInit<T: SKNode>: NodeMake {

typealias InitType = StandardParams<T>

let param: InitType
Expand Down Expand Up @@ -54,4 +55,5 @@ public struct NodeInit<T: SKNode>: NodeMake {
public init(fileNamed fileName: String, securelyWithClasses classes: Set<AnyHashable>) {
self.param = .securelyWithClasses(fileName, classes)
}

}
9 changes: 7 additions & 2 deletions Sources/SKNodeBuilder/Foundation/Processor.swift
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
//
// File.swift
// Processor.swift
//
//
// Created by rrbox on 2021/11/20.
Expand All @@ -11,6 +11,7 @@ import SpriteKit
///
/// 作成した modifier オブジェクトは, BuilderProtocol の `modifier(mod:)` にセットして使用します.
public protocol Modifier {

/// SKNode のサブクラス.
associatedtype Node: SKNode

Expand All @@ -21,13 +22,15 @@ public protocol Modifier {

/// ビルダーを定義します.
public protocol ProcessorProtocol {

associatedtype Mod: Modifier
var modData: Mod { get set }
func mod(node: Mod.Node)

}

public extension ProcessorProtocol {

typealias Next<T: Modifier> = Link<Self, T> where T.Node == Self.Mod.Node
typealias Node = Self.Mod.Node

Expand All @@ -45,13 +48,15 @@ public extension ProcessorProtocol {
}

extension Modifier {

static func link<T: ProcessorProtocol>(from mod: Self, previous: T) -> Link<T, Self> where T.Mod.Node == Self.Node {
.init(previous: previous, modData: mod)
}

}

public struct Link<Previous: ProcessorProtocol, Mod: Modifier>: ProcessorProtocol where Previous.Mod.Node == Mod.Node {

var previous: Previous
public var modData: Mod

Expand All @@ -64,11 +69,11 @@ public struct Link<Previous: ProcessorProtocol, Mod: Modifier>: ProcessorProtoco

public struct Empty<Node: SKNode>: Modifier {
public func mod(node: Node) {}

}

/// モディファイアの起点となる構造体です.
public struct Processor<Node: SKNode>: ProcessorProtocol {

public typealias Mod = Empty<Node>

public func mod(node: Node) {}
Expand Down
2 changes: 1 addition & 1 deletion Sources/SKNodeBuilder/Foundation/PropertyWrapper.swift
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
//
// File.swift
// PropertyWrapper.swift
//
//
// Created by rrbox on 2021/11/20.
Expand Down
26 changes: 25 additions & 1 deletion Sources/SKNodeBuilder/Foundation/SKNode.swift
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
//
// File.swift
// SKNode.swift
//
//
// Created by rrbox on 2021/11/20.
Expand All @@ -9,117 +9,141 @@ import SpriteKit

/// Name space of all SKNode subclass builder's modifiers.
public enum StandardModifiers {

/// 座標変更のためのモディファイアです.
public struct Position<Node: SKNode>: Modifier {

public var body: CGPoint

public func mod(node: Node) {
node.position = self.body
}

}

/// x, y スケールを変更するためのモディファイアです.
public struct Scale<Node: SKNode>: Modifier {

public var body: CGFloat

public func mod(node: Node) {
node.setScale(self.body)
}

}

/// x スケールを変更するためのモディファイアです.
public struct XScale<Node: SKNode>: Modifier {

public var body: CGFloat

public func mod(node: Node) {
node.xScale = self.body
}

}

/// y スケールを変更するためのモディファイアです.
public struct YScale<Node: SKNode>: Modifier {

public var body: CGFloat

public func mod(node: Node) {
node.yScale = self.body
}

}

/// zPosition を変更するためのモディファイアです.
public struct ZPosition<Node: SKNode>: Modifier {

public var body: CGFloat

public func mod(node: Node) {
node.zPosition = self.body
}

}

/// zRotation を変更するためのモディファイアです.
public struct ZRotation<Node: SKNode>: Modifier {

public var body: CGFloat

public func mod(node: Node) {
node.zRotation = self.body
}

}

/// alpha を変更するためのモディファイアです.
public struct Alpha<Node: SKNode>: Modifier {

var body: CGFloat

public func mod(node: Node) {
node.alpha = self.body
}

}

/// name を変更するためのモディファイアです.
public struct Name<Node: SKNode>: Modifier {

var body: String?

public func mod(node: Node) {
node.name = self.body
}

}

/// ``doc:SKNodeBuilder/ProcessorProtocol/addChild(builder:)`` を行うためのモディフィアです.
/// ビルダーオブジェクトから `node()` メソッドにより生成さたノードを子ノードとして追加します.
public struct AddChildBuilder<T: ProcessorProtocol, Node: SKNode>: Modifier {

var body: Builder<T>

public func mod(node: Node) {
node.addChild(self.body.node())
}

}

/// ``doc:SKNodeBuilder/ProcessorProtocol/addChild(_:withNode:)``を行うためのモディフィアです.
///
/// ビルダーオブジェクトから `process(node:)` メソッドで編集されたノードを子ノードとして追加します.
public struct AddChildWithNode<T: ProcessorProtocol, Node: SKNode>: Modifier {

var body: T
unowned let childNode: T.Node

public func mod(node: Node) {
// ここで signal SIGABRT エラーが出た場合, 設定したノードのメモリが解放されている可能性があります.
node.addChild(self.body.process(node: self.childNode))
}

}

/// ``doc:SKNodeBuilder/ProcessorProtocol/addChild(_:)`` を行うためのモディフィアです.
///
/// ノードをそのまま子ノードとして追加します.
public struct AddChild<T: SKNode, Node: SKNode>: Modifier {

unowned let body: T

public func mod(node: Node) {
// ここで signal SIGABRT エラーが出た場合, 設定したノードのメモリが解放されている可能性があります.
node.addChild(self.body)
}

}


}

public extension ProcessorProtocol {

/// 座標を変更します.
@discardableResult func position(_ value: CGPoint) -> Next<StandardModifiers.Position<Node>> {
self.modifier(mod: StandardModifiers.Position(body: value))
Expand Down
Loading

0 comments on commit 6eba1ac

Please sign in to comment.