locationInNode:缩放场景后不准确

时间:2013-11-21 06:32:05

标签: ios objective-c ios7 sprite-kit

我一直在努力解决这个问题并希望得到一些帮助!

我在精灵套件中有一个瓷砖地图,用户可以点击任何瓷砖和事情发生。为了获得他们使用的瓷砖,我使用这样的东西:

-(void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event {

    UITouch *touch = [touches anyObject];
    CGPoint touchLocation = [touch locationInNode:_mapLayer];
    SKNode *tile = [_mapLayer nodeAtPoint:touchLocation];

    // Do things with the tile...

}

但是,我还希望用户能够放大和缩小以便在需要时更好地查看地图。这很容易,我设置了一个捏合识别器并使用以下方式缩放场景:

-(void)handlePinch:(UIPinchGestureRecognizer *)recognizer {
    [self runAction:[SKAction scaleBy:recognizer.scale duration:0]];
}

一切正常,但一旦场景的规模以外的任何大于1.0时,locationInNode:方法返回错误的坐标,从而导致nodeAtPoint:返回错误的瓷砖。

例如,如果我在比例为1.0时点击一个牌,那么一切正常。但是,如果我缩放场景低至0.9规模,并轻敲同一瓦片,locationInNode:返回错误的坐标,并且因此不同的瓦片的一个I抽头信息将被选择。

我做错了吗?

修改:我创建了一张图片来说明我对安德烈的回答可能会有所帮助: http://i.imgur.com/N1XcyNx.png

2 个答案:

答案 0 :(得分:2)

尝试一下:

-(void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event {

    UITouch *touch = [touches anyObject];
    CGPoint touchLocationInView = [touch locationInView:self.scene.view];
    CGPoint touchLocationInScene = [self.scene convertPointFromView:
                                    touchLocationInView];
    CGPoint touchLocationInLayer = [_mapLayer convertPoint:touchLocationInScene
                                                 fromNode:self.scene];
    SKNode *tile = [_mapLayer nodeAtPoint:touchLocationInLayer];

    // Do things with the tile...

}

答案 1 :(得分:0)

放大/缩小的内容,你不应该缩放场景(如果尝试使用setScale,就会提示)。你应该调整它的大小。

试试这个:

初始化后:myScene.scaleMode = SKSceneScaleModeAspectFill;

然后在缩放时:

-(void)handlePinch:(UIPinchGestureRecognizer *)recognizer 
{
   float newX = // calculate scaled X
   float newY = // calculate scaled Y
   self.size = CGSizeMake(newX, newY);
}