Skip to content

Commit

Permalink
Merge pull request #30 from rrbox/release
Browse files Browse the repository at this point in the history
Release
  • Loading branch information
rrbox committed Feb 4, 2022
2 parents be1c2a6 + c0cde18 commit 5050ef6
Show file tree
Hide file tree
Showing 7 changed files with 271 additions and 100 deletions.
29 changes: 16 additions & 13 deletions README.md
Expand Up @@ -4,19 +4,22 @@

## Builder

SKNode を `Builder` オブジェクトでラップして使用します。
`Builder` オブジェクトをインスタンス化すると, イニシャライザに応じて内部に SKNode インスタンスが作成されます.
``` Swift
var builder = Builder(SKNode())
Builder<SKNode>()
.position(CGPoint(x: 32, y: 100)) // 座標を設定
.addChild(
.add(
// 子ノードを追加
Builder(SKSpriteNode(color: .white, size: CGSize(width: 32, height: 32)
.position(CGPoint(x: 0, y: 32)) // 子ノードの座標を設定
child: SKSpriteNode(color: .white, size: CGSize(width: 32, height: 32),
build: { builder in
builder
.position(CGPoint(x: 0, y: 32)) // 子ノードの座標を設定
}
)
.addChild(
Builer(SKLabelNode(text: "Rect"))
.add(child: SKLabelNode(text: "Rect"), build = { builder in
builder
.position(x: -32, y: -32)
)
})
```

