1

画像が別の画像と衝突したときに検出する必要があるアプリケーションのレイアウトがあります。

ここで、ユーザーは、目的の場所をタップして、画面上に「imgView」という名前のUIImageViewの同じインスタンスである複数の「ボール」を作成します。

- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event {

    UITouch *myTouch = [[event allTouches] anyObject];
    imgView = [[UIImageView alloc] initWithFrame:CGRectMake(40, 40, 40, 40)];
    imgView.image = [UIImage imageNamed:@"ball.png"];
    [self.view addSubview:imgView];
    imgView.center = [myTouch locationInView:self.view];

}

(imgViewはヘッダーでUIImageViewとして宣言されています):

    UIImageView *imgView;

今、私は「スタッフ」と呼ばれる画像も持っています。これは、画面上で水平方向にパンする長いバーです。画像「staff」が変数「imgView」またはユーザーが画面に配置したボールとのすべての衝突を検出するようにします。したがって、ユーザーは画面上の10の異なる場所をタップすることができ、「スタッフ」はすべての場所をキャッチできるはずです。

NSTimerによってアクティブ化される次のCGRectIntersectsRectコードを使用します。

-(void)checkCollision {
    if( CGRectIntersectsRect(staff.frame,imgView.frame)) {
    [self playSound];
    }
}

ただし、交差は、ユーザーが作成したLASTインスタンスまたは「ボール」でのみ検出されます。スタッフはそれに反応しますが、残りの部分をパンします。すべてのインスタンスを検出するようにコードを修正するための助けをいただければ幸いです。

4

1 に答える 1

1

新しいボールを作成するたびに、imgViewインスタンス変数をオーバーライドします。したがって、checkCollisionメソッドはの最新の値imgView、つまり最後に作成されたボールのみを確認します。

代わりに、画面上のすべてのボールを追跡しNSArray、その配列内のすべての要素との衝突をチェックすることができます。imgViewこれを行うには、インスタンス変数を次のように置き換えます。

NSMutableArray *imgViews

次に、早い段階で、たとえばviewDidLoad配列を初期化します。

 imgViews = [[NSMutableArray alloc] init]

配列-touchesEnded:withEvent:に新しいものを追加します。UIImageView

- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event {

     UITouch *myTouch = [[event allTouches] anyObject];
     UIImageView *imgView = [[UIImageView alloc] initWithFrame:CGRectMake(40, 40, 40, 40)];
     imgView.image = [UIImage imageNamed:@"ball.png"];
     [self.view addSubview:imgView];
     imgView.center = [myTouch locationInView:self.view];
     [imgViews addObject:imgView]
}

そして最後に、checkCollision配列を反復処理して、すべての要素に対してチェックを実行します

 - (void)checkCollision {
      for (UIImageView *imgView in imgViews) {
           if( CGRectIntersectsRect(staff.frame,imgView.frame)) {
                 [self playSound];
      }
   }
于 2012-07-18T07:14:05.100 に答える