2011-08-11 3 views
0

私は小さな画面を書こうとしていますが、メイン画面で飛んでいる "バブル"をアニメーションします。このアニメーションは連続していなければなりません。 (私はスクリーンから飛び出した泡を再利用します)UIを変更するすべての操作と同じように、アニメーションをメインスレッドで実行する必要があると聞きました。これは本当ですか?この画面でUIAlertViewを表示しようとすると、バブルアニメーションが連続しているためアニメーションが非常に曖昧になります。 (これはインジケータ付きのカスタムアラートビューです)デバイスはiPhone 4なので、通常のUIAlertViewを表示するのは問題ではないと思います。継続的なアニメーションの間、UClertViewのアニメーション化を回避しますか?

バブルアニメーションに正しい方法を使用するかどうかを質問したいと思います。まず第1に、NSTimerを使用します。これは0.01秒ごとにstartAnimationメソッドを呼び出します(コントローラのviewDidAppear:メソッドで起動します)。 startAnimationメソッドでは、まず、xとyのランダムな座標を持つバブルを生成します(viewdidが現れた直後に画面にバブルが表示されます)。そして、xとy = 460のランダムな座標でバブルを生成します。 startAnimationメソッドでは、カウンタ(フレームと呼ばれます)を実行します。このカウンタの値が35になると、再びバブル生成メソッドを呼び出します。

問題:

Iは、別の配列の配列中に発生した気泡、及び(画面オフ)「ゴーン」気泡を格納します。最初に、私は泡消しの配列の泡を再利用しようとすると、配列がなくなると新しい泡ができます。この操作が処理されている間、連続アニメーションは停止し、次に続行されます。休憩は約1秒ですが、これは非常に邪魔です。 誰でもこの問題を解決できますか?アドバイスのおかげでは、マグカップクラスで

- (void)viewDidAppear { 

    . 

    timer = [NSTimer scheduledTimerWithTimeInterval:0.01 target:self selector:@selector(startAnimation) userInfo:nil repeats:YES]; 
    . 
} 


- (void)startAnimation { 

    self.current = [NSDate timeIntervalSinceReferenceDate]; 
    double diff = (self.start - self.current); 

    if (diff < 0) { 
     diff = (-1) * diff; 
    } 

    self.start = self.current; 
    frames++; 

    if (shouldMoveBubbles) { 
     [mug moveBubbles:diff]; 
    } 

    if (frames == 35) { 
     DebugLog(@"################################################################"); 
     DebugLog(@"####################### FRAME = 35 ###########################"); 
     DebugLog(@"################################################################"); 
     [mug createNewBubbleOnTheBottomOfView:self.view]; 
     frames = 0; 
    } 
} 

をmadik:

- (void)moveBubbles:(double)millisElapsed { 

    for (Bubble *bubble in bubbles) { 

     int bubbleSpeed = bubble.speed; 

     float deltaX = (float)(bubbleSpeed * -degrees_sinus * millisElapsed * 100); 
     float deltaY = (float)(bubbleSpeed * -degrees_cosinus * millisElapsed);   

     DebugLog(@"movebubbles x: %f, y:%f, speed: %d, sin:%f, cos:%f", deltaX, deltaY, bubbleSpeed, degrees_sinus, degrees_cosinus); 

     [bubble moveBubbleX:deltaX Y:deltaY]; 
    } 
} 

バブルクラスで:

- (void)moveBubbleX:(float)deltaX Y:(float)deltaY { 
    self.bubbleImage.center = CGPointMake(self.bubbleImage.center.x + deltaX, self.bubbleImage.center.y + deltaY); 
} 
+0

このような意味で「言葉遣い」とはどういう意味ですか? – Moshe

+0

アクティビティインジケータを使ってアラートビューを想像してみてください。それを表示しようとすると(バブルアニメーションを覚えておいてください)、非常にゆっくりと表示され、アクティビティインジケータのアニメーションがつまって固執しています。アラートビューを閉じると、非常にゆっくりと消えます。だからプロセス全体が非常に遅いです。 – madik

+0

それはメモリの問題のように聞こえます。私は 'Build and Analyze'を使ってこれをソートすることをお勧めします。 – Moshe

答えて

2

これは、メモリの問題のように聞こえます。ゆっくりとしたUIAlertViewアニメーションは、これの確かな兆候です。気泡を発生させているように、問題を引き起こしているようです。あなたは2つのバブルの配列を保持していると言いました。いずれかのアレイに同時に存在する可能性のある気泡の数を制限するかどうかは決して言いません。あなたはまた、これらの泡をきれいにするときは言及しません。それはメモリ "ブラックホール"のように聞こえる。一度に画面に表示できる気泡の最大数を設定することをおすすめします。

また、カスタムアラートビューについても言及します。 UIAlertViewを変更している場合は、正式にはサポートされていないので、問題が発生します。また、メモリが不足しているときにUIAlertViewアニメーションが遅くなるのを見たことがあります。あなたの泡でメモリの問題を解決するなら、おそらくこれも解決します。

最後に、アドバイスの言葉。 UIKitでアニメーションゲームを作るのは良い考えではないでしょう。 NSTimersは多くの人々が思っているほど正確ではありません。 UIImageは、ロードするのに比較的高価です。動きのあるボタンに触れることは、最悪でも信頼できないことが知られています。私はCocos2d-iphoneのようなゲームフレームワークを調べることをお勧めします。

幸運を祈る!

関連する問題