Objective c 将CCMenu与栅格对齐

Objective c 将CCMenu与栅格对齐,objective-c,cocos2d-iphone,Objective C,Cocos2d Iphone,有人知道让CCMenuItems数组与网格对齐的最佳实践方法吗?这是一个cocos2d问题 例如: int levelCount = 10; CCMenu *menuArray = [CCMenu menuWithItems:nil]; for (int x = 1; x<=levelCount; x++) { CCLOG(@"Creating level icon for Level %i", x); [menuArray addChild:[CCMenuI

有人知道让CCMenuItems数组与网格对齐的最佳实践方法吗?这是一个cocos2d问题

例如:

int levelCount = 10;

CCMenu *menuArray = [CCMenu menuWithItems:nil];

for (int x = 1; x<=levelCount; x++) {
    CCLOG(@"Creating level icon for Level %i", x);     
    [menuArray addChild:[CCMenuItemImage itemFromNormalImage:@"Button2n.png" 
                                               selectedImage:@"Button2s.png" 
                                                      target:self 
                                                    selector:@selector(onPlay:)]];

}

[menuArray alignToGridWouldbeGreat????!!!!];
[self addChild:menuArray];
int-levelCount=10;
CCMenu*menuArray=[CCMenu menuwhitems:nil];

对于(intx=1;x可能是,您可以试试这个

[menuArray alignItemsVerticallyWithPadding:20.0];


据我所知,Anish的答案是你最好的行动方案。这与对齐网格一样,也是我个人使用的。只需设置菜单位置和对齐填充,你就应该有你想要的。

好的,虽然没有我想要的那么灵活,但我有一个足够好的解决方案。如果其他人也觉得此代码有用,他们可以随意使用此代码

//////// Put images (or whatever) for all levels in an array /////////        

    int levelCount = 15;
    NSMutableArray* menuArray = [NSMutableArray arrayWithCapacity:levelCount];
    for (int x = 1; x<=levelCount; x++) {

        CCLOG(@"Creating level icon for Level %i", x);

        CCMenuItemImage* item = [CCMenuItemImage itemFromNormalImage:@"Button2n.png" 
                                                       selectedImage:@"Button2s.png" 
                                                              target:self 
                                                            selector:@selector(onPlay:)];
        [menuArray addObject:item];                        
    }

这是我的解决方案,我希望它能有所帮助

首先在某处定义此结构:

typedef struct
{
 int cols;
}RowInfo;
然后:


您只需调用重载的alignItemsInColumns或alignItemsInRows方法之一。例如,如果您有15个菜单项,需要3行5列,请执行以下操作:

CCMenu* menu = [CCMenu menuWithItems:...];
NSNumber* itemsPerRow = [NSNumber numberWithInt:5];
[menu alignItemsInColumns:itemsPerRow, itemsPerRow, itemsPerRow, nil];

唯一不好的一面是,在对齐网格时,似乎没有设置填充的方法。

我认为这些选项不允许超过一行或一列,这是我所追求的。例如,如果我有16项,则为4x4网格。在提供的链接中,该问题已由其他人提出,但答案链接已失效,我不认为是这样e选项允许多行或多列,这是im所追求的。例如,如果我有16个项目,则为4x4网格。该问题已由其他人在提供的链接中提出,但答案链接是死的哦,好吧……那么不完全确定。如果您在遵循论坛主题“3194”中讨论的方法时遇到问题然后你可以创建多个菜单,每个菜单有一个项目。然后你可以把菜单放在任何你喜欢的地方。啊,现在,我来试试这个填充问题的一个解决方案,就是给这个方法添加一个“紧密度”变量,比如:-(void)alignItemsInColumns:(NSNumber*)columns vaList:(va_list)args和紧密度:(float)紧密性。在设置项目位置的行中使用“紧密性”:w=winSize.width/(1+rowColumns)/紧密性;它对我很有效:)填充在这个cocos2d-x帖子中进行管理,它对我很有用:
typedef struct
{
 int cols;
}RowInfo;
-(void)layoutMenu:(CCMenu *)menu rowInfo:(RowInfo[])inf rows:(int)rows padding:(CGPoint)padding     
{
CCMenuItem *dummy = (CCMenuItem *)[menu.children objectAtIndex:0];
int itemIndex = 0;

float w = dummy.contentSize.width;
float h = dummy.contentSize.height;

CGSize screenSize = [[CCDirector sharedDirector]winSize];
CCArray *items = [menu children];

float startX;

for (int i = rows - 1; i >=0; i--)
{
    int colsNow = info[i].cols;

    startX = (screenSize.width - (colsNow * w + padding.x * (colsNow - 1)))/2;
    float y = i * (padding.y + h);

    for (int j = 0; j < colsNow; j++)
    {
        CCMenuItem *item = (CCMenuItem *)[items objectAtIndex:itemIndex];
        item.anchorPoint = ccp(0,0);
        item.position = ccp(startX, y);
        startX += padding.x + w;
        itemIndex++;
    }
}
}
//create custom keyboard
NSArray *captions = [NSArray arrayWithObjects:
@"Q", @"W", @"E", @"R", @"T", @"Y", @"U", @"I", @"O", @"P",
   @"A", @"S", @"D", @"F", @"G",@"H", @"J", @"K", @"L",
     @"Z", @"X", @"C", @"V", @"B", @"N", @"M", nil];

CCMenu *menu = [CCMenu menuWithItems:nil];

[self addChild:menu];

for (NSString *caption in captions)
{
    CCLabelTTF *label = [CCLabelTTF labelWithString:caption fontName:@"Courier" fontSize:25];
    CCMenuItemLabel *item = [CCMenuItemLabel itemWithLabel:label target:self selector:@selector(callDelegate:)];
    [menu addChild:item];
}

RowInfo info[3] = {{7}, {9}, {10}}; //inverse order

[self layoutMenu:menu withRowInfo:info rows:3 padding:ccp(15, 15)];
CCMenu* menu = [CCMenu menuWithItems:...];
NSNumber* itemsPerRow = [NSNumber numberWithInt:5];
[menu alignItemsInColumns:itemsPerRow, itemsPerRow, itemsPerRow, nil];