13

Draw a hole in a rectangle with SpriteKit?の質問には、満足な答えが得られていませんでしたが、この2つの最も大きな違いは、この問題に回避策がないことが必要であり、 SKCropNodesの機能を元に戻す方法について説明します。SKSpriteNodesのランダムな穴をカットする方法

この問題の主な懸念事項は、ホールのランダム性、ホールの数、およびホールが存在するオブジェクトのバリエーションのために、上記の質問に答えることができるハッピーな方法のタイプによって対処することはできません適用される。

従ってスイスチーズ例:

は、チーズ様の色の様々な色合いで満たされたランダムなサイズの矩形SKSpriteNodesの束を想像します。

チーズの各スライスからランダムな円を切り取ってスイスチーズを作る方法は?

SKCropNodesが円である場合、チーズの切れ目ではなく円形のチーズのみが残されます。 SKCropNodesの動作を逆転させる方法はありますか?代わりに穴をカットしますか?私の総正直で

+0

[SpriteKitで四角形の穴を描く]の可能な複製?(http://stackoverflow.com/questions/34576112/draw-a-hole-in-a-rectangle-with-spritekit) – Knight0fDragon

答えて

7

は、私はあなたが達成したい何をすべきかを深く理解することは本当にわからないんだけど、私はこの質問に答えることを試みることができます。

の各スライスのうち、ランダムな円を..cuttingチーズ?

このプロジェクトでは、ランダムな穴を持つ一般的な長方形(チーズの部分)を再構築しようとしました。次に、これらの穴を抽出して配列に集めました。

import SpriteKit 
class GameScene: SKScene { 
    struct Cheese 
    { 
     static let color1 = SKColor(red: 255/255, green: 241/255, blue: 173/255, alpha: 1) 
     static let color2 = SKColor(red: 255/255, green: 212/255, blue: 0/255, alpha: 1) 
     static let color3 = SKColor(red: 204/255, green: 170/255, blue: 0/255, alpha: 1) 
     static let color4 = SKColor(red: 140/255, green: 116/255, blue: 0/255, alpha: 1) 
    } 
    let cheeseColor = [Cheese.color1,Cheese.color2,Cheese.color3,Cheese.color4] 
    override func didMove(to view: SKView) {   
     let totHoles = randomNumber(range:4...8) 
     let color = randomNumber(range:0...3) 
     let cheeseCropNode = makeCheese(size: CGSize(width:400,height:200),color: cheeseColor[color], totHoles:totHoles) 
     cheeseCropNode.position = CGPoint(x:0,y:-50) 
     addChild(cheeseCropNode) 
     // Start to collect and show holes 
     var holes = [SKNode]() 
     var counter = 1 
     let _ = cheeseCropNode.enumerateChildNodes(withName: "//hole*", using:{ node, stop in 
      // node is the hole 
      let pos = self.convert(node.position, from: cheeseCropNode) 
      let sprite = SKSpriteNode.init(color: .red, size: node.frame.size) 
      sprite.position = pos 

      //Remove these shapes, it's just to debug 
      let shape = SKShapeNode.init(rect: sprite.frame) 
      shape.strokeColor = .red 
      self.addChild(shape) 
      // -- end to remove 

      let holeTxt = SKView().texture(from: cheeseCropNode, crop: sprite.frame) 
      let hole = SKSpriteNode.init(texture: holeTxt) 
      hole.position = CGPoint(x:-(self.frame.maxX)+(100*CGFloat(counter)),y:150) 
      hole.name = node.name 
      self.addChild(hole) 
      holes.append(hole) 
      counter += 1 
     }) 
    } 

    func randomNumber(range: ClosedRange<Int> = 1...6) -> Int { 
     let min = range.lowerBound 
     let max = range.upperBound 
     return Int(arc4random_uniform(UInt32(1 + max - min))) + min 
    } 
    func randomCGFloat(min: CGFloat, max: CGFloat) -> CGFloat { 
     return (CGFloat(arc4random())/CGFloat(UINT32_MAX)) * (max - min) + min 
    } 
    func makeCheese(size:CGSize , color:SKColor, totHoles:Int)->SKCropNode { 
     let cropNode = SKCropNode() 
     let cheese = SKSpriteNode.init(color: color, size: size) 
     for i in 0..<totHoles { 
      let radius = randomCGFloat(min:20.0, max:50.0) 
      let circle = SKShapeNode(circleOfRadius: radius) 
      circle.position = CGPoint(x:randomCGFloat(min:-size.width/2, max:size.width/2),y:randomCGFloat(min:-size.height/2, max:size.height/2)) 
      circle.fillColor = color 
      circle.blendMode = .subtract 
      circle.name = "hole\(i)" 
      cheese.addChild(circle) 
     } 
     cropNode.addChild(cheese) 
     cropNode.maskNode = cheese 
     return cropNode 
    } 
} 

結果

P.S.それはちょうどあなたの穴を示すことだ、赤い四角形に注意を払ってはいけない:

enter image description here

あなたは正確に逆転穴、(負のイメージを)したい場合は、あなたがhole.blendModeSKCropNodeを使用することができ、

代替コードのこの部分:この部分と

// -- end to remove 

       let holeTxt = SKView().texture(from: cheeseCropNode, crop: sprite.frame) 
       let hole = SKSpriteNode.init(texture: holeTxt) 
       hole.position = CGPoint(x:-(self.frame.maxX)+(100*CGFloat(counter)),y:150) 
       hole.name = node.name 
       self.addChild(hole) 
       holes.append(hole) 
       counter += 1 

例えば
// -- end to remove 

      let holeTxt = SKView().texture(from: cheeseCropNode, crop: sprite.frame) 
      let hole = SKSpriteNode.init(texture: holeTxt) 
      hole.position = CGPoint(x:-(self.frame.maxX)+(100*CGFloat(counter)),y:150) 
      hole.name = node.name 

      let negativeCropHole = SKCropNode() 
      let shadow = SKShapeNode.init(rect: hole.frame) 
      shadow.fillColor = (node as! SKShapeNode).fillColor 
      shadow.strokeColor = SKColor.clear 
      hole.blendMode = .subtract 
      negativeCropHole.addChild(shadow) 
      negativeCropHole.maskNode = shadow 
      negativeCropHole.addChild(hole) 
      negativeCropHole.name = hole.name 
      self.addChild(negativeCropHole) 
      holes.append(negativeCropHole) 
      counter += 1 

結果(別の例):

enter image description here

は、あなたの目標を得るために、これらの例と、このコードのヘルプを願って、私はマスクを作るために長方形を使用しましたが、あなたの場合CGPathsを作成することができますあなたが必要です。

関連する問題