首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在CCNode 3.0中捏取/平移CCNode

在CCNode 3.0中捏取/平移CCNode
EN

Stack Overflow用户
提问于 2014-06-07 11:52:34
回答 1查看 624关注 0票数 0

我想放大一个CCNode通过点击和平移屏幕。该节点有一个非常大的背景,但是屏幕上显示了它的端口。该节点还包含其他精灵。

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

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

代码语言:javascript
复制
-(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的规模。

**编辑

我也试过这个

代码语言:javascript
复制
- (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;
}
}

但它会从屏幕的左下角放大。

EN

回答 1

Stack Overflow用户

发布于 2014-08-06 18:46:56

我也有同样的问题。我使用CCScrollView,它包含比设备屏幕更大的CCNode。我想要滚动和缩放它,但节点不应该滚动出屏幕,规模比屏幕小。因此,我创建了我的CCScrollView子类,在那里我处理夹点。它有一些奇怪的故障,但它工作得很好。

当夹点开始时,我将我的节点的锚点设置为节点空间上的夹点中心。然后我需要改变我的节点位置与锚点的移动成正比,所以移动的锚点不会改变节点的位置:

代码语言:javascript
复制
   - (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),所以我需要移动分钟和最大滚动与新锚点成比例。

代码语言:javascript
复制
- (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:方法,所以我按类别添加了它。它只返回节点空间上的触摸位置:

代码语言:javascript
复制
#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
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24096861

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档