检测 CGPoint 是不是在正方形(菱形)内的问题
Posted
技术标签:
【中文标题】检测 CGPoint 是不是在正方形(菱形)内的问题【英文标题】:Troubles to detect if a CGPoint is inside a square (diamond-shape)检测 CGPoint 是否在正方形(菱形)内的问题 【发布时间】:2016-08-23 20:15:56 【问题描述】:我有 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")
使用简单的正方形 (A),我的代码可以正常工作。数据是对的。我随时都知道 CGPoint 中心是在正方形的内部还是外部。
但是对于带有旋转 (B) 的正方形,数据不符合预期。只要 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]中,该方法是关于节点而不是框架,所以为什么它不起作用?
【问题讨论】:
可能,您的框架没有使用 alpha 蒙版?您可以使用.physicsBody
和碰撞来获得精确度。我手头没有任何代码,但您可以使用 SKPhysicsContactDelegate.
***.com/questions/27576149/…
我尝试使用 .physicsBody 和碰撞,但是通过这种方法,我知道球何时与正方形接触。这不是我需要的。我对球的中心(CGPoint)和正方形的接触感兴趣。这不完全一样。
好吧,@cmi,我认为您至少仍然可以使用.frame.intersects
,但您必须将框架设置为 alpha 蒙版。现在,它将整个正方形(灰色区域)视为一个接触面,而 alpha 蒙版只会显示蓝色菱形区域。如果我错了,那么我能想到的唯一其他方法就是做数学并减去蓝色钻石周围的 4 个三角形(灰色区域)。
@Fluidity 请看我的编辑,确实菱形正方形的框架是灰色正方形。节点掩码是菱形正方形。
node.contains 不是 SKPhysics 方法,它所做的只是检查它是否在节点坐标系统(框架)内。如果您知道角度,只需找出触摸点相对于节点中心的位置,然后对其应用反向角度旋转,然后使用这个新点检查它是否包含节点
【参考方案1】:
有很多方法可以做到这一点,通常我喜欢使用路径,所以如果你有一个完美的钻石,我想提供一种与 cmets 不同的方法,你可以创建一个完美匹配的路径你的钻石有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
【讨论】:
Ormano ,这几乎正是我正在寻找的(如果它符合我的想法)......一个非常优雅的解决方案,无需“欺骗”它或想出一个花哨的公式。我也会为自己剪掉这个:) 使用 SKShapeNode 似乎是我和 CPU 的最佳解决方案。以上是关于检测 CGPoint 是不是在正方形(菱形)内的问题的主要内容,如果未能解决你的问题,请参考以下文章
在单元测试中点击 UIButton 内的特定 CGPoint
如何设置悬停效果(注意:只有方形边框在悬停时应该像钻石形状一样旋转,而不是图像)[关闭]