저는이 코드를 꽤 오랫동안 사용 해왔습니다.하지만 앞으로 한 걸음 더 나아가 두 단계 뒤로 돌아가고 있습니다. 나는 누군가가 나를 도울 수 있기를 바라고있다.Sprite-Kit Pinch로 확대/축소 문제 UIPinchGestureRecognizer
나는 렌더링, UI 및 터치 컨트롤을 관리하는 장면 파일을 가지고 있으므로 Sprite Kit로 작업하고 있습니다. 나는 SKNode 이잖아 그래서 같은 카메라와 같은 기능이 있습니다
_world = [[SKNode alloc] init];
[_world setName:@"world"];
[self addChild:_world];
내가 UIGestureRecognizer를 사용하고, 그래서 내가과 같이 필요한 사람 추가 : 팬이 좋아을하고있다
_panRecognizer = [[UIPanGestureRecognizer alloc]initWithTarget:self action:@selector(handlePanFrom:)];
[[self view] addGestureRecognizer:_panRecognizer];
_pinchRecognizer = [[UIPinchGestureRecognizer alloc]initWithTarget:self action:@selector(handlePinch:)];
[[self view] addGestureRecognizer:_pinchRecognizer];
,하지만 잘되지 . 곤란한 것이 진짜 문제입니다. . 끼에 대한 아이디어는 여기에, 화면의 중앙에 점을 잡아 세계 노드에 그 시점을 변환 한 다음에 확대하면서 이동하는 것입니다 곤란하게하는 방법이다 : 나는 '
-(void) handlePinch:(UIPinchGestureRecognizer *)sender {
if (sender.state == UIGestureRecognizerStateBegan) {
_tempScale = [sender scale];
}
if (sender.state == UIGestureRecognizerStateChanged) {
if([sender scale] > _tempScale) {
if (_world.xScale < 6) {
//_world.xScale += 0.05;
//_world.yScale += 0.05;
//[_world setScale:[sender scale]];
[_world setScale:_world.xScale += 0.05];
CGPoint screenCenter = CGPointMake(_initialScreenSize.width/2, _initialScreenSize.height/2);
CGPoint newWorldPoint = [self convertTouchPointToWorld:screenCenter];
//crazy method why does this work
CGPoint alteredWorldCenter = CGPointMake(((newWorldPoint.x*_world.xScale)*-1), (newWorldPoint.y*_world.yScale)*-1);
//why does the duration have to be exactly 0.3 to work
SKAction *moveToCenter = [SKAction moveTo:alteredWorldCenter duration:0.3];
[_world runAction:moveToCenter];
}
} else if ([sender scale] < _tempScale) {
if (_world.xScale > 0.5 && _world.xScale > 0.3){
//_world.xScale -= 0.05;
//_world.yScale -= 0.05;
//[_world setScale:[sender scale]];
[_world setScale:_world.xScale -= 0.05];
CGPoint screenCenter = CGPointMake(_initialScreenSize.width/2, _initialScreenSize.height/2);
CGPoint newWorldPoint = [self convertTouchPointToWorld:screenCenter];
//crazy method why does this work
CGPoint alteredWorldCenter = CGPointMake(((newWorldPoint.x*_world.xScale - _initialScreenSize.width)*-1), (newWorldPoint.y*_world.yScale - _initialScreenSize.height)*-1);
SKAction *moveToCenter = [SKAction moveTo:alteredWorldCenter duration:0.3];
[_world runAction:moveToCenter];
}
}
}
if (sender.state == UIGestureRecognizerStateEnded) {
[_world removeAllActions];
}
}
이것에 대한 많은 반복을 시도했지만,이 정확한 코드는 내가 세상의 한 지점을 꼬집는 것에 가장 가깝게 만드는 것입니다. 그러나 몇 가지 문제가 있습니다. 당신이 센터에서 더 멀리 나아감에 따라, 그것은 여전히 잘 작동하지 않습니다. 그것은 거의 세상의 중심을 확대하려고 시도하기 때문입니다. 중심점을 월드 노드로 변환 한 후, 다시 중심을 맞추기 위해 다시 조작해야합니다 (공식은 내가 미친 듯이 묘사합니다). 그리고 그것은 작동하기 위해 줌인과 줌아웃을 위해 달라야 만합니다. 이동 액션의 지속 시간은 0.3으로 설정해야합니다. 그렇지 않으면 거의 작동하지 않습니다. 높거나 낮은 위치이며 중심점을 확대하지 않습니다. 줌을 조금씩 늘리려고하면 미친 듯 빠르게 움직입니다. 핀치가 끝났을 때 작업을 끝내지 않으면 화면이 멍청 해집니다. 나는 이것이 왜 작동하는지 이해하지 못한다. (딜레이가 끝나기 전에 중심점을 부드럽게 줌하고 스크린 바보 스) 나는 내가 뭘 잘못하고 있는지 확신 할 수 없다. 어떤 도움을 많이 주시면 감사하겠습니다!
해당 페이지에 대한 귀하의 답변은 실제로 완벽하게 작동했습니다. 나는 너에게 충분히 감사 할 수 없다! 패닝 코드를 게시하는 방법은 무엇입니까? 당신의 접근 방식을보고 싶어할지 궁금합니다. – bazola
예. 패닝은 실제로 훨씬 쉽습니다. 난 방금 위의 내 대답에 패닝에 대한 내 코드를 추가했습니다. – ninefifteen
고마워, 많이 도와 줬어! :디 – animaonline