我通常使用java或c ++编程,最近我开始使用objective-c。在objective-c中寻找向量,我发现NSMutableArray似乎是最好的选择。我正在做一个opengl游戏,我正在尝试为我的精灵创建一个NSMutableArray纹理四边形。以下是相关代码:
我定义纹理四边形:
typedef struct {
CGPoint geometryVertex;
CGPoint textureVertex;
} TexturedVertex;
typedef struct {
TexturedVertex bl;
TexturedVertex br;
TexturedVertex tl;
TexturedVertex tr;
} TexturedQuad;
我在界面中创建了一个数组:
@interface Sprite() {
NSMutableArray *quads;
}
我启动数组,然后根据“width”和“height”创建texturesQuads,它们是单个sprite的维度,以及“self.textureInfo.width”和“self.textureInfo.height”,它们是整个精灵表的尺寸:
quads = [NSMutableArray arrayWithCapacity:1];
for(int x = 0; x < self.textureInfo.width/width; x++) {
for(int y = 0; y < self.textureInfo.height/height; y++) {
TexturedQuad q;
q.bl.geometryVertex = CGPointMake(0, 0);
q.br.geometryVertex = CGPointMake(width, 0);
q.tl.geometryVertex = CGPointMake(0, height);
q.tr.geometryVertex = CGPointMake(width, height);
int x0 = (x*width)/self.textureInfo.width;
int x1 = (x*width + width)/self.textureInfo.width;
int y0 = (y*height)/self.textureInfo.height;
int y1 = (y*height + height)/self.textureInfo.height;
q.bl.textureVertex = CGPointMake(x0, y0);
q.br.textureVertex = CGPointMake(x1, y0);
q.tl.textureVertex = CGPointMake(x0, y1);
q.tr.textureVertex = CGPointMake(x1, y1);
//add q to quads
}
}
问题是我不知道如何将四元组“q”添加到数组“四边形”。简单的写[quads addObject:q]不起作用,因为参数应该是id而不是TexturedQuad。我已经看过如何从int等创建id的示例,但我不知道如何使用像TexturedQuad这样的对象。
答案 0 :(得分:5)
它的本质是你将C结构包装在一个Obj-C类中。要使用的Obj-C类是NSValue
。
// assume ImaginaryNumber defined:
typedef struct {
float real;
float imaginary;
} ImaginaryNumber;
ImaginaryNumber miNumber;
miNumber.real = 1.1;
miNumber.imaginary = 1.41;
// encode using the type name
NSValue *miValue = [NSValue value: &miNumber withObjCType:@encode(ImaginaryNumber)];
ImaginaryNumber miNumber2;
[miValue getValue:&miNumber2];
有关详细信息,请参阅here。
正如@Bersaelor所指出的,如果你需要更好的性能,可以使用纯C或切换到Obj-C ++并使用向量而不是Obj-C对象。
答案 1 :(得分:2)
NSMutableArray接受任何NSObject *但不仅仅是结构。
如果您认真考虑使用Objective-C进行编程,请查看一些tutorials。
此外,NSMutableArrays是为了方便起见,如果向该数组添加/删除大量对象,则使用普通的C-stack。 特别是对于您的用例,更低级别的方法将获得更好的性能。 请记住,Objective-C(++)只是C(++)的超集,所以你可以使用你已经熟悉的任何C(++)代码。
当我为iOS编写游戏策略时,每当我不得不进行繁重的工作时(即每秒被调用数百次的递归AI函数),我就会切换到C-Code。