0

画像が空から落ちるアプリを作成し、ユーザーが移動可能なバスケットで底に「キャッチ」する必要があります。落ちる画像とバスケットの画像を CGRectMake フレームに入れ、CGRectIntersectsRect を使用して衝突を検出しました。ただし、すべての衝突を検出しているわけではありません。たとえば、視覚的に 10 個のオブジェクトを「キャッチ」したとします。2 つのフレームは確実に交差していますが、2 つをキャッチしたとしか表示されません。何が間違っていますか?

バケットのコードは次のとおりです。

  • (void)viewDidLoad { [super viewDidLoad];

    basketView = [[UIImageView alloc]
                  initWithImage:[UIImage imageNamed:@"bucket.png"]];
    basketView.frame = CGRectMake(130.0, 412.0, 30.0, 30.0);
    [self.view addSubview:basketView];
    

    }

落下オブジェクトと衝突コードは次のとおりです。

- (void)onTimer
{
    UIImageView* appleView = [[UIImageView alloc] initWithImage:appleImage];


    int applePosition = round(random() % 320); //random starting x coord
    double scale = 1 / round(random() % 100) + 1.0; //random apple size
    double speed = 1 / round(random() % 100) + 1.0; //random apple speed


    appleView.frame = CGRectMake(applePosition, -100.0, 25.0 * scale, 25.0 * scale);

    [self.view addSubview:appleView];

    [UIView beginAnimations:nil context:(__bridge void *)(appleView)];
    [UIView setAnimationDuration:3 * speed];


    appleView.frame = CGRectMake(applePosition, 500.0, 25.0 * scale, 25.0 * scale); 


    // Test for landing in bucket
    if (CGRectIntersectsRect(basketView.frame, appleView.frame)) {
        collision++;
        printf("%i\n", collision);
        [appleView removeFromSuperview];
    }
}

編集:バスケットを大きくしたところ、スパムの番号が表示され、リンゴが表示されなくなりました。したがって、実際のアニメーションではなく、開始点でリンゴとの交差をチェックしているだけだと思います。アニメーション中に交差をチェックするにはどうすればよいですか?

4

1 に答える 1

1

明らかに、タイマー関数が新しいオブジェクトを生成する場合、テストはオブジェクトの作成直後に実行されるため、オブジェクトが実際にバスケットに作成されていない場合、ヒットテストは常に負になります。

ここで、10分の1秒ごとに衝突をテストする別のタイマーが必要です(オブジェクトの移動速度に応じて、これは多かれ少なかれ可能性があります)。さらに優れたオプション(パフォーマンスの観点から)はCADisplayLink、タイマーのように機能するものを使用することです。これにより、テストをディスプレイのリフレッシュレートに同期させることができます。

于 2012-11-29T21:37:18.957 に答える