2013-11-21 1 views
0

Я боролся с этим какое-то время и хотел бы помочь!locationInNode: неточно после масштабирования сцены

У меня есть карта плитки в наборе спрайтов, пользователь может использовать любую плитку, и все происходит. Чтобы получить плитку они повернутую на, я использую что-то вроде этого:

-(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: вернет неправильные координаты, и поэтому будет выбрана другая плитка для той, которую я использовал.

Я что-то не так?

Edit: Я создал образ, чтобы проиллюстрировать мою проблему в ответ Андрею, что может помочь: http://i.imgur.com/N1XcyNx.png

ответ

0

Что приходит на увеличение/уменьшение, вы не должны масштабировать сцену (например, она подсказывает, если вы попробуете setScale). Вы должны изменить его размер.

Попробуйте это:

После инициализации: myScene.scaleMode = SKSceneScaleModeAspectFill;

, а затем во время трансфокации:

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

A-ha! Большое спасибо, это то, что я делал неправильно. – Koonga

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... 

} 
+0

спасибо вашей Ваша помощь партнера. К сожалению, у меня такая же проблема, вот образ для иллюстрации: http://i.imgur.com/N1XcyNx.png – Koonga

+0

Я думал, что добавлю немного больше информации, если это поможет: у меня есть слой SKScene, который это то, что становится масштабированным. Внутри сцены находится только один дочерний узел с именем _worldNode, внутри _worldNode - узел _mapLayer, который содержит карту (и в конечном итоге также будет содержать другие слои, но будет беспокоиться об этом, когда я пройду эту проблему!). – Koonga

 Смежные вопросы

  • Нет связанных вопросов^_^