Swift 检测物体是否接近墙壁

Swift 检测物体是否接近墙壁,swift,sprite-kit,collision,proximity,Swift,Sprite Kit,Collision,Proximity,我试图写一些非常简单的东西——并在这个实例上使用SpriteKit。 我在其他平台上的做法是,让一个看不见的孩子“棍子”伸出来一点。通过检测看不见的“棍子”之间的碰撞,我可以判断物体是否靠近墙壁。 我试图用SpriteKit复制同样的东西。当然,我更希望有一个看不见的“光束”从物体中射出,给我一个距离——但这可能太麻烦了 我想知道有什么方法可以改进我迄今为止完成的愚蠢的项目 谢谢。这是我想出的不涉及物理的东西 拖动鼠标移动汽车,中心的标签会更新,告诉您到最近的墙的距离。释放鼠标重置汽车 非常简

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

我想知道有什么方法可以改进我迄今为止完成的愚蠢的项目


谢谢。

这是我想出的不涉及物理的东西

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

非常简单的示例,可以更新以提供更精确的测量

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())
  }
}
class游戏场景:SKScene{
let car=SKSpriteNode(颜色:蓝色,尺寸:CGSize(宽度:50,高度:100))
let label=SKLabelNode(文本:“”)
func findNearestWall()->CGFloat{
//您可以通过使用汽车框架边界的CG点,甚至6+点来获得更高的精度,从而使这一点更高级
让closestX:CGFloat={
如果car.position.x<0{//左墙
返回abs(frame.minX-car.position.x)
}else{//右墙
返回abs(frame.maxX-car.position.x)
}
}()
让closestY:CGFloat={
如果car.position.y<0{//底壁
返回abs(frame.minY-car.position.y)
}else{//顶墙
返回abs(frame.maxY-car.position.y)
}
}()
如果closestX
以下是我提出的不涉及物理的建议

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

非常简单的示例,可以更新以提供更精确的测量

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())
  }
}
class游戏场景:SKScene{
let car=SKSpriteNode(颜色:蓝色,尺寸:CGSize(宽度:50,高度:100))
let label=SKLabelNode(文本:“”)
func findNearestWall()->CGFloat{
//您可以通过使用汽车框架边界的CG点,甚至6+点来获得更高的精度,从而使这一点更高级
让closestX:CGFloat={
如果car.position.x<0{//左墙
返回abs(frame.minX-car.position.x)
}else{//右墙
返回abs(frame.maxX-car.position.x)
}
}()
让closestY:CGFloat={
如果car.position.y<0{//底壁
返回abs(frame.minY-car.position.y)
}else{//顶墙
返回abs(frame.maxY-car.position.y)
}
}()
如果closestX
holy crap这是一个mac项目:)我这样做了Toohy crap这是一个mac项目:)我这样做了tooThat;'这很好,但我需要一个向量-它将被传递给AI。它需要是来自汽车或任何其他对象的预定义向量。计算距离相当容易,如果这是我所需要的,我会这么做的。@GregJaskiewicz我很困惑。你能在你的问题中再详细说明一下吗?也许可以用图表。想象你们从正方形中画出4条线——在任意方向的中心15度和30度处。类似于我在这个问题所附的项目中所做的尝试这很好,但我需要一个向量-它将被传递给AI。它需要是来自汽车或任何其他对象的预定义向量。计算距离相当容易,如果这是我所需要的,我会这么做的。@GregJaskiewicz我很困惑。你能在你的问题中再详细说明一下吗?也许可以用图表。想象你们从正方形中画出4条线——在任意方向的中心15度和30度处。类似于我在这个问题所附项目中的尝试。