0

cocos2d-iphone 2.0.0 を使用した私の iOS ゲームには、ユーザーがクリックして購入するためのボタン ( ) を使用してアプリ内購入を購入するようユーザーに求めるスプライトをポップアップするレイヤーがありますmenuItemBuyButton。ユーザーがこの購入ボタンをクリックすると、次の 3 つのことが行われます。

  • アクティビティ インジケータが開始されました
  • レイヤー上のすべてのメニュー項目が無効になります。特に、メイン メニュー (このコードはメイン メニュー シーンにあります)、購入ボタン自体、およびポップアップのメニューが無効になります。
  • 購入の呼び出しとコールバックの通常のシーケンスがトリガーされます。

購入が完了すると、(別のスレッドにある) コールバックは次のことを行う必要があります。

  • アクティビティ インジケーターを停止する
  • 無効なメニュー要素を再度有効にする
  • シーンを別の監督に置き換える

ここで、このシーケンスを実行し、購入ボタンを繰り返しクリックしてテストするなどすると、コードでクラッシュが発生しました。コードとクラッシュ ログは以下のとおりです。これは、cocos2d のスレッドセーフでない性質によるものだと思います (間違っているかもしれません)。このクラッシュを回避するにはどうすればよいですか? 購入トランザクションを開始する前に UI 要素を無効にする必要があり、トランザクションが終了したら再度有効にする必要があります。これは別のスレッドで行われます。

コードは次のとおりです。

-(void) startActivityIndicator {
    mainMenu.enabled = NO;
    scorePopupMenu.enabled = NO;
    menuItemBuyButton.isEnabled = NO;
    [activityIndicatorView startAnimating];
}

-(void) stopActivityIndicator {
    mainMenu.enabled = YES;
    scorePopupMenu.enabled = YES;//this is line 744 that crashed
    menuItemBuyButton.isEnabled = YES;
    if (activityIndicatorView.isAnimating)
        [activityIndicatorView stopAnimating];
}

クラッシュ ログ:

5   SmartRun        0x00126c4c -[MainMenuLayer stopActivityIndicator] (MainMenuLayer.m:744)
4

1 に答える 1

0

次に、繰り返しタップを無効にします。タッチが押されたら無効にし、処理されたら再び有効にします。

    node.touchEnabled = NO; //do this for all menu and layer

     (In Cocos2d 1.0 isTouchEnabled to NO) 

また、UIKit からのアクティビティ インジケーターを使用して、cocos2d ゲームで inAp 購入を使用しました。私たちが行ったのは、アラート ビュー内のアクティビティ インジケーターを使用することです。これにより、ユーザーは他の UI 切り替えを行うことができなくなります。

-(void)ShowActivityIndicator
{
    if(!mLoadingView) //    UIAlertView     *mLoadingView;
    {
        mLoadingView = [[UIAlertView alloc] initWithTitle:@"" message:@"" delegate:self cancelButtonTitle:nil otherButtonTitles:nil];

        UIActivityIndicatorView *actInd = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleWhite];
        actInd.frame = CGRectMake(128.0f, 45.0f, 25.0f, 25.0f);
        [mLoadingView addSubview:actInd];
        [actInd startAnimating];
        [actInd release];


        UILabel *l = [[UILabel alloc]init];
        l.frame = CGRectMake(100, -25, 210, 100);
        l.text = @"Please wait...";
        l.font = [UIFont fontWithName:@"Helvetica" size:16];
        l.textColor = [UIColor whiteColor];
        l.shadowColor = [UIColor blackColor];
        l.shadowOffset = CGSizeMake(1.0, 1.0);
        l.backgroundColor = [UIColor clearColor];
        [mLoadingView addSubview:l];
        [l release];
    }

    [mLoadingView show];
}

-(void)StopIndicator
{
    [mLoadingView dismissWithClickedButtonIndex:0 animated:NO];
}

ここに画像の説明を入力

于 2013-03-18T14:09:43.987 に答える