2012-06-04 82 views
15

我有一個應用程序,我有幾個圖層創建從PNG圖像與透明度。這些圖層都在屏幕上。我需要能夠忽略給予層的透明區域接觸,只是能夠檢測作爲觸摸,當用戶點擊一個層的非透明區......看到PIC ...Cocos2d 2.0 - 忽略觸摸透明區域的圖層/精靈

enter image description here

我該怎麼做?謝謝。

+0

透明圖層是否清晰或者是上面顯示的圖案?你也知道如何檢測任何區域的觸摸嗎? –

+0

該模式代表透明度。是的,我知道如何檢測觸摸,我只是檢查觸摸是否在sprite.boundingBox內...我需要知道它是否在邊界框內,並且是不透明的像素。 – SpaceDog

+0

嗯,好吧,所以我建議只是把一個空白的CCMenuItemImage放在不透明的父母身上,並且這樣做。否則,你會處理很多你不想要的像素代碼。 –

回答

6

在這裏你有一個可能的解決方案。

落實CCLayer的延伸,提供這個方法:

- (BOOL)isPixelTransparentAtLocation:(CGPoint)loc 
{ 
    //Convert the location to the node space 
    CGPoint location = [self convertToNodeSpace:loc]; 

    //This is the pixel we will read and test 
    UInt8 pixel[4]; 

    //Prepare a render texture to draw the receiver on, so you are able to read the required pixel and test it  
    CGSize screenSize = [[CCDirector sharedDirector] winSize]; 
    CCRenderTexture* renderTexture = [[CCRenderTexture alloc] initWithWidth:screenSize.width 
                    height:screenSize.height 
                   pixelFormat:kCCTexture2DPixelFormat_RGBA8888]; 

    [renderTexture begin]; 

    //Draw the layer 
    [self draw];  

    //Read the pixel 
    glReadPixels((GLint)location.x,(GLint)location.y, kHITTEST_WIDTH, kHITTEST_HEIGHT, GL_RGBA, GL_UNSIGNED_BYTE, pixel); 

    //Cleanup 
    [renderTexture end]; 
    [renderTexture release]; 

    //Test if the pixel's alpha byte is transparent 
    return (pixel[3] == 0); 
} 
+0

多數民衆贊成它!謝謝!!!!! – SpaceDog

+0

你可以擴大答案。我試着做「延伸」,但它應該是一個類別嗎? kHITTEST_WIDTH和kHITTEST_HEIGHT也是未定義的。他們應該是1x1還是40x40?有人可以發佈整個解決方案嗎? – mevdev

+0

你好,擴展確實是該類的一個類。您可以創建它並立即添加此方法作爲其一部分。至於未定義的常量,您可以將它們替換爲1。 – Lio

0

如果廖氏的解決方案不起作用,您可以添加添加透明的精靈作爲一個孩子,你你,把它只是在你的非透明區域與這個非透明區域的大小相抵觸,並且抵抗這個新的透明精靈的所有接觸,但不受原始精靈的影響。

0

這裏是我的解決方案,您的要求,讓我知道,如果它還是不

創建名爲透明 文件CCMenu + Tranparent.h

#import "CCMenu.h" 

@interface CCMenu (Transparent) 
@end 

文件CCMenu + Tranparent上CCMenu類別.m

#import "CCMenu+Transparent.h" 
#import "cocos2d.h" 
@implementation CCMenu (Transparent) 
-(CCMenuItem *) itemForTouch: (UITouch *) touch{ 
    CGPoint touchLocation = [touch locationInView: [touch view]]; 
    touchLocation = [[CCDirector sharedDirector] convertToGL: touchLocation]; 

    CCMenuItem* item; 
    CCARRAY_FOREACH(children_, item){ 
     UInt8 data[4]; 

     // ignore invisible and disabled items: issue #779, #866 
     if ([item visible] && [item isEnabled]) { 
      CGPoint local = [item convertToNodeSpace:touchLocation]; 
      /* 
      TRANSPARENCY LOGIC 
      */ 
      //PIXEL READING 1 PIXEL AT LOCATION 


      CGRect r = [item rect]; 
      r.origin = CGPointZero; 

      if(CGRectContainsPoint(r, local)){ 
       if([NSStringFromClass(item.class) isEqualToString:NSStringFromClass([CCMenuItemImage class])]){ 
        CCRenderTexture* renderTexture = [[CCRenderTexture alloc] initWithWidth:item.boundingBox.size.width * CC_CONTENT_SCALE_FACTOR() 
                        height:item.boundingBox.size.height * CC_CONTENT_SCALE_FACTOR() 
                       pixelFormat:kCCTexture2DPixelFormat_RGBA8888]; 

        [renderTexture begin]; 
        [[(CCMenuItemImage *)item normalImage] draw]; 

        data[3] = 1; 
        glReadPixels((GLint)local.x,(GLint)local.y, 1, 1, GL_RGBA, GL_UNSIGNED_BYTE, data); 

        [renderTexture end]; 
        [renderTexture release]; 
        if(data[3] == 0){ 
         continue; 
        } 

       } 
       free(data); 
       return item; 
      } 

     } 
    } 
    return nil; 
} 

@end 

這將檢查返回CCMenuItem的像素。 其優良的在這裏工作..讓我知道,如果你面對的是偉大的工作,我用雪碧張任何問題

-Paresh Rathod cocos2d的情人

-1

的解決方案。我使用TexturePacker創建精靈表。使用TexturePacker創建精靈圖紙的步驟: 1.將所有圖像(.png)文件加載到TexturePacker中。 2.選擇數據格式爲coco2d並選擇PVR作爲紋理格式。 3.將精靈表加載到代碼中,並從精靈表中提取圖像。

詳細描述可以找到here