## NodeBuilder
Expand All @@ -27,10 +30,10 @@ var builder = Builder(SKNode())
func anyMethod() {
// プロパティに $ をつけることで Builer ラッパのインスタンスにアクセスできます
self.$node
.addChild(Node(SKSpriteNode(color: .white, size: CGSize(width: 32, height: 32)))
.addChild(
SKLabelNode(text: "Rect")
.position(x: -32, y: -32)
)
.add(child: SKSpriteNode(color: .white, size: CGSize(width: 32, height: 32)))
.add(child: SKLabelNode(text: "Rect"), build = { builder in
builder
.position(x: -32, y: -32)
})
}
```
87 changes: 46 additions & 41 deletions Sources/SKNodeBuilder/Builder.swift
Expand Up @@ -6,58 +6,63 @@
//

import SpriteKit
final public class Builder<Body: SKNode>: NSObject {
let body: Body
public init(_ body: Body) {

final public class Builder<Body: SKNode>: NSObject, BuilderProtocol {

public var node: Body {
self.body
}

private let body: Body

init(_ body: Body) {
self.body = body
}

public override init() {
self.body = Body()
}
@discardableResult public func position(_ position: CGPoint) -> Self {
self.body.position = position
return self
}
@discardableResult public func alpha(_ alpha: CGFloat) -> Self {
self.body.alpha = alpha
return self
}
@discardableResult public func zRotation(_ zRotation: CGFloat) -> Self {
self.body.zRotation = zRotation
return self
}
@discardableResult public func zPosition(_ zPosition: CGFloat) -> Self {
self.body.zPosition = zPosition
return self
}
@discardableResult public func xScale(_ s: CGFloat) -> Self {
self.body.xScale = s
return self

public init?(fileNamed filename: String) {
if let body = Body(fileNamed: filename) {
self.body = body
} else {
return nil
}
}
@discardableResult public func yScale(_ s: CGFloat) -> Self {
self.body.yScale = s
return self

public init(fileNamed filename: String, securelyWithClasses classes: Set<AnyHashable>) throws {
try self.body = Body(fileNamed: filename, securelyWithClasses: classes)
}
@discardableResult public func name(_ name: String?) -> Self {
self.body.name = name
return self

}

final public class ChildNodeBuilder<Body: SKNode>: NSObject, BuilderProtocol {

public var node: Body {
self.body
}
@discardableResult public func physicsBody(_ physicsBody: SKPhysicsBody?) -> Self {
self.body.physicsBody = physicsBody
return self

private unowned let body: Body

internal init(_ body: Body) {
self.body = body
}

}
/// 後方互換性のサポート.
/// - attention: v2 以降から非推奨となります.
public typealias Node = Builder
public extension SKNode {
func addChild<Body: SKNode>(_ node: Builder<Body>) {
self.addChild(node.body)

public extension BuilderProtocol {

@discardableResult func add<Node: SKNode>(child node: Node, build: (ChildNodeBuilder<Node>) -> () = {_ in}) -> Self {
self.node.addChild(node)
build(ChildNodeBuilder<Node>(node))
return self
}
}
public extension Builder {
@discardableResult func addChild<Body: SKNode>(_ node: Builder<Body>) -> Self {
self.body.addChild(node)
@discardableResult func insert<Node: SKNode>(child node: Node, at index: Int, build: (ChildNodeBuilder<Node>) -> () = {_ in}) -> Self {
self.node.insertChild(node, at: index)
build(ChildNodeBuilder<Node>(node))
return self
}

}
77 changes: 77 additions & 0 deletions Sources/SKNodeBuilder/BuilderProtocol.swift
@@ -0,0 +1,77 @@
//
// File.swift
//
//
// Created by rrbox on 2021/11/20.
//

import SpriteKit


public protocol BuilderProtocol {

associatedtype Body: SKNode

var node: Body { get }

}


public extension BuilderProtocol {

@discardableResult func position(_ value: CGPoint) -> Self {
self.node.position = value
return self
}

@discardableResult func zPosition(_ value: CGFloat) -> Self {
self.node.zPosition = value
return self
}

@discardableResult func zRotation(_ value: CGFloat) -> Self {
self.node.zRotation = value
return self
}

@discardableResult func setScale(_ value: CGFloat) -> Self {
self.node.setScale(value)
return self
}

@discardableResult func alpha(_ value: CGFloat) -> Self {
self.node.alpha = value
return self
}

@discardableResult func xScale(_ value: CGFloat) -> Self {
self.node.xScale = value
return self
}

@discardableResult func yScale(_ value: CGFloat) -> Self {
self.node.yScale = value
return self
}

@discardableResult func name(_ value: String?) -> Self {
self.node.name = value
return self
}

@discardableResult func physicsBody(_ value: SKPhysicsBody?) -> Self {
self.node.physicsBody = value
return self
}

@discardableResult func constrains(_ value: [SKConstraint]?) -> Self {
self.node.constraints = value
return self
}

@discardableResult func isUserInteractionEnabled(_ value: Bool) -> Self {
self.node.isUserInteractionEnabled = value
return self
}

}
87 changes: 60 additions & 27 deletions Sources/SKNodeBuilder/LabelBuilder.swift
Expand Up @@ -6,57 +6,90 @@
//

import SpriteKit

public typealias LabelBuilder = Builder<SKLabelNode>
/// 後方互換性のサポート.
/// - attention: v2 以降から非推奨となります.
public typealias LabelNode = LabelBuilder

public extension LabelBuilder {
@discardableResult func text(_ text: String?) -> Self {
self.body.text = text

convenience init(fontNamed fontName: String?) {
self.init(.init(fontNamed: fontName))
}

convenience init(text: String?) {
self.init(.init(text: text))
}

convenience init(attributedText: NSAttributedString?) {
self.init(.init(attributedText: attributedText))
}

}

public extension BuilderProtocol where Body == SKLabelNode {

@discardableResult func text(_ value: String?) -> Self {
self.node.text = value
return self
}
@discardableResult func attributedText(_ attributedText: NSAttributedString) -> Self {
self.body.attributedText = attributedText

@discardableResult func attributedText(_ value: NSAttributedString) -> Self {
self.node.attributedText = value
return self
}
@discardableResult func fontColor(_ fontColor: SKColor?) -> Self {
self.body.fontColor = fontColor

@discardableResult func fontColor(_ value: SKColor?) -> Self {
self.node.fontColor = value
return self
}
@discardableResult func colorBlendFactor(_ colorBlendFactor: CGFloat) -> Self {
self.body.colorBlendFactor = colorBlendFactor

@discardableResult func fontName(_ value: String?) -> Self {
self.node.fontName = value
return self
}
@discardableResult func blendMode(_ blendMode: SKBlendMode) -> Self {
self.body.blendMode = blendMode

@discardableResult func fontSize(_ value: CGFloat) -> Self {
self.node.fontSize = value
return self
}
@discardableResult func preferredMaxLayoutWidth(_ preferredMaxLayoutWidth: CGFloat) -> Self {
self.body.preferredMaxLayoutWidth = preferredMaxLayoutWidth

@discardableResult func vertivalAlignment(_ value: SKLabelVerticalAlignmentMode) -> Self {
self.node.verticalAlignmentMode = value
return self
}
@discardableResult func lineBreakMode(_ lineBreakMode: NSLineBreakMode) -> Self {
self.body.lineBreakMode = lineBreakMode

@discardableResult func horizontalAlignment(_ value: SKLabelHorizontalAlignmentMode) -> Self {
self.node.horizontalAlignmentMode = value
return self
}
@discardableResult func numberOfLines(_ numberOfLines: Int) -> Self {
self.body.numberOfLines = numberOfLines

@discardableResult func preferredMaxLayoutWidth(_ value: CGFloat) -> Self {
self.node.preferredMaxLayoutWidth = value
return self
}
@discardableResult func fontName(_ fontName: String?) -> Self {
self.body.fontName = fontName

@discardableResult func lineBreakMode(_ value: NSLineBreakMode) -> Self {
self.node.lineBreakMode = value
return self
}
@discardableResult func fontSize(_ size: CGFloat) -> Self {
self.body.fontSize = size

@discardableResult func numberOfLines(_ value: Int) -> Self {
self.node.numberOfLines = value
return self
}
@discardableResult func vertivalAlignment(_ align: SKLabelVerticalAlignmentMode) -> Self {
self.body.verticalAlignmentMode = align

@discardableResult func color(_ value: SKColor) -> Self {
self.node.color = value
return self
}
@discardableResult func horizontalAlignment(_ align: SKLabelHorizontalAlignmentMode) -> Self {
self.body.horizontalAlignmentMode = align

@discardableResult func colorBlendFactor(_ value: CGFloat) -> Self {
self.node.colorBlendFactor = value
return self
}

@discardableResult func blendMode(_ value: SKBlendMode) -> Self {
self.node.blendMode = value
return self
}

}
Expand Up @@ -12,7 +12,7 @@ public struct NodeBuilder<Body: SKNode> {
public init(wrappedValue: Body) {
self.wrappedValue = wrappedValue
}
public var projectedValue: Builder<Body> {
Builder(self.wrappedValue)
public var projectedValue: ChildNodeBuilder<Body> {
ChildNodeBuilder(self.wrappedValue)
}
}

0 comments on commit 5050ef6

Please sign in to comment.