在Cocos2d 3.0中捏合/平移CCNode

时间:2014-06-07 11:52:35

标签: ios objective-c cocos2d-iphone

我想通过捏合和平移屏幕来放大CCNode。该节点的背景非常大,但它在屏幕上显示的部分。该节点还包含其他精灵。

我现在所做的是首先注册UIPinchGestureRecognizer

UIPinchGestureRecognizer * pinchRecognizer = [[UIPinchGestureRecognizer alloc] initWithTarget:self action:@selector(handlePinchFrom :)]; [[[CCDirector sharedDirector] view] addGestureRecognizer:pinchRecognizer];

-(void)handlePinchFrom:(UIPinchGestureRecognizer *) pinch
{
    if(pinch.state == UIGestureRecognizerStateEnded) {
        prevScale = 1;
    }
    else {
        CGFloat dscale = [self scale] - prevScale + pinch.scale;
        if(dscale > 0)
        {
            deltaScale = dscale;
        }
        CGAffineTransform transform = CGAffineTransformScale(pinch.view.transform, deltaScale, deltaScale);
        [pinch.view setTransform: transform];

//        [_contentNode setScale:deltaScale];

        prevScale = pinch.scale;
    }
}

问题在于它整个UIView不是CCNode。我还尝试通过设置_contentNode的比例。

**修改

我也试过这个

- (void)handlePinchGesture:(UIPinchGestureRecognizer*)aPinchGestureRecognizer
{

if (pinch.state == UIGestureRecognizerStateBegan || pinch.state == UIGestureRecognizerStateChanged) {
    CGPoint midpoint = [pinch locationInView:[CCDirector sharedDirector].view];
    CGSize winSize = [CCDirector sharedDirector].viewSize;
    float x = midpoint.x/winSize.width;
    float y = midpoint.y/winSize.height;
    _contentNode.anchorPoint = CGPointMake(x, y);
    float scale = [pinch scale];
    _contentNode.scale *= scale;
    pinch.scale = 1;
}
}

但它会从屏幕左下方缩放。

1 个答案:

答案 0 :(得分:0)

我遇到了同样的问题。我使用的CCScrollView包含的CCNode大于设备屏幕。我想滚动和缩放它,但节点不应滚出屏幕,并缩小比屏幕小。所以,我创建了我的CCScrollView子类,我处理捏。它有一些奇怪的故障,但它一切正常。

当捏开始时,我将节点的锚点设置为在节点空间上捏中心。然后我需要改变我的节点的位置与锚点的移动成比例,因此移动锚点不会改变视图上的节点位置:

   - (void)handlePinch:(UIPinchGestureRecognizer*)recognizer
{
    if (recognizer.state == UIGestureRecognizerStateEnded) {
        _previousScale = self.contentNode.scale;
    }
    else if (recognizer.state == UIGestureRecognizerStateBegan) {
        float X = [recognizer locationInNode:self.contentNode].x / self.contentNode.contentSize.width;
        float Y = [recognizer locationInNode:self.contentNode].y / self.contentNode.contentSize.height;

        float positionX = self.contentNode.position.x + self.contentNode.boundingBox.size.width * (X - self.contentNode.anchorPoint.x);
        float positionY = self.contentNode.position.y + self.contentNode.boundingBox.size.height * (Y - self.contentNode.anchorPoint.y);

        self.contentNode.anchorPoint = ccp(X, Y);
        self.contentNode.position = ccp(positionX, positionY);
    }
    else {
        CGFloat scale = _previousScale * recognizer.scale;

        if (scale >= maxScale) {
            self.contentNode.scale = maxScale;
        }
        else if (scale <= [self minScale]) {
            self.contentNode.scale = [self minScale];
        }
        else {
            self.contentNode.scale = scale;
        }
    }
}

此外,我需要更改CCScrollView最小和最大滚动,因此我的节点永远不会滚动出视图。默认锚点是(0,1),所以我需要移动最小和最大滚动与新锚点成比例。

- (float) maxScrollX
{
    if (!self.contentNode) return 0;

    float maxScroll = self.contentNode.boundingBox.size.width - self.contentSizeInPoints.width;
    if (maxScroll < 0) maxScroll = 0;

    return maxScroll - self.contentNode.boundingBox.size.width * self.contentNode.anchorPoint.x;
}

- (float) maxScrollY
{
    if (!self.contentNode) return 0;

    float maxScroll = self.contentNode.boundingBox.size.height - self.contentSizeInPoints.height;
    if (maxScroll < 0) maxScroll = 0;

    return maxScroll - self.contentNode.boundingBox.size.height * (1 - self.contentNode.anchorPoint.y);
}

- (float) minScrollX
{
    float minScroll = [super minScrollX];

    return minScroll - self.contentNode.boundingBox.size.width * self.contentNode.anchorPoint.x;
}

- (float) minScrollY
{
    float minScroll = [super minScrollY];
    return minScroll - self.contentNode.boundingBox.size.height * (1 - self.contentNode.anchorPoint.y);
}

UIGestureRecognizerStateEnded没有locationInNode:方法,所以我按类别添加了它。它只返回节点空间上的触摸位置:

#import "UIGestureRecognizer+locationInNode.h"

@implementation UIGestureRecognizer (locationInNode)

- (CGPoint) locationInNode:(CCNode*) node
{
    CCDirector* dir = [CCDirector sharedDirector];

    CGPoint touchLocation = [self locationInView: [self view]];
    touchLocation = [dir convertToGL: touchLocation];
    return [node convertToNodeSpace:touchLocation];
}

- (CGPoint) locationInWorld
{
    CCDirector* dir = [CCDirector sharedDirector];

    CGPoint touchLocation = [self locationInView: [self view]];
    return [dir convertToGL: touchLocation];
}

@end