gpt4 book ai didi

ios - 检测 CGPoint 是否在正方形(菱形)内的问题

转载 作者:搜寻专家 更新时间:2023-10-30 22:16:01 26 4
gpt4 key购买 nike

我有 2 个 SKSpriteNode:

  • 一个简单的正方形 (A)
  • 旋转(-45°)(B)的同一个正方形

我需要随时检查另一个 SKSpriteNode(一个球)的中心是否在这些方 block 之一内。球和方 block 具有相同的父级(主场景)。

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 位于包含菱形的正方形中,就会在内部检测到 CGPoint。

demo

SKSpriteNode 方 block 是通过关卡编辑器创建的。

我怎样才能得到菱形的正确结果?

编辑 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
}

关于ios - 检测 CGPoint 是否在正方形(菱形)内的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39109966/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com