我正在关注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来自左上角?
答案 0 :(得分:4)
你想要SKScene中的touchLocation,而不是UIView。
改变:
CGPoint touchLocation = [touch locationInView:self.view];
到:
CGPoint touchLocation = [touch locationInNode:self];
答案 1 :(得分:1)
问题在于SprikeKit的坐标系来自左下角,而UIKit的坐标系起源于右上角。因此触摸事件的坐标位于UIkit的coord系统中,而SKNode正在SpriteKit的系统中移动。一旦我理解了这种差异,就很容易解决。