0

足を濡らすために、cocos2dで簡単なボードゲームを組み立てています。ユーザーのクリックを追跡するために、ゲームのピースの追跡を簡素化するために、ゲームのピースではなく、ゲームの正方形のクリックをリッスンするつもりです。8x8ボードになります。

次のことを行う方が効率的ですか。

A.テストするCGRectの配列を作成し、配列に追加する前に構造体をNSObjectに配置する必要があります。継ぎ目は単純ですが、必要になるたびにCGRectにアクセスするために多くの作業が行われているように見えます。

また

B.実際のCCSpriteを作成し、それらの外接する長方形に対してテストします。コーディングは簡単ですが、画面上に64個の不要なビジュアルオブジェクトが余分にあり、メモリの使用量が膨大になっています。

あるいは

C.他の方法、そして私はこのツールを根本的に誤解しています。

4

1 に答える 1

1

ボードが完全に静止している場合、ボード上のゲーム スクエアごとにスプライトを作成する必要がないように思われることに同意します。

ただし、CGRect はオブジェクト タイプではないため、NSMutableArray に追加することはできません。また、ある時点で、ゲーム スクエアを強調表示するなど、他のことをしたいと思うこともあると思います。私がお勧めするのは、CCNode から継承する GameSquare というクラスを作成し、それらを配列に入れることです。

// GameSquare.h

@interface GameSquare : CCNode {
    //Add nice stuff here about gamesquares and implement in GameSquare.m
}

その後、ゲームスクエアをノードとして作成できます:

// SomeLayer.h
@interface SomeLayer : CCLayer {
    NSMutableArray *myGameSquares;
    GameSquare *magicGameSquare;
}

@property (nonatomic, strong) GameSquare *magicGameSquare;

// SomeLayer.m

/* ... (somewhere in the layer setup after init of myGameSquares) ... */

GameSquare *g = [[GameSquare alloc] init];
g.position = CGPointMake(x,y); //replace x,y with your coordinates
g.size = CGSizeMake(w,h); //replace w,h with your sizes

[myGameSquares addObject:g];

self.magicGameSquare = [[GameSquare alloc] init];
magicGameSquare.position = CGPointMake(mX,mY); //replace with your coordinates
magicGameSquare.size = CGSizeMake(mW,mH); //replace with your sizes

その後、次のようにゲームスクエアに対してヒット テストを実行できます (CCLayer サブクラスで):

// SomeLayer.m
- (BOOL)ccTouchBegan:(UITouch *)touch withEvent:(UIEvent *)event {
    CGPoint location = [self convertTouchToNodeSpace: touch];

    // Example of other objects that user might have pressed
    if (CGRectContainsPoint([magicSquare getBounds], location)) {
        // User pressed magic square!
        [magicSquare doHitStuff];
    } else {
        for (int i=0; i<myGameSquares.count; i++) {
            GameSquare *square = [myGameSquares objectAtIndex:i];    

            if (CGRectContainsPoint(square.boundingBox, location)) {
                // This is the square user has pressed!
                [square doHitStuff];
                break;
            }
        }
    }     

    return YES;
}

はい、リストを確認する必要がありますが、プレーヤーが 1 回のタッチで多くの四角形を押すことができない場合は、例に示されているように、正しい四角形が見つかったらすぐに検索を停止できます。

(ARCの使用を想定)

PS。ある時点で GameSquare に任意のスプライトを追加する必要がある場合は、GameSquare クラスに CCSprite メンバーを追加して、それを参照するだけです。

于 2012-08-16T17:20:51.833 に答える