2011-12-19 4 views
3

ゲームを開発して、NSTimerの小さな問題に挑戦しています。スプライトがフェードアウトする前にシーン内である程度の時間が経過しているように見えます。NSTimerはすぐに発砲する

double CALC_TIME = 5; 
[NSTimer scheduledTimerWithTimeInterval:CALC_TIME target:self selector:@selector(hideSprite) userInfo:nil repeats:NO]; 

hideSpriteは5秒後に呼び出されますが、代わりに即座に呼び出されます(または近い瞬間)。

可能な解決策:私は繰り返すタイマーをセットして、フェージングが行われている次のインターバルを最初に設定され、ブールfirstCallを持つことによってこれを行うことができます知っている 、タイマーは無効けどさあなたの助けのための

bool firstCall = false; 
-(void)hideSprite{ 
     if(!firstCall){ 
     firstCall = true 
    }else{ 
     //fade out sprite 
     //Invalidate NSTimer 
     //firstCall = false; 
    } 
} 

ありがとう:これはこのような良い習慣

ではないと思います!

+2

これは動作するはずです。他の何かが間違っています - あなたは 'hideSprite'が他のコードから呼び出されていないのでしょうか?いくつかのテストコードのように、タイマーが設定された直後にまだ残っていますか? –

+0

いいえ、私はちょうどそこにチェックしました、方法は1つの場所からのみ呼び出されます 私はメソッドを初期化した直後にNSLogを追加しました。 _2011-12-19 21:43:11.547スキッシュエム[14144:10a03]:43:11.562スキッシュエムタイマ 2011-12-19 21呼び出さ[14144を:10a03]呼び出さタイマ 出力を保持します2011-12-19 21:43:16.582 Squish Em [14144:10a03]タイマーが呼び出されました 2011-12-19 21:43:16.596 Squish Em [14144:10a03] Timer_ – Rich

答えて

2

他の何かがhideSpriteと呼んでいると思われます。 と書いたコードはになります。セレクタhideSpriteを呼び出す前にタイマーを5秒間待機させます。

タイマーに別のセレクター(ちょうどNSLogの新しいテストメソッドを書き込む)を提供し、何が起こるかを確認します。これにより、a)タイマーが実際にすぐに発射されているかどうか、b)何か他のものがhideSpriteと呼んでいるかどうかがわかります。

[NSTimer scheduledTimerWithTimeInterval:CALC_TIME target:self selector:@selector(testTimer) userInfo:nil repeats:NO]; 

-(void) testTimer { NSLog(@"Timer - and only the timer - called me."); } 
-(void) hideSprite { 
    NSLog(@"I definitely wasn't called by the timer."); 
} 
+0

私はこれを行いました。奇妙なことに、このメソッドを5秒後に呼び出すようになりました。私はそれを元に戻して、今は正常に動作していますが、なぜわからないのですか...助けてくれてありがとう、何が起こっているのを見て! – Rich

+2

ああ、gremlins。彼らは本当です、あなたは知っている:) –

0

initWithFireDate:interval:target:selector:userInfo:repeatsメソッドを使用してタイマーを初期化することを検討してください。詳細はNSTimerをご覧ください。

+0

と呼ばれました。 ?この方法を使用することは、単に時間間隔を使用するのではなく、発射日を計算することを意味し、タイマーのメモリ管理についてさらに心配することになります。 –

1

かなり頻繁に、それはちょうど

[UIView animateWithDuration: 0 delay: 5 options:0 animations: nil completion: 
^{ 
    // fade sprite 
}]; 

(わからないanimationsがnilすることができますが、あなたのアイデアを取得する場合)のようなものを使用する方が簡単です。

+0

問題を解決するには賢い方法ですが、アニメーションを使用して特定の遅延を持つメソッドをトリガするだけでは正しくありません。 – FormigaNinja

関連する問題