0

У меня возникла проблема с быстрым при создании 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 

} 

ответ

0

Я понял, что он имеет дело с какой-то разговор координатных систем. В handlePan внутри оператора .begin я разместил эту строку непосредственно после создания переменной touchLocation «touchLocation = self.convertPointFromView (touchLocation)», и, похоже, эта проблема устранена.

Смежные вопросы