像Fieldrunners一样的cocos2d捏缩放

时间:2012-03-09 09:36:21

标签: objective-c cocos2d-iphone cclayer

我一直在尝试正确设置视差节点,但需要一些帮助。

这个http://goo.gl/Piqy5将是游戏的框架,对于视差节点区域,我有3层: 背景图层(可缩放但不可滚动,z顺序为-1) 第1层(z顺序1) 第2层(z顺序2)

//Adding the layers to the parallax node
CGPoint offsetLayer = ccp(0,0);
//background layer
[parallaxNode addChild:backgroundLayer z:-1 parallaxRatio: ccp(0,0) positionOffset: offsetLayer];
//layer 1
[parallaxNode addChild:secondParallaxLayer z:1 parallaxRatio: ccp(0.5,0) positionOffset: offsetLayer];
//layer 2
[parallaxNode addChild:firstParallaxLayer z:2 parallaxRatio: ccp(1.1,0) positionOffset: offsetLayer];


//the pan/zoom & scroll controller
 _controller = [[CCPanZoomController controllerWithNode:baseLayer] retain];
 _controller.boundingRect = boundingRect;
_controller.zoomOutLimit = _controller.optimalZoomOutLimit;
 _controller.zoomInLimit = 2.0f;
[_controller centerOnPoint:CGPointMake(screenSize.width/2.0, screenSize.height/2.0)];
[_controller enableWithTouchPriority:-2 swallowsTouches:YES];

我想我应该修复使用:

//Setting the touch delegate to my CCScene
@interface GameScene : CCScene <CCStandardTouchDelegate>


//and add register to touch delegate
[[CCTouchDispatcher sharedDispatcher] addStandardDelegate:self priority:2];


- (CGPoint)convertPoint:(CGPoint)point fromNode:(CCNode *)node {
    return [self convertToNodeSpace:[node convertToWorldSpace:point]];
}

- (void)ccTouchesMoved:(NSSet *)touches withEvent:(UIEvent *)event {
#define CLAMP(x,y,z) MIN(MAX(x,y),z)
    if ([[[event allTouches] allObjects] count] == 2) {

        UITouch* touch1 = [[[event allTouches] allObjects] objectAtIndex:0];
        UITouch* touch2 = [[[event allTouches] allObjects] objectAtIndex:1];

        // calculate scale value
        double prevDistance = ccpDistance([touch1 previousLocationInView:[touch1 view]], [touch2 previousLocationInView:[touch2 view]]);
        double newDistance  = ccpDistance([touch1 locationInView:[touch1 view]], [touch2 locationInView:[touch2 view]]);

        CGFloat relation = newDistance / prevDistance;
        CGFloat newScale = self.scale * relation;

        if ((newScale >= MIN_SCALE) && (newScale <= MAX_SCALE)) {

            CGPoint touch1Location = [baseLayer convertTouchToNodeSpace:touch1];
            CGPoint touch2Location = [baseLayer convertTouchToNodeSpace:touch2];

            // calculate center point between two touches
            CGPoint centerPoint = ccpMidpoint(touch1Location, touch2Location);

            // store center point location (ScrollableView space)
            CGPoint centerPointInParentNodeSpace = [self convertPoint:centerPoint fromNode:baseLayer];
            CGPoint oldPoint = ccp(centerPointInParentNodeSpace.x * (self.scale), centerPointInParentNodeSpace.y * (self.scale));
            self.scale = newScale;

            CGPoint newPoint = ccp(centerPointInParentNodeSpace.x * (self.scale), centerPointInParentNodeSpace.y * (self.scale));
            CGPoint diff = ccp(oldPoint.x - newPoint.x , oldPoint.y - newPoint.y);

            [baseLayer setPosition:ccp(baseLayer.position.x + (diff.x*(1/self.scale)), baseLayer.position.y + (diff.y*(1/self.scale)))];
        }
    } else if ([[[event allTouches] allObjects] count] == 1)    {
        // get touch locations
        UITouch *touch = [[event allTouches] anyObject];

        CGPoint touchPosition = [[CCDirector sharedDirector] convertToGL:[touch locationInView:[touch view]]];
        CGPoint oldPosition = [[CCDirector sharedDirector] convertToGL:[touch previousLocationInView:[touch view]]];

        // calculate difference in position
        CGPoint diff = ccpSub(touchPosition, oldPosition);
        self.position = ccpAdd(self.position, diff);
    }

#undef CLAMP
}

任何评论或帮助都会很棒! :)

1 个答案:

答案 0 :(得分:1)

在Github上的Cocos2d Extensions中查看CCLayerPanZoom。我已经使用这个类在我的游戏中启用了捏缩放和平移