Problemas para detectar si un CGPoint está dentro de un cuadrado (forma de diamante)

Tengo 2 SKSpriteNode:

  • un cuadrado simple (A)
  • el mismo cuadrado con una rotation (-45 °) (B)

Necesito verificar, en cualquier momento, si el centro de otro SKSpriteNode (una bola) está dentro de uno de estos cuadrados. La pelota y las casillas tienen el mismo padre (la escena principal).

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") } } } 

Con el cuadrado simple (A), mi código funciona correctamente. Los datos son correctos. Sé, en cualquier momento, si el centro de CGPoint está dentro o fuera del cuadrado.

Pero con el cuadrado con la rotation (B), los datos no son los deseados. El CGPoint se detecta en el interior tan pronto como está en el cuadrado que contiene la forma de diamante.

manifestación

Los cuadrados SKSpriteNode se crean a través del editor de niveles.

¿Cómo puedo hacer para get el resultado correcto para la forma de diamante?

EDIT 1

Utilizando

 view.showsPhysics = true 

Puedo ver los límites de todo SKSpriteNode con physicsBody. Los límites de mi cuadrado de diamante son el cuadrado de diamante y no el cuadrado gris.

  square.frame.size -> return the grey area square.size -> return the diamond-square 

En la documentation de Apple, los nodos func (en p: CGPoint) -> [SKNode] , el método trata sobre el nodo y no el marco, entonces ¿por qué no funciona?

Hay muchas forms de hacerlo, por lo general me gusta trabajar con routes, así que, si tienes un diamante perfecto como lo describes, me gustaría ofrecer una forma diferente de los comentarios, podrías crear un path que coincida perfectamente con tu diamante con UIBezierPath porque tiene el método 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 }