我正在cocos2d中制作一个简单的棋盘游戏来弄湿我的脚。为了跟踪用户点击,我打算监听游戏方块的点击,而不是游戏碎片,以简化跟踪游戏碎片。这将是 8x8 板。
以下做法是否更有效:
一个。 制作一个 CGRect 数组进行测试,并且需要在添加到数组之前将结构放入 NSObject 中。 接缝很简单,但每次需要访问 CGRect 时看起来都需要做很多工作。
或
B.制作实际的CCSprite并针对其边界矩形进行测试。 编码简单,但屏幕上有额外的 64 个不需要的视觉对象,使内存使用膨胀。
甚至
三.其他一些方法,我从根本上误解了这个工具。
我同意,如果你的棋盘是完全静态的,似乎没有必要为棋盘上的每个游戏方块创建一个精灵。
但是,CGRect 不是一个对象类型,因此它不能添加到 NSMutableArray 中,我也会假设在某些时候你会想要对你的游戏广场做其他事情,比如突出显示它们和其他东西。我建议你做的是创建一个名为GameSquare的类,它继承自CCNode,并将它们放入一个数组中:
// 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;
}
是的,您必须浏览列表,但除非玩家可以一键按下多个方块,否则您可以在找到正确的方块后立即停止搜索,如示例中所示。
(假设使用 ARC)
附言。如果你在某个时候需要为GameSquare添加任何精灵,只需在你的GameSquare类中添加一个CCSprite成员并参考它。