gpt4 book ai didi

ios - SpriteKit : Why containsPoint of SKNode returns false

转载 作者:行者123 更新时间:2023-11-28 08:31:48 25 4
gpt4 key购买 nike

我有一个 SKNode,其中 userInteractionEnabled=true 和 touchesEnded 被覆盖。

因为 touchesEnded 会在任何时候被调用,即使当我将手指移出 SKNode 时,我想确保触摸在 SKNode 内结束,只有这样我才想将其计为有效点击。

所以我做了以下事情:

class Tile : SKNode {
var level:Int!
init(tileWidth: CGFloat, level: Int) {
super.init()
self.name = "lvlseltile"
self.level = Int(level)
self.userInteractionEnabled = true
let node = SKShapeNode(rect: CGRect(x: 0, y: 0, width: tileWidth, height: tileWidth))
node.fillColor = UIColor.grayColor()
self.addChild(node)
let textNode = SKLabelNode(text: String(level))
textNode.fontSize = 24
textNode.fontColor = UIColor.whiteColor()
textNode.horizontalAlignmentMode = .Center
textNode.verticalAlignmentMode = .Center
textNode.position = CGPoint(x: tileWidth/2, y: tileWidth/2)
self.addChild(textNode)
}

required init?(coder aDecoder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}

override func touchesEnded(touches: Set<UITouch>, withEvent event: UIEvent?) {
let location = touches.first?.locationInNode(self)
if self.containsPoint(location!) {
print("tapped tile")
}
}
}

由于我检查当前节点中的位置,所以我从当前 SKNodes 坐标系中获取相对坐标。

但是 self.containsPoint 总是返回 FALSE。我的 SKNode 是 40x40 大,我的触摸大约是 20x20,所以在节点的中心,但它仍然返回 FALSE。

为什么?

我知道如果 x>0 && x<=40 和 y>= 且 y<=40,我可以做一个解决方法,比如检查触摸位置。但这是我真正期望 self.containsPoint 做的。我做错了什么?

最佳答案

SKNode 的宽度和高度等于0

这就是为什么触摸结束位置总是在SKNode之外的原因。

SKNodeframe.size 值实际上不同于需要绘制一些内容的子类的零,例如 SKSpriteNodeSKLabelNode.

来自official docs :

The frame property provides the bounding rectangle for a node’s visual content, modified by the scale and rotation properties. The frame is non-empty if the node’s class draws content. Each node subclass determines the size of this content differently. In some subclasses, the size of the node’s content is declared explicitly, such as in the SKSpriteNode class. In other subclasses, the content size is calculated implicitly by the class using other object properties. For example, an SKLabelNode object determines its content size using the label’s message text and font characteristics.

那么为什么 touchesEnded 在面积为 0 的 SKNode 上被调用?

我不知道。我创建了一个测试 SpriteKit 项目,并将我的自定义 SKNode 添加到场景中。

class MyNode: SKNode {

override init() {
super.init()
userInteractionEnabled = true
}

required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
userInteractionEnabled = true
}

override func touchesEnded(touches: Set<UITouch>, withEvent event: UIEvent?) {
print("touchesEnded!")
}
}

然而,经过多次测试后,我无法点击它(正如预期的那样,因为它的面积为 0)。我不知道您如何设法将 SKNode 的大小设置为 40 x 40 以及为什么touchesEnded 被触发。如果您愿意,可以向我展示更多代码。

关于ios - SpriteKit : Why containsPoint of SKNode returns false,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38730214/

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