我在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); }
以上就是c/c++开发分享如何在运行时为Cocos2D CCMenu menuWithItems动态创建va_list?相关内容,想了解更多C/C++开发(异常处理)及C/C++游戏开发关注计算机技术网(www.ctvol.com)!)。
本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。
ctvol管理联系方式QQ:251552304
本文章地址:https://www.ctvol.com/c-cdevelopment/522442.html