2012-06-04 27 views
15

Tôi có một ứng dụng mà tôi có một số lớp được tạo từ hình ảnh PNG với độ trong suốt. Các lớp này nằm trên màn hình với nhau. Tôi cần để có thể bỏ qua các chạm được đưa ra cho các khu vực trong suốt của các lớp và chỉ có thể phát hiện như chạm, khi người dùng chạm vào một khu vực không trong suốt của một lớp ... xem pic ...Cocos2d 2.0 - Bỏ qua các lần chạm đến các vùng/lớp trong suốt

enter image description here

Tôi làm như thế nào? cảm ơn.

+0

Lớp trong suốt có rõ ràng hay là hình mẫu như bạn hiển thị ở trên? Ngoài ra bạn có biết làm thế nào để phát hiện các chạm trên bất kỳ khu vực nào? –

+0

mô hình đại diện cho độ trong suốt. Có, tôi biết làm thế nào để phát hiện chạm, tôi chỉ cần kiểm tra nếu chạm là bên trong sprite.boundingBox ... những gì tôi cần là để biết nếu nó là bên trong boundingBox và là một điểm ảnh không minh bạch. – SpaceDog

+0

Hmm, ok vì vậy những gì tôi đề nghị chỉ cần đặt một CCMenuItemImage trống trên phụ huynh không minh bạch và làm theo cách đó. Nếu không, bạn sẽ xử lý rất nhiều mã pixel mà bạn không muốn. –

Trả lời

6

Ở đây bạn có giải pháp khả thi.

Thực hiện một phần mở rộng trên CCLayer và cung cấp phương pháp này:

- (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

thats it! Cảm ơn!!!!! – SpaceDog

+0

Bạn có thể mở rộng câu trả lời không. Tôi đã cố gắng làm "một phần mở rộng", nhưng nó thực sự là một thể loại? Ngoài ra kHITTEST_WIDTH và kHITTEST_HEIGHT không xác định. Chúng có nên là 1x1 hoặc 40x40 không?Ai đó có thể đăng toàn bộ giải pháp? – mevdev

+0

Xin chào, tiện ích mở rộng thực sự là một danh mục trên lớp đó. Bạn có thể tạo nó và thêm phương thức này ngay lập tức như một phần của nó. Đối với các hằng số không xác định, bạn có thể thay thế chúng bằng 1 hằng số. – Lio

0

nếu giải pháp Lio của không hoạt động, bạn có thể thêm thêm sprite trong suốt như một đứa trẻ bạn của bạn, đặt nó ngay dưới khu vực không minh bạch của bạn với kích thước của khu vực không thuộc tranparent này và resive tất cả các chạm bởi sprite minh bạch mới này, nhưng không phải bởi sprite gốc.

0

Đây là giải pháp của tôi để yêu cầu của bạn, cho tôi biết nếu nó hoạt động hay không

Tạo một Category trên CCMenu với Tên Transparent file CCMenu + Tranparent.h

#import "CCMenu.h" 

@interface CCMenu (Transparent) 
@end 

file CCMenu + Tranparent .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 

Điều này sẽ kiểm tra pixel để trả về CCMenuItem. của nó làm việc tốt ở đây .. cho tôi biết nếu bạn gặp phải bất kỳ vấn đề

-Paresh Rathod Cocos2d Lover

-1

Các giải pháp mà làm việc rất lớn đối với tôi là sử dụng tấm Sprite. Tôi sử dụng TexturePacker để tạo các trang ma. Các bước để tạo trang tính sprite bằng TexturePacker: 1. Tải tất cả các tệp hình ảnh (.png) vào TexturePacker. 2. Chọn định dạng dữ liệu là coco2d và chọn PVR làm định dạng kết cấu. 3. Tải trang tính ma trận vào mã của bạn và trích xuất hình ảnh từ trang tính ma lực của bạn.

Mô tả chi tiết có thể được tìm thấy here.

Các vấn đề liên quan