检测CGPoint是否在正方形(菱形)内的麻烦

cmi*_*mii 6 collision-detection ios sprite-kit skspritenode swift

我有2个SKSpriteNode:

  • 一个简单的方块(A)
  • 相同的方形旋转(-45°)(B)

我需要随时检查另一个SKSpriteNode(一个球)的中心是否位于其中一个方格内.球和方块具有相同的父级(主场景).

override func update(_ currentTime: TimeInterval) {

    let spriteArray = self.nodes(at: ball.position)

    let arr = spriteArray.filter {$0.name == "square"}

    for square in arr {
        print(square.letter)

        if(square.contains(self.puck.position)) {
             print("INSIDE")
        }

    }
}
Run Code Online (Sandbox Code Playgroud)

使用简单的方形(A),我的代码可以正常工作.数据是对的.我知道,在任何时候,如果CGPoint中心位于广场内部或外部.

但是对于具有旋转(B)的正方形,数据不是所希望的.CGPoint在包含钻石形状的正方形中被检测到.

演示

SKSpriteNode方块通过关卡编辑器创建.

如何才能获得钻石形状的正确结果?

编辑1

运用

view.showsPhysics = true
Run Code Online (Sandbox Code Playgroud)

我可以看到所有SKSpriteNode与physicsBody的界限.我的钻石方形的边界是菱形方形而不是灰色方形区域.

 square.frame.size -> return the grey area
 square.size -> return the diamond-square
Run Code Online (Sandbox Code Playgroud)

在Apple文档中,func节点(在p:CGPoint) - > [SKNode],该方法是关于节点而不是帧,那么为什么它不起作用?

Ale*_*ano 2

有很多方法可以做到这一点,通常我喜欢使用路径,因此,如果您有您所描述的完美钻石,我想提供与评论不同的方式,您可以创建一条与您的钻石完美匹配的路径UIBezierPath因为它有方法containsPoint

let f = square.frame
var diamondPath = UIBezierPath.init()
diamondPath.moveToPoint(CGPointMake(f.size.width-f.origin.x,f.origin.y))
diamondPath.addLineToPoint(CGPointMake(f.origin.x,f.size.height-f.origin.y))
diamondPath.addLineToPoint(CGPointMake(f.size.width-f.origin.x,f.size.height))
diamondPath.addLineToPoint(CGPointMake(f.size.width,f.size.height-f.origin.y))
diamondPath.closePath()
if diamondPath.containsPoint(<#T##point: CGPoint##CGPoint#>) {
   // point is inside diamond
}
Run Code Online (Sandbox Code Playgroud)