SKNode从触摸点开始缩放

Mik*_*yev 9 scaling pinchzoom sprite-kit sknode

我已将UIPinchGestureRecognizer添加到我的scene.view中以扩展我的内容.我实际上缩放了所有可见内容所在的父节点.但是我的问题虽然有缩放点.东西是从左下角开始的节点比例.这绝对不是我想要的.我是否必须编写大量代码才能从发生挤压的位置进行扩展?您能否提供一些关于如何遵循的提示.

nin*_*een 20

我一直在研究同样的问题,我的解决方案如下所示.不确定这是否是最好的方法,但到目前为止它似乎工作.我正在使用此代码放大和缩小具有多个SKSpriteNode子项的SKNode.孩子们都可以根据需要随着SKNode移动和缩放.缩放的锚点是捏合手势的位置.场景中的父SKScene和其他SKNode不受影响.所有工作都在recognizer.state == UIGestureRecognizerStateChanged期间进行.

// instance variables of MyScene.
SKNode *_mySkNode;
UIPinchGestureRecognizer *_pinchGestureRecognizer;

- (void)didMoveToView:(SKView *)view
{
    _pinchGestureRecognizer = [[UIPinchGestureRecognizer alloc] initWithTarget:self action:@selector(handleZoomFrom:)];
    [[self view] addGestureRecognizer:_pinchGestureRecognizer];
}

// Method that is called by my UIPinchGestureRecognizer.
- (void)handleZoomFrom:(UIPinchGestureRecognizer *)recognizer
{
     CGPoint anchorPoint = [recognizer locationInView:recognizer.view];
     anchorPoint = [self convertPointFromView:anchorPoint];

     if (recognizer.state == UIGestureRecognizerStateBegan) {

         // No code needed for zooming...

     } else if (recognizer.state == UIGestureRecognizerStateChanged) {

         CGPoint anchorPointInMySkNode = [_mySkNode convertPoint:anchorPoint fromNode:self];

         [_mySkNode setScale:(_mySkNode.xScale * recognizer.scale)];

         CGPoint mySkNodeAnchorPointInScene = [self convertPoint:anchorPointInMySkNode fromNode:_mySkNode];
         CGPoint translationOfAnchorInScene = CGPointSubtract(anchorPoint, mySkNodeAnchorPointInScene);

         _mySkNode.position = CGPointAdd(_mySkNode.position, translationOfAnchorInScene);

         recognizer.scale = 1.0;

     } else if (recognizer.state == UIGestureRecognizerStateEnded) {

         // No code needed here for zooming...

     }
}
Run Code Online (Sandbox Code Playgroud)

以下是上面使用的辅助函数.它们来自Ray Wenderlich关于Sprite Kit的书.

SKT_INLINE CGPoint CGPointAdd(CGPoint point1, CGPoint point2) {
    return CGPointMake(point1.x + point2.x, point1.y + point2.y);
}

SKT_INLINE CGPoint CGPointSubtract(CGPoint point1, CGPoint point2) {
    return CGPointMake(point1.x - point2.x, point1.y - point2.y);
}

SKT_INLINE GLKVector2 GLKVector2FromCGPoint(CGPoint point) {
    return GLKVector2Make(point.x, point.y);
}

SKT_INLINE CGPoint CGPointFromGLKVector2(GLKVector2 vector) {
    return CGPointMake(vector.x, vector.y);
}

SKT_INLINE CGPoint CGPointMultiplyScalar(CGPoint point, CGFloat value) {
    return CGPointFromGLKVector2(GLKVector2MultiplyScalar(GLKVector2FromCGPoint(point), value));
}
Run Code Online (Sandbox Code Playgroud)