【发布时间】: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.stackoverflow.com/questions/27576149/… -
我尝试使用 .physicsBody 和碰撞,但是通过这种方法,我知道球何时与正方形接触。这不是我需要的。我对球的中心(CGPoint)和正方形的接触感兴趣。这不完全一样。
-
好吧,@cmi,我认为您至少仍然可以使用
.frame.intersects,但您必须将框架设置为 alpha 蒙版。现在,它将整个正方形(灰色区域)视为一个接触面,而 alpha 蒙版只会显示蓝色菱形区域。如果我错了,那么我能想到的唯一其他方法就是做数学并减去蓝色钻石周围的 4 个三角形(灰色区域)。 -
@Fluidity 请看我的编辑,确实菱形正方形的框架是灰色正方形。节点掩码是菱形正方形。
-
node.contains 不是 SKPhysics 方法,它所做的只是检查它是否在节点坐标系统(框架)内。如果您知道角度,只需找出触摸点相对于节点中心的位置,然后对其应用反向角度旋转,然后使用这个新点检查它是否包含节点
标签: ios swift sprite-kit collision-detection skspritenode