ボードが完全に静止している場合、ボード上のゲーム スクエアごとにスプライトを作成する必要がないように思われることに同意します。
ただし、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 メンバーを追加して、それを参照するだけです。