After a bit of work, I have modified CCMenuItem to allow the use of Atlas Sprites. Hope this is helpful.
CCMenuItem.h
...
@interface CCMenuItemSprite : CCMenuItem <CCRGBAProtocol>
{
CCSprite *normalImage_, *selectedImage_, *disabledImage_;
}
/** the image used when the item is not selected */
@property (nonatomic,readwrite,retain) CCSprite<CCRGBAProtocol> *normalImage;
/** the image used when the item is selected */
@property (nonatomic,readwrite,retain) CCSprite<CCRGBAProtocol> *selectedImage;
/** the image used when the item is disabled */
@property (nonatomic,readwrite,retain) CCSprite<CCRGBAProtocol> *disabledImage;
/** creates a menu item with a normal and selected image*/
+(id) itemFromNormalSprite:(CCNode<CCRGBAProtocol>*)normalSprite selectedSprite:(CCNode<CCRGBAProtocol>*)selectedSprite;
/** creates a menu item with a normal and selected image with target/selector */
+(id) itemFromNormalSprite:(CCNode<CCRGBAProtocol>*)normalSprite selectedSprite:(CCNode<CCRGBAProtocol>*)selectedSprite target:(id)target selector:(SEL)selector;
/** creates a menu item with a normal,selected and disabled image with target/selector */
+(id) itemFromNormalSprite:(CCNode<CCRGBAProtocol>*)normalSprite selectedSprite:(CCNode<CCRGBAProtocol>*)selectedSprite disabledSprite:(CCNode<CCRGBAProtocol>*)disabledSprite target:(id)target selector:(SEL)selector;
/** initializes a menu item with a normal, selected and disabled image with target/selector */
-(id) initFromNormalSprite:(CCNode<CCRGBAProtocol>*)normalSprite selectedSprite:(CCNode<CCRGBAProtocol>*)selectedSprite disabledSprite:(CCNode<CCRGBAProtocol>*)disabledSprite target:(id)target selector:(SEL)selector;
@end
...
CCMenuItem.m
...
#pragma mark CCMenuItemSprite
@implementation CCMenuItemSprite
@synthesize normalImage=normalImage_, selectedImage=selectedImage_, disabledImage=disabledImage_;
+(id) itemFromNormalSprite:(CCNode<CCRGBAProtocol>*)normalSprite selectedSprite:(CCNode<CCRGBAProtocol>*)selectedSprite
{
return [self itemFromNormalSprite:normalSprite selectedSprite:selectedSprite disabledSprite:nil target:nil selector:nil];
}
+(id) itemFromNormalSprite:(CCNode<CCRGBAProtocol>*)normalSprite selectedSprite:(CCNode<CCRGBAProtocol>*)selectedSprite target:(id)target selector:(SEL)selector
{
return [self itemFromNormalSprite:normalSprite selectedSprite:selectedSprite disabledSprite:nil target:target selector:selector];
}
+(id) itemFromNormalSprite:(CCNode<CCRGBAProtocol>*)normalSprite selectedSprite:(CCNode<CCRGBAProtocol>*)selectedSprite disabledSprite:(CCNode<CCRGBAProtocol>*)disabledSprite target:(id)target selector:(SEL)selector
{
return [[[self alloc] initFromNormalSprite:normalSprite selectedSprite:selectedSprite disabledSprite:disabledSprite target:target selector:selector] autorelease];
}
-(id) initFromNormalSprite:(CCNode<CCRGBAProtocol>*)normalSprite selectedSprite:(CCNode<CCRGBAProtocol>*)selectedSprite disabledSprite:(CCNode<CCRGBAProtocol>*)disabledSprite target:(id)target selector:(SEL)selector
{
if( (self=[super initWithTarget:target selector:selector]) ) {
self.normalImage = normalSprite;
self.selectedImage = selectedSprite;
self.disabledImage = disabledSprite;
[self setContentSize: [normalImage_ contentSize]];
}
return self;
}
-(void) dealloc
{
[normalImage_ release];
[selectedImage_ release];
[disabledImage_ release];
[super dealloc];
}
-(void)setPosition:(CGPoint)p
{
if (normalImage_.usesSpriteSheet==TRUE) {
if(isEnabled_) {
if( isSelected_ )
[selectedImage_ setPosition:p];
else
[normalImage_ setPosition:p];
} else {
if(disabledImage_ != nil)
[disabledImage_ setPosition:p];
// disabled image was not provided
else
[normalImage_ setPosition:p];
}
}
position_ = p;
isTransformDirty_ = isInverseDirty_ = YES;
}
-(void) draw
{
if (normalImage_.usesSpriteSheet==TRUE) {
}else {
if(isEnabled_) {
if( isSelected_ )
[selectedImage_ draw];
else
[normalImage_ draw];
} else {
if(disabledImage_ != nil)
[disabledImage_ draw];
// disabled image was not provided
else
[normalImage_ draw];
}
}
}
#pragma mark CCMenuItemImage - CCRGBAProtocol protocol
- (void) setOpacity: (GLubyte)opacity
{
[normalImage_ setOpacity:opacity];
[selectedImage_ setOpacity:opacity];
[disabledImage_ setOpacity:opacity];
}
-(void) setColor:(ccColor3B)color
{
[normalImage_ setColor:color];
[selectedImage_ setColor:color];
[disabledImage_ setColor:color];
}
-(GLubyte) opacity
{
return [normalImage_ opacity];
}
-(ccColor3B) color
{
return [normalImage_ color];
}
@end
...
Now with this code you can use sprites rendered using a sprite sheet with CCMenuItemSprite.