Search code examples
iphonecocos2d-iphonescene

How to set the CCTransitionPageTurn orientation to vertical?


I used the code as follow to implement the effect of replace scenes:

[[CCDirector sharedDirector] replaceScene:[CCTransitionPageTurn transitionWithDuration:0.5f scene:alterScene backwards:NO]];

Then, the effect that is reversed to appear as if the incoming scene is being turned from left over the outgoing scene.
I want to get the effect turn from top over. how can I get this?


Solution

  • Modify cocos2d/CCActionPageTurn3D.m to exchange x for y.

    /*
     * cocos2d for iPhone: http://www.cocos2d-iphone.org
     *
     * Copyright (c) 2009 Sindesso Pty Ltd http://www.sindesso.com/
     *
     * Permission is hereby granted, free of charge, to any person obtaining a copy
     * of this software and associated documentation files (the "Software"), to deal
     * in the Software without restriction, including without limitation the rights
     * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
     * copies of the Software, and to permit persons to whom the Software is
     * furnished to do so, subject to the following conditions:
     * 
     * The above copyright notice and this permission notice shall be included in
     * all copies or substantial portions of the Software.
     * 
     * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
     * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
     * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
     * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
     * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
     * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
     * THE SOFTWARE.
     *
     */
    
    #import "CCActionPageTurn3D.h"
    
    @implementation CCPageTurn3D
    
    /*
     * Update each tick
     * Time is the percentage of the way through the duration
     */
    -(void)update:(ccTime)time
    {
        float tt = MAX( 0, time - 0.25f );
        float deltaAx = ( tt * tt * 500);
        float ax = -100 - deltaAx;
    
        float deltaTheta = - (float) M_PI_2 * sqrtf( time);
        float theta = /*0.01f*/ + (float) M_PI_2 +deltaTheta;
    
        float sinTheta = sinf(theta);
        float cosTheta = cosf(theta);
    
        for( int i = 0; i <=gridSize_.x; i++ )
        {
            for( int j = 0; j <= gridSize_.y; j++ )
            {
                // Get original vertex
                ccVertex3F    p = [self originalVertex:ccg(i,j)];
    
                float R = sqrtf(p.y*p.y + (p.x - ax) * (p.x - ax));
                float r = R * sinTheta;
                float alpha = asinf( p.y / R );
                float beta = alpha / sinTheta;
                float cosBeta = cosf( beta );
    
                // If beta > PI then we've wrapped around the cone
                // Reduce the radius to stop these points interfering with others
                if( beta <= M_PI)
                    p.y = ( r * sinf(beta));
                else
                {
                    // Force X = 0 to stop wrapped
                    // points
                    p.y = 0;
                }
    
                p.x = ( R + ax - ( r*(1 - cosBeta)*sinTheta));
    
                // We scale z here to avoid the animation being
                // too much bigger than the screen due to perspectve transform
                p.z = (r * ( 1 - cosBeta ) * cosTheta) / 7; // "100" didn't work for
    
                // Stop z coord from dropping beneath underlying page in a transition
                // issue #751                
                if( p.z<0.5f )
                    p.z = 0.5f;
    
                // Set new coords
                [self setVertex:ccg(i,j) vertex:p];
            }
        }
    }
    @end
    

    diff --git a/cocos2d/CCActionPageTurn3D.m b/cocos2d/CCActionPageTurn3D.m
    index ee59500..ccd64eb 100644
    --- a/cocos2d/CCActionPageTurn3D.m
    +++ b/cocos2d/CCActionPageTurn3D.m
    @@ -34,10 +34,10 @@
     -(void)update:(ccTime)time
     {
         float tt = MAX( 0, time - 0.25f );
    -    float deltaAy = ( tt * tt * 500);
    -    float ay = -100 - deltaAy;
    +    float deltaAx = ( tt * tt * 500);
    +    float ax = -100 - deltaAx;
    
         float deltaTheta = - (float) M_PI_2 * sqrtf( time) ;
         float theta = /*0.01f*/ + (float) M_PI_2 +deltaTheta;
    
         float sinTheta = sinf(theta);
    @@ -50,24 +50,24 @@
                 // Get original vertex
                 ccVertex3F    p = [self originalVertex:ccg(i,j)];
    
    -            float R = sqrtf(p.x*p.x + (p.y - ay) * (p.y - ay));
    +            float R = sqrtf(p.y*p.y + (p.x - ax) * (p.x - ax));
                 float r = R * sinTheta;
    -            float alpha = asinf( p.x / R );
    +            float alpha = asinf( p.y / R );
                 float beta = alpha / sinTheta;
                 float cosBeta = cosf( beta );
    
                 // If beta > PI then we've wrapped around the cone
                 // Reduce the radius to stop these points interfering with others
                 if( beta <= M_PI)
    -                p.x = ( r * sinf(beta));
    +                p.y = ( r * sinf(beta));
                 else
                 {
                     // Force X = 0 to stop wrapped
                     // points
    -                p.x = 0;
    +                p.y = 0;
                 }
    
    -            p.y = ( R + ay - ( r*(1 - cosBeta)*sinTheta));
    +            p.x = ( R + ax - ( r*(1 - cosBeta)*sinTheta));
    
                 // We scale z here to avoid the animation being
                 // too much bigger than the screen due to perspectve transform