Как установить ориентацию CCTransitionPageTurn на вертикальную?

#iphone #cocos2d-iphone #scene

#iPhone #cocos2d-iphone #сцена

Вопрос:

Я использовал приведенный ниже код для реализации эффекта замены сцен:

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

Затем эффект, который меняется на обратный, будет выглядеть так, как будто входящая сцена поворачивается слева на исходящую сцену.
Я хочу получить эффект поворота сверху. как я могу это получить?

Комментарии:

1. Сначала вам нужно повернуть следующий слой на 90 *, а затем применить CCTransitionPageTurn

Ответ №1:

Измените cocos2d / CCActionPageTurn3D.m, чтобы заменить x на 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