SKAction moveTo sube cuando debe bajar

Estaba siguiendo el tutorial de SpriteKit aquí para crear un juego de disparos simple de sprites, donde creas una nave espacial que dispara rayos láser en asteroides.

Quiero hacer que el láser (cada láser es un SKSpriteNode) se mueva hasta el punto en que hago clic. Estoy tocando correctamente dentro del método touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event . Sin embargo, cuando SKAction una SKAction en el SKSpriteNode, se mueve en la dirección y OPUESTA de donde hago clic. Es decir, la window tiene ancho (x) 500 y alto (y) 400. Cuando toco la pantalla en la coorderada (300, 100), el lazer parece moverse a la coorderada (300, 300).

He verificado que las coorderadas en touchLocation son correctas.

Para su información, solo he usado el simulador de iPhone para esto, pero eso no debería importar, ¿no?

Fragmento de código relevante:

 - (void) touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event { SKSpriteNode *shipLaser = [_shipLasers objectAtIndex:_nextShipLaser]; shipLaser.position = CGPointMake(_ship.position.x+shipLaser.size.width,_ship.position.y+0); shipLaser.hidden = NO; [shipLaser removeAllActions]; UITouch *touch = [touches anyObject]; CGPoint touchLocation = [touch locationInView:self.view]; SKAction *laserMoveAction = [SKAction moveTo:touchLocation duration:0.5]; SKAction *laserDoneAction = [SKAction runBlock:(dispatch_block_t)^() { shipLaser.hidden = YES; }]; SKAction *moveLaserActionWithDone = [SKAction sequence:@[laserMoveAction,laserDoneAction]]; [shipLaser runAction:moveLaserActionWithDone withKey:@"laserFinetworking"]; } 

EDIT: Me pregunto si podría tener que ver con el hecho de que el sistema de coorderadas SprikeKit se origina desde la esquina inferior izquierda, mientras que UIKit se origina desde la esquina superior izquierda.

Desea la location táctil en el SKScene, no en la UIView.

cambio :

 CGPoint touchLocation = [touch locationInView:self.view]; 

a :

 CGPoint touchLocation = [touch locationInNode:self]; 

El problema fue que el sistema de coorderadas de SprikeKit se origina en la esquina inferior izquierda, a diferencia del sistema de coorderadas de UIKit que se origina en la esquina superior derecha. Entonces, las coorderadas para el evento táctil estaban en el sistema coord de UIkit, y el SKNode se estaba moviendo en el sistema de SpriteKit. Una vez que entendí esta diferencia, fue bastante fácil de solucionar.