シマリスspaceManagerを使用するためだけのcpCCSpriteのサブクラスがあり、クラスは次のようになります。
@implementation Helmet
+(id) helmetWithGame:(Game*)game {
return [[[self alloc] helmetInit:game] autorelease];
}
- (id) helmetInit:(Game*)game {
cpShape *helmet_1;
cpShape *helmet_2;
cpShape *helmet_3;
cpShape *reference;
reference = [game.spaceManager addCircleAt:cpvzero mass:STATIC_MASS radius:2];
helmet_1 = [game.spaceManager addCircleToBody:reference->body radius:20 offset:cpv(-5, 2)];
helmet_2 = [game.spaceManager addCircleToBody:reference->body radius:8 offset:cpv(16, -14)];
helmet_3 = [game.spaceManager addCircleToBody:reference->body radius:8 offset:cpv(8, -14)];
reference->group =1;
helmet_1->group =1;
helmet_2->group =1;
helmet_3->group =1;
[self initWithFile:@"Helmet.png"];
[self setBody:reference->body];
self.spaceManager = game.spaceManager;
self.autoFreeShapeAndBody = YES;
gameScreenSize = game.contentSize;
return self;
}
- (void) generateAndShowOn:(Game *)game {
float startX = (float)((arc4random_uniform(101)) + 100);//returns number from 100 to 200 and casts it as a float
float startY;
int endXRange = (game.contentSize.width * .8) - (game.contentSize.width * .5);
float endX = (float)((arc4random_uniform(endXRange)) + (game.contentSize.width * .5));
float endY;
BOOL shouldStartTop;
if ((arc4random_uniform(101)) < 50) {//returns number from 0 to 100 and checks to see if it is less than 50. If it is, than the helmut starts at the top
shouldStartTop = YES;
startY = game.contentSize.height + (self.contentSize.height * .5);
endY = -self.contentSize.height;
}
else {
shouldStartTop = NO;
startY = -(self.contentSize.height * .5);
endY = game.contentSize.height + self.contentSize.height;
}
self.position = ccp(startX, startY);
[game addChild:self];
ccBezierConfig bezier;
bezier.controlPoint_1 = ccp (startX, startY);
bezier.controlPoint_2 = ccp (endX, endY);
bezier.endPosition = ccp (endX, endY);
id rotate =[CCRotateBy actionWithDuration:1.5f angle:360];
id curve = [CCBezierTo actionWithDuration:1.5f bezier:bezier];
id spawn = [CCSpawn actions:rotate, curve, nil];
[self runAction:spawn];
[self schedule:@selector(doneAnimating) interval:1.6];
}
- (void) doneAnimating{
if ([[self delegate]respondsToSelector:@selector(helmetPastBounds:)]) {
[[self delegate]helmetPastBounds:self];
}
}
- (void) dealloc {
CCLOG(@"%s", __PRETTY_FUNCTION__);
[super dealloc];
}
@end
したがって、このクラスの新しいインスタンスは毎秒呼び出されるため、一度に複数のヘルメットを画面に表示できます。次に、現在のヘルメットを取り外して割り当てを解除するために、アクションが終了した直後に呼び出される別のメソッドがあります。しかし、私が抱えている問題は、アクションがぎくしゃくしたりぎくしゃくしたりすることがよくあることです。これは、FPSが60の場合です。アクションで何か別のことをする必要がありますか、それともこれを引き起こしている可能性がありますか?