1

クイズゲームを作成していますが、3秒間隔で1つずつ消えるUIButtonを実装するための最良の方法がわかりません。3秒後に最初のUIButtonを非表示にすることはできますが、後続のUIButtonにはかなり時間がかかります。

問題は、UIButtonを非表示にするたびにコードが非効率になることだと思います。次のメソッドは、NSIntervalを繰り返して呼び出し、後続の各UIButtonを非表示にします。

-(void)hideButton {int buttonNum;

while(buttonNum != -1)
{
    buttonNum = rand() % 5;

    if(buttonNum != [quiz correctNumber])
    {
        if(buttonNum == 0 && [buttonOne isEnabled] == YES)
        {
            [UIView beginAnimations:@"buttonFades" context:nil];
            [UIView setAnimationDuration:0.5];
            [buttonOne setEnabled:NO];
            [buttonOne setAlpha:0.0];
            [UIView commitAnimations];
        }
        else if(buttonNum == 1 && [buttonTwo isEnabled] == YES)
        {
            [UIView beginAnimations:@"buttonFades" context:nil];
            [UIView setAnimationDuration:0.5];
            [buttonTwo setEnabled:NO];
            [buttonTwo setAlpha:0.0];
            [UIView commitAnimations];
        }
        else if(buttonNum == 2 && [buttonThree isEnabled] == YES)
        {
            [UIView beginAnimations:@"buttonFades" context:nil];
            [UIView setAnimationDuration:0.5];
            [buttonThree setEnabled:NO];
            [buttonThree setAlpha:0.0];
            [UIView commitAnimations];
        }
        else if(buttonNum == 3 && [buttonFour isEnabled] == YES)
        {
            [UIView beginAnimations:@"buttonFades" context:nil];
            [UIView setAnimationDuration:0.5];
            [buttonFour setEnabled:NO];
            [buttonFour setAlpha:0.0];
            [UIView commitAnimations];
        }
        else if(buttonNum == 4 && [buttonFive isEnabled] == YES)
        {
            [UIView beginAnimations:@"buttonFades" context:nil];
            [UIView setAnimationDuration:0.5];
            [buttonFive setEnabled:NO];
            [buttonFive setAlpha:0.0];
            [UIView commitAnimations];
        }

        buttonNum = -1;
    }
}

}

4

3 に答える 3

3

たとえば、ボタンが 2 つしか残っていない場合でも、0 から 4 の間の乱数を生成するため、実際にもう 1 つのボタンを非表示にする可能性は 20% だけです。乱数は正しいものと一致し、これらの条件下では 60% の確率で何もしません。なぜなら、それは既に消えたボタンと一致するからです。

最初に、実際に消える可能性のある 4 つのボタンへの参照を配置した配列を保持することをお勧めします (いずれにせよ消えることはないので、そこに正しい番号の 1 を入れないでください)。関数で、その配列に N 個のボタンが残っている場合に 0 から N-1 の間の乱数を生成して、効果的で簡潔なコードで適切なボタンを消すことができるようにします。配列内の 1 つ) を最後のものと交換し、N を 1 減らします。もちろん、N が 1 の場合、乱数も必要ありません。

于 2009-06-08T01:12:04.213 に答える
1

設定した間隔でボタンを非表示にする別の方法は、

- (void)performSelector:(SEL)aSelector withObject:(id)anArgument afterDelay:(NSTimeInterval)delay

方法。これを使用するには、呼び出されたときにボタンを非表示にする関数を定義します。

-(void)hideButton:(UIButton *)button{
button.enabled = NO;
[UIView beginAnimations:@"buttonFades" context:nil];
[UIView setAnimationDuration:0.5];
[button setAlpha:0.0];
[UIView commitAnimations];
}

次に、これらの遅延セレクターを次のようなループで吐き出します。

for(int i=0; i<numButtons; i++){
    [self performSelector:@selector(mySelector:) withObject:buttons[i] afterDelay:3*i+3]
}
于 2009-06-09T13:20:53.290 に答える
1

Alex Martelli からの良い回答です。もう 1 つの可能性は、個別のオブジェクト buttonOne、buttonTwo などをボタンの 1 つの配列、button[5] に置き換え、大きなループを次のように置き換えることです。

do {
   buttonNum = rand() % 5;
} while (buttonNum == [quiz correctNumber] || ![buttons[buttonNum] isEnabled]);

[buttons[buttonNum] setEnabled:NO]; // Doesn't need to be in animation block
[UIView beginAnimations:@"buttonFades" context:nil];
[UIView setAnimationDuration:0.5];
[buttons[buttonNum] setAlpha:0.0];
[UIView commitAnimations];

*** ダン、以下: ボタンの非表示の順序をランダム化し、正しい答えが非表示にならないようにするための何かが必要ですが、それ以外の場合も優れたソリューションです。

于 2009-06-08T18:44:24.810 に答える