Here's the changes I made to Cocos2d 2.0 to get padding for column based menus.
Replace line 91 of CCMenu.h.
Old Line:
-(void) alignItemsInColumns: (NSNumber *) columns vaList: (va_list) args;
Replacement Lines:
-(void) alignItemsInColumns: (float)padding columns:(NSNumber *) columns, ... NS_REQUIRES_NIL_TERMINATION;
-(void) alignItemsInColumns: (float)padding columns:(NSNumber *) columns vaList: (va_list) args;
Replace function alignItemsInColumns starting at line 378 of CCMenu.m.
Old Function:
-(void) alignItemsInColumns: (NSNumber *) columns, ...
{
va_list args;
va_start(args, columns);
[self alignItemsInColumns:columns vaList:args];
va_end(args);
}
New Function:
-(void) alignItemsInColumns:(NSNumber *) columns, ...
{
[self alignItemsInColumns:0.0f columns:columns];
}
Add new function '-(void) alignItemsInColumns:(float)padding columns:(NSNumber *) columns, ...' to CCMenu.m below that function.
New Function Code:
-(void) alignItemsInColumns:(float)padding columns:(NSNumber *) columns, ...
{
va_list args;
va_start(args, columns);
[self alignItemsInColumns:padding columns:columns vaList:args];
va_end(args);
}
Replace function -(void) alignItemsInColumns: (NSNumber *) columns vaList: (va_list) args with new function -(void) alignItemsInColumns: (float)padding columns:(NSNumber *) columns vaList: (va_list) args at line 388
Old Function:
-(void) alignItemsInColumns: (NSNumber *) columns vaList: (va_list) args
{
NSMutableArray *rows = [[NSMutableArray alloc] initWithObjects:columns, nil];
columns = va_arg(args, NSNumber*);
while(columns) {
[rows addObject:columns];
columns = va_arg(args, NSNumber*);
}
int height = -5;
NSUInteger row = 0, rowHeight = 0, columnsOccupied = 0, rowColumns;
CCMenuItem *item;
CCARRAY_FOREACH(children_, item){
NSAssert( row < [rows count], @"Too many menu items for the amount of rows/columns.");
rowColumns = [(NSNumber *) [rows objectAtIndex:row] unsignedIntegerValue];
NSAssert( rowColumns, @"Can't have zero columns on a row");
rowHeight = fmaxf(rowHeight, item.contentSize.height);
++columnsOccupied;
if(columnsOccupied >= rowColumns) {
height += rowHeight + 5;
columnsOccupied = 0;
rowHeight = 0;
++row;
}
}
NSAssert( !columnsOccupied, @"Too many rows/columns for available menu items." );
CGSize winSize = [[CCDirector sharedDirector] winSize];
row = 0; rowHeight = 0; rowColumns = 0;
float w, x, y = height / 2;
CCARRAY_FOREACH(children_, item) {
if(rowColumns == 0) {
rowColumns = [(NSNumber *) [rows objectAtIndex:row] unsignedIntegerValue];
w = winSize.width / (1 + rowColumns);
x = w;
}
CGSize itemSize = item.contentSize;
rowHeight = fmaxf(rowHeight, itemSize.height);
[item setPosition:ccp(x - winSize.width / 2,
y - itemSize.height / 2)];
x += w;
++columnsOccupied;
if(columnsOccupied >= rowColumns) {
y -= rowHeight + 5;
columnsOccupied = 0;
rowColumns = 0;
rowHeight = 0;
++row;
}
}
[rows release];
}
New Function:
-(void) alignItemsInColumns: (float)padding columns:(NSNumber *) columns vaList: (va_list) args
{
NSMutableArray *rows = [[NSMutableArray alloc] initWithObjects:columns, nil];
columns = va_arg(args, NSNumber*);
while(columns) {
[rows addObject:columns];
columns = va_arg(args, NSNumber*);
}
int height = -5;
NSUInteger row = 0, rowHeight = 0, columnsOccupied = 0, rowColumns;
CCMenuItem *item;
CCARRAY_FOREACH(children_, item){
NSAssert( row < [rows count], @"Too many menu items for the amount of rows/columns.");
rowColumns = [(NSNumber *) [rows objectAtIndex:row] unsignedIntegerValue];
NSAssert( rowColumns, @"Can't have zero columns on a row");
rowHeight = fmaxf(rowHeight, item.contentSize.height);
++columnsOccupied;
if(columnsOccupied >= rowColumns) {
height += rowHeight + 5;
columnsOccupied = 0;
rowHeight = 0;
++row;
}
}
NSAssert( !columnsOccupied, @"Too many rows/columns for available menu items." );
CGSize winSize = [[CCDirector sharedDirector] winSize];
row = 0; rowHeight = 0; rowColumns = 0;
float w, x, y = height / 2;
int itemNumber = 0;
CCARRAY_FOREACH(children_, item) {
if(rowColumns == 0) {
rowColumns = [(NSNumber *) [rows objectAtIndex:row] unsignedIntegerValue];
w = winSize.width / (1 + rowColumns);
x = w;
}
CGSize itemSize = item.contentSize;
rowHeight = fmaxf(rowHeight, itemSize.height);
if(itemNumber%2) {
[item setPosition:ccp((x - winSize.width / 2)+padding,
y - itemSize.height / 2)];
} else {
[item setPosition:ccp((x - winSize.width / 2)-padding,
y - itemSize.height / 2)];
}
x += w;
++columnsOccupied;
if(columnsOccupied >= rowColumns) {
y -= rowHeight + 5;
columnsOccupied = 0;
rowColumns = 0;
rowHeight = 0;
++row;
}
itemNumber++;
}
[rows release];
}