0

私は通常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」、およびの次元である「self.textureInfo.width」と「self.textureInfo.height」に基づいてtexturedQuadsを作成します。スプライトシート全体:

    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」に追加する方法がわからないことです。パラメータはTexturedQuadではなくidである必要があるため、単純な書き込み[quads addObject:q]は機能しません。intなどからIDを作成する方法の例を見てきましたが、TexturedQuadのようなオブジェクトでそれを行う方法がわかりません。

4

2 に答える 2

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];

詳細については、こちらをご覧ください。

@Bersaelorが指摘したように、より良いパフォーマンスが必要な場合は、純粋なCを使用するか、Obj-C ++に切り替えて、Obj-Cオブジェクトの代わりにベクトルを使用してください。

于 2012-07-03T16:45:04.507 に答える
2

NSMutableArrayは、構造体だけでなく、任意のNSObject*を取ります。

Objective-Cでのプログラミングに真剣に取り組んでいる場合は、いくつかのチュートリアルをご覧ください。

さらに、NSMutableArraysは便宜上のものであり、その配列に多数のオブジェクトを追加/削除する場合は、プレーンなCスタックを使用します。特に、より低レベルのアプローチでパフォーマンスが向上するというユースケースの場合。Objective-C(++)はC(++)のスーパーセットにすぎないため、使い慣れたC(++)コードを使用できます。

iOS用のゲーム戦術を書いたとき、重い物を持ち上げる必要があるときはいつでもCコードに切り替えました(つまり、1秒間に数百回呼び出される再帰的なAI関数)。

于 2012-07-03T16:44:47.383 に答える