У меня есть 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
? - person Luca Angeletti   schedule 03.08.2016SKNode
, и это правильно. Чего я не понимаю, так это почему вы получаете события касания на своем SKNode... - person Luca Angeletti   schedule 03.08.2016print('touchesEnded')
в качестве первой строки вашего методаtouchesEnded
и дайте мне знать, если вы увидите это в журнале. - person Luca Angeletti   schedule 03.08.2016