如果枚举节点,则检测重叠

时间:2017-04-04 09:53:37

标签: swift sprite-kit

我想知道如何在枚举重叠节点时检测它们?或者我应该如何使 Y轴中的每个随机生成位置至少高出或低于某些点。

这就是我的所作所为:

1 - 生成-400到400之间的随机数

2 - 将这些添加到数组

3 - 枚举并添加节点到场景,生成的位置如下:

var leftPositions = [CGPoint]()

            for _ in 0..<randRange(lower: 1, upper: 5){
                leftPositions.append(CGPoint(x: -295, y: Helper().randomBetweenTwoNumbers(firstNumber: leftSparkMinimumY, secondNumber: leftSparkMaximumY)))

            }

            leftPositions.enumerated().forEach { (index, point) in

                let leftSparkNode = SKNode()
                leftSparkNode.position = point
                leftSparkNode.name = "LeftSparks"

                let leftSparkTexture = SKTexture(imageNamed: "LeftSpark")
                LeftSpark = SKSpriteNode(texture: leftSparkTexture)

                LeftSpark.name = "LeftSparks"
                LeftSpark.physicsBody = SKPhysicsBody(texture: leftSparkTexture, size: LeftSpark.size)
                LeftSpark.physicsBody?.categoryBitMask = PhysicsCatagory.LeftSpark
                LeftSpark.physicsBody?.collisionBitMask = PhysicsCatagory.Bird
                LeftSpark.physicsBody?.contactTestBitMask = PhysicsCatagory.Bird
                LeftSpark.physicsBody?.isDynamic = false
                LeftSpark.physicsBody?.affectedByGravity = false
                leftSparkNode.addChild(LeftSpark)


                addChild(leftSparkNode)

            }

但是有时他们会相互重叠,因为生成的CGPoint太靠近前一个了。

我试图在墙上添加一些三角形,这些三角形旋转90°

在图像中描述我想要实现的目标:

enter image description here

我想避免这样的事情:

enter image description here

1 个答案:

答案 0 :(得分:1)

你的方法不是最好的,我建议只在你的位置数组中存储Y值并检查这些值以确保你的节点不会重叠。以下将确保没有两个火花在彼此的100个点内。您可能希望根据节点的实际高度或用例更改该值。

现在,显然如果你最终在800点范围内添加太多火花,这将无法工作并导致无限循环。

var leftPositions = [Int]()
var yWouldOverlap = false
for _ in 0..<randRange(lower: 1, upper: 5){
  //Moved the random number generator to a function
  var newY = Int(randY())
  //Start a loop based on the yWouldOverlap Bool
  repeat{
    yWouldOverlap = false
    //Nested loop to range from +- 100 from the randomly generated Y
    for p in newY - 100...newY + 100{
      //If array already contains one of those values
      if leftPosition.contains(p){
        //Set the loop Bool to true, get a new random value, and break the nested for.
        yWouldOverlap = true
        newY = Int(randY())
        break
      }
    }
  }while(yWouldOverlap)
  //If we're here, the array does not contain the new value +- 100, so add it and move on.
  leftPositions.append(newY)
}

func randY() -> CGFloat{
   return Helper().randomBetweenTwoNumbers(firstNumber: leftSparkMinimumY, secondNumber: leftSparkMaximumY)
}

以下是您的以下代码的不同版本。

for (index,y) in leftPositions.enumerated() {

  let leftSparkNode = SKNode()
  leftSparkNode.position = CGPoint(x:-295,y:CGFloat(y))
  leftSparkNode.name = "LeftSparks\(index)" //All node names should be unique

  let leftSparkTexture = SKTexture(imageNamed: "LeftSpark")
  LeftSpark = SKSpriteNode(texture: leftSparkTexture)

  LeftSpark.name = "LeftSparks"
  LeftSpark.physicsBody = SKPhysicsBody(texture: leftSparkTexture, size: LeftSpark.size)
  LeftSpark.physicsBody?.categoryBitMask = PhysicsCatagory.LeftSpark
  LeftSpark.physicsBody?.collisionBitMask = PhysicsCatagory.Bird
  LeftSpark.physicsBody?.contactTestBitMask = PhysicsCatagory.Bird
  LeftSpark.physicsBody?.isDynamic = false
  LeftSpark.physicsBody?.affectedByGravity = false
  leftSparkNode.addChild(LeftSpark)


  addChild(leftSparkNode)

}