您的代码是正确的,但您可能应该查看场景的起源。你确定你能看到你的形状吗?
默认情况下,场景的原点位于视图的左下角。因此,默认场景的高度为 1024,宽度为 768,原点 (0,0) 在左下角,(1024,768) 坐标在右上角。frame 属性包含 (0,0)-(1024,768)。
假设您有使用问题代码的示例:
let tileSize = CGSizeMake(150.0,150.0)
// Your code:
let isometricPath = CGPathCreateMutable()
CGPathMoveToPoint(isometricPath, nil, 0, -(tileSize.height / 2))
CGPathAddLineToPoint(isometricPath, nil, (tileSize.width / 2), 0)
CGPathAddLineToPoint(isometricPath, nil, 0, (tileSize.height / 2))
CGPathAddLineToPoint(isometricPath, nil, -(tileSize.width / 2), 0)
CGPathCloseSubpath(isometricPath)
这条路径代表一个菱形。
现在,如果我想绘制这个形状,我可以这样做:
let shape = SKShapeNode.init(path: isometricPath)
shape.strokeColor = SKColor.yellowColor()
shape.fillColor = SKColor.blueColor()
self.addChild(shape)
但没有显示任何内容,因为我的场景原点从 0.0 开始,并且您的形状具有负值。
为了显示我的菱形,我可以简单地将场景锚点更改为:
self.anchorPoint = CGPointMake(0.5,0.5)
这将场景的原点居中在视图的中间(Apple docs),您可以看到您的图块:
现在假设您想知道一个点是否在您的形状内:
let locationInNode = CGPointMake(tileSize.width/15,tileSize.height/15)
// this point is definitely inside the rhombus
我想简单地展示这一点以进行调试:
let circle = SKShapeNode.init(circleOfRadius: 5)
circle.strokeColor = SKColor.whiteColor()
circle.fillColor = SKColor.whiteColor()
self.addChild(circle)
circle.position = locationInNode
现在我们可以检查这个点是否在菱形内部:
let isometricPathRef = isometricPath as CGPathRef
print(CGPathContainsPoint(isometricPathRef, nil, locationInNode, true))
输出: