У меня возникла проблема с быстрым при создании SKShapeNode, где кажется, что моя координата «y» инвертирована.Координаты SKShapeNode кажутся обратными при использовании UIPanGestureRecognizer
Первоначально я размещаю узел в нижней части экрана и добавляю физическое тело (которое помещается правильно, учитывая, что я превратил set skView.showsPhysics в true и проверил это), но всякий раз, когда я пытаюсь взаимодействовать с узлом с UIPanGestureRecognizer он не будет двигаться, если я не взаимодействую с самой верхней, противоположной стороной экрана. Я обнаружил, что он будет реагировать независимо от того, где находится узел, но я должен инвертировать местоположение Y моего ввода.
Кроме того, если я перетаскиваю вниз по перевернутому местоположению, узел будет двигаться вниз, поэтому в некотором смысле он не полностью инвертирован тем, что он все равно будет взаимодействовать в правильном направлении.
На данный момент я считаю, что это имеет какое-то отношение к различным системам координат, но я не смог изолировать, какая часть моего кода вызывает проблему. Я включил свой код ниже.
override func didMoveToView(view: SKView){
let gestureRecognizer = UIPanGestureRecognizer(target: self, action: Selector("handlePan:"))
self.view?.addGestureRecognizer(gestureRecognizer)
physicsWorld.gravity = CGVector(dx: 0.0, dy: -2.0)
physicsWorld.contactDelegate = self
let userShape = SKShapeNode(rectOfSize: CGSize(width: 30, height: 30))
userShape.position = CGPointMake(self.frame.size.width/2, userShape.frame.size.height/2)
userShape.name = "userShape"
userShape.fillColor = SKColor.blueColor()
userShape.physicsBody = SKPhysicsBody(rectangleOfSize: CGSize(width: 30, height: 30))
userShape.physicsBody?.dynamic = true
userShape.physicsBody?.affectedByGravity = false
userShape.physicsBody?.mass = 0.02
userShape.physicsBody?.friction = 0.0
userShape.physicsBody?.restitution = 0.5
addChild(userShape)
}
мой обработчик
func handlePan(recognizer: UIPanGestureRecognizer!)
{
switch recognizer.state{
case .Began:
var touchLocation = recognizer.locationInView(recognizer.view!)
selectNodeForTouch(touchLocation)
case .Changed:
var translation = recognizer.translationInView(recognizer.view!)
translation = CGPointMake(translation.x, translation.y)
self.panForTranslation(translation)
recognizer.setTranslation(CGPointZero, inView: recognizer.view!)
case .Ended:
var velocity = recognizer.velocityInView(recognizer.view)
_selectedNode.physicsBody!.applyImpulse(CGVectorMake(velocity.x * velocityController, velocity.y * velocityController * -1.0))
default:
break;
}
}
func panForTranslation(translation: CGPoint)
{
var position = _selectedNode.position
print(_selectedNode.position)
_selectedNode.position = CGPointMake(position.x + translation.x, position.y - translation.y)
}
func selectNodeForTouch(touchLocation: CGPoint)//NODE SELECTOR
{
var touchedNode = nodeAtPoint(touchLocation)
_selectedNode = touchedNode
}