Как установить вертикальную ориентацию CCTransitionPageTurn? - PullRequest
3 голосов
/ 02 июня 2011

Я использовал следующий код для реализации эффекта заменяющих сцен:

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

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

1 Ответ

5 голосов
/ 02 июня 2011

Измените 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
...