检测 CGPoint 是否在正方形(菱形)内的问题
Troubles to detect if a CGPoint is inside a square (diamond-shape)
我有2个SKSpriteNode:
- 一个简单的正方形(A)
- 旋转(-45°)(B)的同一个正方形
我需要随时检查另一个 SKSpriteNode(一个球)的中心是否在这些方块之一内。
球和方块有相同的父级(主场景)。
override func update(_ currentTime: TimeInterval) {
let spriteArray = self.nodes(at: ball.position)
let arr = spriteArray.filter {[=10=].name == "square"}
for square in arr {
print(square.letter)
if(square.contains(self.puck.position)) {
print("INSIDE")
}
}
}
对于简单的方块 (A),我的代码可以正常工作。数据是对的。我知道,在任何时候,CGPoint 中心是在广场内还是广场外。
但是对于带有旋转 (B) 的正方形,数据不是我们想要的。一旦 CGPoint 位于包含菱形的正方形中,就会在内部检测到 CGPoint。
SKSpriteNode 方块是通过关卡编辑器创建的。
我怎样才能得到菱形的正确结果?
编辑 1
使用
view.showsPhysics = true
我可以看到所有带physicsBody的SKSpriteNode的边界。我的菱形方块的边界是菱形方块而不是灰色方块区域。
square.frame.size -> return the grey area
square.size -> return the diamond-square
Apple 文档func nodes(at p: CGPoint) -> [SKNode]中的方法是关于节点而不是框架,为什么它不起作用?
有很多方法可以做到这一点,通常我喜欢使用路径,所以,如果你有一颗完美的钻石,就像你描述的那样,我想提供一种不同于评论的方法,你可以创建一个匹配的路径使用 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
}
我有2个SKSpriteNode:
- 一个简单的正方形(A)
- 旋转(-45°)(B)的同一个正方形
我需要随时检查另一个 SKSpriteNode(一个球)的中心是否在这些方块之一内。 球和方块有相同的父级(主场景)。
override func update(_ currentTime: TimeInterval) {
let spriteArray = self.nodes(at: ball.position)
let arr = spriteArray.filter {[=10=].name == "square"}
for square in arr {
print(square.letter)
if(square.contains(self.puck.position)) {
print("INSIDE")
}
}
}
对于简单的方块 (A),我的代码可以正常工作。数据是对的。我知道,在任何时候,CGPoint 中心是在广场内还是广场外。
但是对于带有旋转 (B) 的正方形,数据不是我们想要的。一旦 CGPoint 位于包含菱形的正方形中,就会在内部检测到 CGPoint。
SKSpriteNode 方块是通过关卡编辑器创建的。
我怎样才能得到菱形的正确结果?
编辑 1
使用
view.showsPhysics = true
我可以看到所有带physicsBody的SKSpriteNode的边界。我的菱形方块的边界是菱形方块而不是灰色方块区域。
square.frame.size -> return the grey area
square.size -> return the diamond-square
Apple 文档func nodes(at p: CGPoint) -> [SKNode]中的方法是关于节点而不是框架,为什么它不起作用?
有很多方法可以做到这一点,通常我喜欢使用路径,所以,如果你有一颗完美的钻石,就像你描述的那样,我想提供一种不同于评论的方法,你可以创建一个匹配的路径使用 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
}