在Cocos2d中设置图层上的锚点,以便进行缩放以无法按预期工作

时间:2014-06-12 07:56:04

标签: ios cocos2d-iphone

现在我正在尝试在我的Cocos2D游戏中实现一个缩放到缩放功能,我遇到了非常奇怪的行为。我的目标是使用UIPinchGestureRecognizer的处理程序来缩放当玩家捏住屏幕时代表游戏关卡的CCNode之一。这具有缩放的效果。

问题在于,如果我将用于缩放的锚设置为某个任意值,例如.5,.5(级别CCNode的中心),它会在关卡中心周围完美缩放,但我想围绕中心缩放玩家的观点。这是看起来像:

- (void) handlePinchFrom:(UIPinchGestureRecognizer*) recognizer
{
if(recognizer.state == UIGestureRecognizerStateEnded)
{
    _isScaling = false;
    _prevScale = 1.0;
}
else
{
    _isScaling = true;
    float deltaScale = 1.0 - _prevScale + recognizer.scale;

    // Obtain the center of the camera.
    CGPoint center = CGPointMake(self.contentSize.width/2, self.contentSize.height/2);
    CGPoint worldPoint = [self convertToWorldSpace:center];
    CGPoint areaPoint = [_area convertToNodeSpace:worldPoint];

    // Now set anchor point to where areaPoint is relative to the whole _area contentsize
    float areaLocationX = areaPoint.x / _area.contentSize.width;
    float areaLocationY = areaPoint.y / _area.contentSize.height;

    [_area moveDebugParticle:areaPoint];
    [_area setAnchorPoint:CGPointMake(areaLocationX, areaLocationY)];

    if (_area.scale*deltaScale <= ZOOM_RADAR_THRESHOLD)
    {
        _area.scale = ZOOM_RADAR_THRESHOLD;
    }
    else if (_area.scale*deltaScale >= ZOOM_MAX)
    {
        _area.scale = ZOOM_MAX;
    }
    else
    {
        // First set the anchor point.
        _area.scale *= deltaScale;
    }

    _prevScale = recognizer.scale;
}
}

如果我将锚点设置为.5,.5并使用CCLog打印计算的锚点(areaLocationX,areaLocationY),它看起来是正确的,但是当我将锚点设置为这些值时,图层会失控并且完全离开了玩家的视野。锚点具有像(-80,10)这样的疯狂值,尽管通常它应该相对接近0到1范围内的某个坐标。

可能导致这种行为的原因是什么?

1 个答案:

答案 0 :(得分:0)

好吧,看起来我解决了它。我不断移动锚点 - 在缩放时,而不是一次开始设置它。结果是非常不稳定的缩放而不是平滑和期望的东西。已解析的代码如下所示:

- (void) handlePinchFrom:(UIPinchGestureRecognizer*) recognizer
{
if(recognizer.state == UIGestureRecognizerStateEnded)
{
    _isScaling = false;
    _prevScale = 1.0;
}
else
{
    if (!_isScaling)
    {

        // Obtain the center of the camera.
        CGPoint center = CGPointMake(self.contentSize.width/2, self.contentSize.height/2);
        CGPoint areaPoint = [_area convertToNodeSpace:center];

        // Now set anchor point to where areaPoint is relative to the whole _area contentsize
        float anchorLocationX = areaPoint.x / _area.contentSize.width;
        float anchorLocationY = areaPoint.y / _area.contentSize.height;

        [_area moveDebugParticle:areaPoint];
        [_area setAnchorPoint:CGPointMake(anchorLocationX, anchorLocationY)];
        CCLOG(@"Anchor Point: (%f, %f)", anchorLocationX, anchorLocationY);
    }

    _isScaling = true;
    float deltaScale = 1.0 - _prevScale + recognizer.scale;

    if (_area.scale*deltaScale <= ZOOM_RADAR_THRESHOLD)
    {
        _area.scale = ZOOM_RADAR_THRESHOLD;
    }
    else if (_area.scale*deltaScale >= ZOOM_MAX)
    {
        _area.scale = ZOOM_MAX;
    }
    else
    {
        _area.scale *= deltaScale;
    }

    _prevScale = recognizer.scale;
}
}