检测物体与墙壁的接近程度

时间:2017-10-29 12:32:55

标签: swift sprite-kit collision proximity

我正在尝试写一些非常简单的东西 - 并在此实例上使用SpriteKit。 我在其他平台上做的方式是让一个看不见的孩子“棒”伸出一点点。通过检测隐形“棍棒”之间的碰撞,我可以判断物体是否靠近墙壁。 我试图使用SpriteKit复制相同的东西。当然,我更喜欢从物体上出来一个看不见的“光束”并给我一点距离 - 但这可能太麻烦了。

我会采用任何方式来改进我到目前为止的愚蠢项目。

My Project so far

感谢。

1 个答案:

答案 0 :(得分:0)

以下是我提出的不涉及物理的内容......

拖动鼠标移动汽车,中心的标签会更新,告诉您距离最近的墙壁的距离。释放鼠标以重置汽车。

非常简单的例子,可以更新以提供更准确的测量结果。

class GameScene: SKScene {


  let car = SKSpriteNode(color: .blue, size: CGSize(width: 50, height: 100))
  let label = SKLabelNode(text: "")


  func findNearestWall() -> CGFloat {

    // you can make this more advanced by using the CGPoint of the frame borders of the car, or even 6+ points for more accuracy

    let closestX: CGFloat = {

      if car.position.x < 0 { // left wall
        return abs(frame.minX - car.position.x)
      } else { // right wall
        return abs(frame.maxX - car.position.x)
      }
    }()

    let closestY: CGFloat = {
      if car.position.y < 0 { // bottom wall
        return abs(frame.minY - car.position.y)
      } else { // top wall
        return abs(frame.maxY - car.position.y)
      }
    }()

    if closestX < closestY {
      return closestX.rounded() // as closest wall distance
    } else {
      return closestY.rounded() // as closest wall distance
    }
  }


  override func didMove(to view: SKView) {
    removeAllChildren()
    label.fontSize *= 2
    addChild(car)
    addChild(label)
  }

  override func mouseDown(with event: NSEvent) {
  }

  override func mouseDragged(with event: NSEvent) {
    let location = event.location(in: self)
    car.position = location
  }

  override func mouseUp(with event: NSEvent) {
    car.position = CGPoint.zero
  }

  override func didEvaluateActions() {
    label.text = String(describing: findNearestWall())
  }
}