2012-03-07 69 views
2

iPad應用程序設置:SceneA包含layerA - 1024x768。按下layerA中的一個按鈕,layerB使用CCMoveTo操作在頂部下拉。 LayerB僅爲800x600,因此您可以在其後看到layerA(想想覆蓋式暫停屏幕類型效果)。 LayerB包含一個800x600的精靈,用戶可以通過按下一個按鈕來放大。縮放效果僅僅是CCScaleTo和CCMoveTo的組合,以使其保持居中在放大的部分上。然而,當精靈縮放時,層B在層A的頂端也會變大。有沒有辦法在包含的窗口中縮放精靈?Cocos2d如何縮放sprite而不縮放圖層?或者,如何縮放和裁剪精靈/圖層?

回答

1

LayerB應使用GL_SCISSOR_TEST修剪自身的外部。您可以輕鬆地谷歌瞭解更多關於它的信息,它基本上定義了一個rect,然後使用glScissor去除外部。我有一個I類延伸,當我需要做到這一點,那去如下:

// 
// CCNodeClip.h 
// 
// Created by Ignacio Orlandoni on 7/29/11. 
// 

#import <Foundation/Foundation.h> 
#import "cocos2d.h" 
@interface CCNodeClip : CCLayer { 

} 

-(void)preVisit; 
-(void)postVisit; 

@end 

-

// 
// CCNodeClip.m 
// 
// Created by Ignacio Orlandoni on 7/29/11. 
// 

#import "CCNodeClip.h" 
@implementation CCNodeClip 

-(void)visit { 
    [self preVisit]; 
    [super visit]; 
    [self postVisit]; 
} 

-(void)preVisit { 
    if (!self.visible) 
     return; 

    glEnable(GL_SCISSOR_TEST); 

    CGPoint position = [self position]; 

    //I don't remember if this rect really serves for both orientations, so you may need to change the order of the values here. 
    CGRect scissorRect = CGRectMake(position.x, position.y, [self contentSize].width, [self contentSize].height); 

    // CCLOG(@"Scrissor Rect: X: %02f, Y:%02f, W: %02f, H: %02f", scissorRect.origin.x,  scissorRect.origin.y, scissorRect.size.width, scissorRect.size.height); 

    // Handle Retina 
    scissorRect = CC_RECT_POINTS_TO_PIXELS(scissorRect); 

    glScissor((GLint) scissorRect.origin.x, (GLint) scissorRect.origin.y, 
       (GLint) scissorRect.size.width, (GLint) scissorRect.size.height); 
} 

-(void)postVisit { 
    glDisable(GL_SCISSOR_TEST); 
} 


@end 

隨着進口到LayerB,現在就可以定義爲一個CCNodeClip代替CCLayer

一些鏈接...

glScissor << cocos2d Forum

Circle shape clipping with opengl-es in cocos2d << StackOverflow

Cocos2d iPhone - Sprite cliping/mask/frame << StackOverflow

Another Cocos2D gem: ClippingNode << Learn-Cocos2d.com

作爲一個側面說明...

如果精靈的定位點居中,則CCScaleTo + CCMoveTo可以避免,因此圖像在縮放時保持居中居中。 (.anchorPoint = ccp(0.5, 0.5);

+0

使用你的代碼似乎完美的工作!這很容易實現。我的應用程序僅適用於橫向,我不必在代碼中改變任何內容。就CCScaleToTo和MoveTo而言,我實際上是根據用戶觸摸位置而不是中心來放大圖層的不同點。雖然好點。非常感謝! – BobbyScon 2012-03-09 14:31:56

+0

儘管問題已解決,但我建議您查看'GlScissor',試着全面瞭解它是如何工作的以及它可以做什麼。不用謝。 – 2012-03-09 14:41:00

+0

是的,只要我看到你的帖子(大約3分鐘後你發佈)我做了一個谷歌搜索,並找到了許多你發佈的相同鏈接。我的問題確實是一個不知道要搜索什麼的情況。我以前沒聽說過GLScissor。您的代碼似乎比Learn-Cocos2d.com上的設置更有效 – BobbyScon 2012-03-09 14:44:52