我一直在努力解决这个问题并希望得到一些帮助!
我在精灵套件中有一个瓷砖地图,用户可以点击任何瓷砖和事情发生。为了获得他们使用的瓷砖,我使用这样的东西:
-(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
答案 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);
}