2

画面のどこかで 2 つのビューが交わるアプリを開発中です。それらが出会うと、衝突検出器がこのメソッドを起動します。適切なベースを識別し、両方のビューをそれに送信することになっています。まさにそれを行いますが、4 秒間ではなく、即座に発生します。私は何が欠けていますか?RADIUS は、このコードの上に定義されています。矢印がUIViewではないことと関係がありますか? spriteView クラスは UIView のサブクラスです。

-(void)sendToBase:(spriteView *)arrow
{
   int teamNumber = arrow.teamNumber;
   // Find the location of the base.
   for (UIView *scaledView in self.view.subviews) {
      if (scaledView.tag == 100) {
         for (UIView *base in scaledView.subviews) {
            if (base.tag >= 1000) {
               if (teamNumber + 1000 == base.tag) {
                  // We found the right base.
                  CGPoint newCenter;
                  newCenter.x = base.center.x + arc4random() % (int) floor(RADIUS) - RADIUS/2.0;
                  newCenter.y = base.center.y + arc4random() % (int) floor(RADIUS) - RADIUS/2.0;
                  [UIView animateWithDuration:4.0 delay:0.0 options:UIViewAnimationCurveLinear animations:^{
                     [arrow setCenter:newCenter];
                  } completion:^(BOOL finished) {
                     // After walking back to base, remove and create new objects
                     [arrow removeFromSuperview];
                     [self addArrow:scaledView toTeam:teamNumber];
                  }];
               }
            }
         }
      }
   }
}

クラスタイプの不一致が問題である可能性が低いので、コードを修正しましたが、結果は同じでした。

-(void)sendToBase:(spriteView *)arrow
{
   UIView *uiSpriteView = (UIView *)arrow;
   int teamNumber = arrow.teamNumber;
   // Find the location of the base.
   for (UIView *scaledView in self.view.subviews) {
      if (scaledView.tag == 100) {
         for (UIView *base in scaledView.subviews) {
            if (base.tag >= 1000) {
               if (teamNumber + 1000 == base.tag) {
                  // We found the right base.
                  CGPoint newCenter;
                  newCenter.x = base.center.x + arc4random() % (int) floor(RADIUS) - RADIUS/2.0;
                  newCenter.y = base.center.y + arc4random() % (int) floor(RADIUS) - RADIUS/2.0;
                  [UIView animateWithDuration:4.0 delay:0.0 options:UIViewAnimationCurveLinear animations:^{
                     [uiSpriteView setCenter:newCenter];
                  } completion:^(BOOL finished) {
                     // After walking back to base, remove and create new objects
                     [arrow removeFromSuperview];
                     [self addArrow:scaledView toTeam:teamNumber];
                  }];
               }
            }
         }
      }
   }
}
4

2 に答える 2

0

問題を解決しました(setCenterを使用)。2つのアニメーションが進行中です。

最初のアニメーションは、衝突の前に発生します。2 番目のアニメーションは、衝突の結果として発生します。

衝突を検出する (そして 2 番目のアニメーションを生成する) コードは、完了ブロックではなくアニメーション ブロックにありました。コードを完了ブロックに移動すると、2 番目のアニメーションが機能しました。よくほとんど。2 つの矢印のうちの 1 つが適切にアニメーション化されました。それらの1つが機能しているので、おそらく他の問題を突き止めることができます。

于 2012-12-03T22:55:57.143 に答える
0

ドキュメントによると、プロパティをアニメーション化するには メソッドbeginAnimations:context:とメソッドを使用する必要があります。commitAnimationscenter

于 2012-12-03T22:21:29.033 に答える