2011-03-11 51 views
0

我正在制作一个简单的opengl引擎,我需要能够为包含动画帧的每个类存储一系列整数。特定于类的数组

例如:我创建了Dog类。狗有3个动画,由多个帧索引组成,代表帧在纹理图集中的位置。在类文件我想定义这些动画是这样的:

const int animations[3] = { 
    {1,2,3}, //walk 
    {4,5,6}, //jump 
    {1,7,8,9,10,11} //take a wiz 
} 

@implementation... 

这是OFC不正确的OBJ-C,但有没有办法做同样的事情? Dog的每个实例都具有相同的动画,所以我不想通过将动画存储在实例变量中来浪费内存。如果可能的话,我想避免使用NSArray。

有没有办法在类级别存储这样的二维,可变长整型数组?

回答

1

你当然可以声明一个int的静态二维数组。例如:

static int animations[3][3] = {{1,2,3},{4,5,6},{7,8,9}}; 

因为这是宣布“静”,animations不会对其进行声明的源文件的范围之外可见,并有将只有一个数组的副本。

诀窍是,C数组必须是矩形的,并且您的示例显示了不同宽度的行。

要做到这一点,你可以用一个指针数组:

static int walk[] = {1,2,3}; 
static int run[] = {4,5,6}; 
static int wiz[] = {1,2,3,4,5,6}; 
static int *animations[3] = {walk,run,wiz}; 

(在这种情况下,当然,你需要一些其他的手段来知道你什么时候会来的结束因为它们不是全部相同的长度,例如,也许一行的末尾标有'0'或'-1'值。)

+0

这样做了!但现在,我想知道每个动画的长度。做sizeof动画[0]只是返回8,我想指针地址是8位长?如果我做sizeof行我得到24.有没有办法获得指针指向数组的大小,而不是指针本身? – oskob 2011-03-11 23:22:35

+0

不是。C中的一个数组不知道它的长度;你必须跟踪你自己。一种方法(如答案中所建议的)是在最后使用“哨兵”值,例如-1(假定-1不是有效的帧索引)。或者,你将数组包装在某种记录长度的对象中(在重新发明'NSArray'的方式上,你应该使用:-))。 – 2011-03-12 00:11:09

+0

是的,我强调这一点,只是说NSArray的语法很脏。 [[NSArray alloc] initWithObjects:[NSNumber numberWithInt:0],[NSNumber numberWithInt:1],[NSNumber numberWithInt:2],nil]。 vs int arr [3] = {0,1,2} 是一个交易断路器:/ sentinel值thingie似乎是一个足够好的解决方案tohugh,谢谢! – oskob 2011-03-12 09:34:53

0

可以在任意级别存储二维数组,但二维数组中行长度可变的二维数组除非在特殊情况下通常没有用处。

无论如何,假装像Objective-C的传统方式有类变量只是在类的实现文件中创建一个静态变量并创建类访问它的方法。

0

在.m文件中声明一个静态全局变量,就像在C中一样。如果需要在类之外访问它,请创建一个类方法(例如+ (const int *)animations)以用作访问器。