如何在运行时为Cocos2D CCMenu menuWithItems动态创建va_list?

我在CCMenu课上度过了一段难忘的时光。 要使用此类创建菜单,它会强制您调用名为initWithItems的方法,该方法采用va_list。 我需要在运行时生成这个列表,并且我读到创建一个C数组并传递它可以像va_list一样起作用,只是它失败了。

我在va_list中有一个我想要的NSArray项目,这些项目是CCMenuItem的SUBCLASS,这是menuWithItems期望在va_list中的类。 如果你在编译时硬编码这个列表,它工作正常,但我动态创建这个列表的尝试不起作用。 这有什么问题? MenuItemButton是一个CCMenuItem子类。

NSArray *menuItems = [self getMenuItemsArray]; // Returns an NSArray of MenuItemButtons MenuItemButton *argList = (MenuItemButton *)malloc( sizeof(MenuItemButton *) * [menuItems count] ); [menuItems getObjects:(id *)argList]; CCMenuAdvanced* menu = [CCMenuAdvanced menuWithItems:argList]; 

这在运行时崩溃,BAD_ACCESS。 我知道va_list应该是null终止的,我不知道在调用getObjects后我的代码是否就是这种情况,或者甚至是问题。

您只需使用nil初始化菜单即可。 例如,

 CCMenu * myMenu = [CCMenuAdvanced menuWithItems:nil]; 

然后说你有一个动态的字符串列表,你在运行时加载,尝试….

 // replace this with a dynamically loaded array of items... NSArray* dynamicArray = [NSArray arrayWithObjects:@"red", @"blue", @"green", nil]; for (NSString* item in dynamicArray) { CCMenuItem *menuItem = [CCMenuItemFont itemFromString: item target: self selector:@selector(menuCallback:)]; [myMenu addChild:menuItem]; } 

va_list并不总是一个数组。 对于32位gcc,它是64位而不是。 不要依赖它。

va_list由获取可变数量参数的函数生成:

 #include  void f(int x, ...) { va_list va; va_start(va, x); function_that_wants_va(va); va_end(va); } void g(void) { f(1,2,3,4); }