私は iPhone に Cocos2d を使用していますが、この方法を使用して敵をスポーンするコードのロジックを構築する方が効率的かどうか疑問に思っています。
-(無効) スケジュール:(SEL)セレクタ間隔:(ccTime)間隔
または EnemyCache クラスで更新を使用して、時間間隔が満たされているかどうかを毎回確認します。EnemyCache クラスの update メソッドで呼び出されるコード スニペットを次に示します (相対時間は、GameScene クラスの更新ごとに GameScene によって更新される整数値です。GameScene 更新メソッドの呼び出しは、1 の間隔でスケジュールされます。 2番目):
-(void) checkForPlayerCollisionsAndSpwanTime
{
int count = [elements count];
//CCLOG(@"count %i", count);
Element* element;
for(int i=0; i<count;i++){
element = [elements objectAtIndex:i];
NSAssert(element!=nil, @"Nil enemy");
if (element.visible)
{
[element justComeDown];
ShipEntity * ship = [[GameScene sharedGameScene]defaultShip];
CGRect rect = [ship boundingBox];
if (CGRectIntersectsRect([element boundingBox], rect)){
[element doWhatever];
element.visible=FALSE;
[element stopAllActions];
}
}
else{
if(element.spawnTime == relativeTime) {
[self addChild:element];
element.visible=TRUE;
}
}
}
}
違いは、このように更新のたびにcheckForPlayerCollisionsAndSpwanTimeメソッドが敵の配列を通過することです。最初の方法では、同様のメソッドを呼び出すようにセレクターをスケジュールすることで、配列と条件を調べるために CPU が費やす時間を削減できました。
この呼び出しがどれほどコストがかかるかはわかりません。
[self schedule:selector interval:interval repeat:kCCRepeatForever delay:0];
よく見ると、このメソッドが呼び出されていることがわかります (以下を参照) が、一般的に、この問題に対するあなたのアプローチと、EnemyCache 更新メソッドを使い続けるか、または scheduleSelector メソッドを使用する必要があるかを尋ねたかったのです。
-(void) scheduleSelector:(SEL)selector forTarget:(id)target interval:(ccTime)interval paused:(BOOL)paused repeat:(uint) repeat delay:(ccTime) delay
{
NSAssert( selector != nil, @"Argument selector must be non-nil");
NSAssert( target != nil, @"Argument target must be non-nil");
tHashSelectorEntry *element = NULL;
HASH_FIND_INT(hashForSelectors, &target, element);
if( ! element ) {
element = calloc( sizeof( *element ), 1 );
element->target = [target retain];
HASH_ADD_INT( hashForSelectors, target, element );
// Is this the 1st element ? Then set the pause level to all the selectors of this target
element->paused = paused;
} else
NSAssert( element->paused == paused, @"CCScheduler. Trying to schedule a selector with a pause value different than the target");
if( element->timers == nil )
element->timers = ccArrayNew(10);
else
{
for( unsigned int i=0; i< element->timers->num; i++ ) {
CCTimer *timer = element->timers->arr[i];
if( selector == timer->selector ) {
CCLOG(@"CCScheduler#scheduleSelector. Selector already scheduled. Updating interval from: %.4f to %.4f", timer->interval, interval);
timer->interval = interval;
return;
}
}
ccArrayEnsureExtraCapacity(element->timers, 1);
}
CCTimer *timer = [[CCTimer alloc] initWithTarget:target selector:selector interval:interval repeat:repeat delay:delay];
ccArrayAppendObject(element->timers, timer);
[timer release];
}