我有一個應用程序,我有幾個圖層創建從PNG圖像與透明度。這些圖層都在屏幕上。我需要能夠忽略給予層的透明區域接觸,只是能夠檢測作爲觸摸,當用戶點擊一個層的非透明區......看到PIC ...Cocos2d 2.0 - 忽略觸摸透明區域的圖層/精靈
我該怎麼做?謝謝。
我有一個應用程序,我有幾個圖層創建從PNG圖像與透明度。這些圖層都在屏幕上。我需要能夠忽略給予層的透明區域接觸,只是能夠檢測作爲觸摸,當用戶點擊一個層的非透明區......看到PIC ...Cocos2d 2.0 - 忽略觸摸透明區域的圖層/精靈
我該怎麼做?謝謝。
在這裏你有一個可能的解決方案。
落實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);
}
如果廖氏的解決方案不起作用,您可以添加添加透明的精靈作爲一個孩子,你你,把它只是在你的非透明區域與這個非透明區域的大小相抵觸,並且抵抗這個新的透明精靈的所有接觸,但不受原始精靈的影響。
這裏是我的解決方案,您的要求,讓我知道,如果它還是不
創建名爲透明 文件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的情人
的解決方案。我使用TexturePacker創建精靈表。使用TexturePacker創建精靈圖紙的步驟: 1.將所有圖像(.png)文件加載到TexturePacker中。 2.選擇數據格式爲coco2d並選擇PVR作爲紋理格式。 3.將精靈表加載到代碼中,並從精靈表中提取圖像。
詳細描述可以找到here。
透明圖層是否清晰或者是上面顯示的圖案?你也知道如何檢測任何區域的觸摸嗎? –
該模式代表透明度。是的,我知道如何檢測觸摸,我只是檢查觸摸是否在sprite.boundingBox內...我需要知道它是否在邊界框內,並且是不透明的像素。 – SpaceDog
嗯,好吧,所以我建議只是把一個空白的CCMenuItemImage放在不透明的父母身上,並且這樣做。否則,你會處理很多你不想要的像素代碼。 –