SKAction move应该下降时上升

时间:2014-02-22 00:43:01

标签: ios coordinates sprite-kit

我正在关注SpriteKit教程here创建一个简单的精灵套件射击游戏,在那里你制造一艘太空飞船射击小行星的激光。

我想让激光(每个激光是SKSpriteNode)移动到我点击的位置。我正在方法touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event内正确接触。但是,当我在SKSpriteNode上设置SKAction时,它会在我单击的位置的y方向OPPOSITE上移动。即图像窗口具有宽度(x)500和高度(y)400。当我在坐标(300,100)处触摸屏幕时,激光器似乎移动到坐标(300,300)。

我已经确认touchLocation中的坐标是正确的。

仅供参考我只使用了iPhone模拟器 - 但这应该不重要,是吗?

相关代码段:

- (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:@"laserFired"];
}
编辑:我想知道它是否与SprikeKit的坐标系来自左下角这一事实有关,而UIKit来自左上角?

2 个答案:

答案 0 :(得分:4)

你想要SKScene中的touchLocation,而不是UIView。

改变:

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

到:

CGPoint touchLocation = [touch locationInNode:self];

答案 1 :(得分:1)

问题在于SprikeKit的坐标系来自左下角,而UIKit的坐标系起源于右上角。因此触摸事件的坐标位于UIkit的coord系统中,而SKNode正在SpriteKit的系统中移动。一旦我理解了这种差异,就很容易解决。