2012-09-08 26 views
9

Tôi là người mới bắt đầu trong Cocos2d. Tôi có một sprite, và tôi muốn bỏ qua cảm ứng trên khu vực trong suốt của sprite đó.Phát hiện phần trong suốt trên sprite trong cocos2d?

Tôi biết câu trả lời này Cocos2d 2.0 - Ignoring touches to transparent areas of layers/sprites và cũng có bài viết tuyệt vời này http://www.learn-cocos2d.com/2011/12/fast-pixelperfect-collision-detection-cocos2d-code-1of2/.

Tôi đã có thể làm cho nó hoạt động với KKPixelMaskSprite, nhưng chỉ khi sprite được sử dụng từ tệp, nhưng không phải từ nút lô. Bất cứ khi nào tôi sử dụng nút batch (Sprite sheet), để có được sprite, nó ngừng hoạt động.

Tôi có các sprites khác nhau trên mỗi khác, và tôi muốn phát hiện theo cách này -> nếu chạm vào trong hộp giới hạn sprite hiện tại, đó là một phần minh bạch trên sprite hay không?

P.S.Tôi đang sử dụng cocos2d 1.0. Tôi không muốn sử dụng bất kỳ công cụ Vật lý nào bây giờ, tôi chỉ muốn bỏ qua các lần chạm vào các vùng trong suốt của sprite (được tạo bằng cách sử dụng nút batch). Làm cách nào để tôi có thể thực hiện điều đó? Hoặc có thể có công cụ nào có thể hữu ích?

Cảm ơn rất nhiều trước.

+0

đã u thử CGPathRef? – Guru

+0

tôi nghĩ rằng liên kết bạn đã đề cập là giải pháp hoàn hảo .. http://stackoverflow.com/questions/10889170/cocos2d-2-0-ignoring-touches-to-transparent-areas-of-layers-sprites – user739711

+0

@ user739711 Tôi đã thử nó, nó làm việc cho tôi chỉ cho Sprites duy nhất, không phải nút Batch. – User1234

Trả lời

3

Bạn có thể sử dụng để làm cho CGMutablePathRef không phải hình chữ nhật phát hiện ma va chạm.

// kiểm tra

CGPoint loc =[mySprite convertToNodeSpace:touchPoint]; 

    if([mySprite isPointInsideMap:loc]) 
    { 
     //touched inside.. 
    } 

//Add this method in your MySprite class derived from CCSprite. 
-(bool)isPointInsideMap:(CGPoint)inPoint 
{ 
    if (CGPathContainsPoint(mCollisionPath, NULL, inPoint, NO)) 
    { 
     return true; 
    } 

    return false; 
} 

//// Tạo Đường dẫn

CGMutablePathRef mCollisionPath = CGPathCreateMutable(); 
CGPathMoveToPoint(mCollisionPath, NULL, 0, 0); 
CGPathAddLineToPoint(mCollisionPath, NULL, 11, 82); 
CGPathAddLineToPoint(mCollisionPath, NULL, 42, 152); 
CGPathAddLineToPoint(mCollisionPath, NULL, 86, 202); 
CGPathAddLineToPoint(mCollisionPath, NULL, 169, 13); 
CGPathCloseSubpath(mCollisionPath); 
+1

Cảm ơn, giải pháp này đã làm việc cho tôi. – User1234

+0

@ User1234 :(:(:( – Guru

+0

có vấn đề gì với nó? – User1234

1

tôi sẽ cố gắng để thay đổi BoundingBox tại là Touch của bạn đối với tôi, và giảm nó cho sprite khác nhau ...

+0

Cảm ơn, rằng những gì tôi đang sử dụng bây giờ, tôi đã adjustBoundingBox cho mỗi sprite. Điều xấu về điều đó, nó có thể chỉ là hình chữ nhật. Bất cứ điều gì cảm ơn cho câu trả lời, +1 upvote. – User1234

2

Câu trả lời này là khuếch tán nhiều hơn bạn có thể mong đợi, như tôi sẽ không cung cấp cho bạn một mã số Ví dụ, nhưng đây là cách tôi muốn thực hiện điều này:

Bạn có vị trí của hộp giới hạn của sprite (góc của sprite, bao gồm cả vùng trong suốt nếu có) và vị trí của cảm ứng trên màn hình. Sử dụng thông tin này, bạn có thể tìm ra vị trí của số liên lạc bên trong của sprite. Nói cách khác, bạn có thể tìm thấy điểm ảnh được chạm vào, độc lập với màn hình trò chơi.

Bây giờ bạn có vị trí pixel đó (x và y), hãy mở hình ảnh (có lẽ là PNG) và nhận giá trị RGB [A] cho pixel đó. Mỗi PNG có một khóa minh bạch. Đây là kênh alpha Nếu màu pixel bên trong của PNG tại (x; y) == khóa minh bạch thì pixel đó là trong suốt

Nếu bạn có thể nhận giá trị alpha cho pixel được đề cập, nếu nó bằng 0 thì pixel là trong suốt.

chỉnh sửa: ngữ nghĩa ("kênh alpha")

+0

Tôi đã thử các giải pháp đó, nó được liên kết trong câu hỏi của tôi, nhưng không thể làm cho nó hoạt động với Hàng loạt Nút. Cảm ơn. – User1234

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