Oto moje rozwiązanie do Państwa wymagań, daj mi znać, czy to działa, czy nie
utworzyć kategorię na CCMenu z nazwą Przejrzysta pliku CCMenu + Tranparent.h
#import "CCMenu.h"
@interface CCMenu (Transparent)
@end
pliku 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
Spowoduje to sprawdzenie piksela w celu zwrócenia elementu CCMenuItem. jego pracy dobrze tutaj .. daj mi znać, jeśli napotkają żadnych problemów
-Paresh Rathod Cocos2d Lover
Czy przezroczysta warstwa jest przezroczysta, czy jest to wzór, jak pokazano powyżej? Czy wiesz już, jak wykryć dotknięcia na DOWOLNYM obszarze? –
Wzór reprezentuje przezroczystość. Tak, wiem, jak wykryć dotyk, po prostu sprawdzam, czy dotyk jest wewnątrz sprite.boundingBox ... potrzebuję wiedzieć, czy jest wewnątrz boundingBox i jest nieprzezroczystym pikselem. – SpaceDog
Hmm, ok, więc polecam tylko umieścić puste CCMenuItemImage na nieprzejrzystym rodzicu i zrobić to w ten sposób. W przeciwnym razie będziesz miał do czynienia z DUŻĄ ilością pikseli, których nie chcesz. –