0

わかりました、最後の質問が非常にわかりにくかったので、これをより明確にしようと思います。今回は画像を入れました。これらの円はそれぞれ UIImageView であり、それぞれに 7 色のいずれかであるランダムな画像が割り当てられます。したがって、各円は 7 色のいずれかになります。ユーザーが色に応じてあらかじめ決められた順序で円を打たなければならないようにしたいと思います。たとえば、青、緑、黄、ピンク、紫、オレンジ、赤などです。私の大きな問題は、ヒットするはずのない色がヒットしたかどうかを判断する方法がわからないことです。複数の画像ビューに同じ値を割り当ててから、どういうわけかというifステートメントを持つ方法はありますか....

if(a blue circle is hit && ANY ORANGE CIRCLE IS STILL IN VIEW){
do something
}

これをコーディングする方法を私が知っている唯一の方法は、すべてのランダムな画像が割り当てられているため、非常に多くのコードになることです。

    bluebubble = [UIImage imageNamed:@"bluebubble.png"];
    greenbubble = [UIImage imageNamed:@"greenbubble.png"];
    redbubble = [UIImage imageNamed:@"redbubble.png"];
    yellowbubble = [UIImage imageNamed:@"yellowbubble.png"];
    orangebubble = [UIImage imageNamed:@"orangebubble.png"];
    pinkbubble = [UIImage imageNamed:@"pinkbubble.png"];
    purplebubble = [UIImage imageNamed:@"purplebubble.png"];


    image1 = arc4random()%7;

    if(image1 == 0){
        [test setImage:bluebubble];
    }
    else if(image1 == 1){
        [test setImage:greenbubble];
    }
    else if(image1 == 2){
        [test setImage:redbubble];
    }
    else if(image1 == 3){
        [test setImage:yellowbubble];
    }
    else if(image1 == 4){
        [test setImage:orangebubble];
    }
    else if(image1 == 5){
        [test setImage:pinkbubble];
    }
    else if(image1 == 6){
        [test setImage:purplebubble];
    }

    image2 = arc4random()%7;

    if(image2 == 0){
        [test2 setImage:bluebubble];
    }
    else if(image2 == 1){
        [test2 setImage:greenbubble];
    }
    else if(image2 == 2){
        [test2 setImage:redbubble];
    }
    else if(image2 == 3){
        [test2 setImage:yellowbubble];
    }
    else if(image2 == 4){
        [test2 setImage:orangebubble];
    }
    else if(image2 == 5){
        [test2 setImage:pinkbubble];
    }
    else if(image2 == 6){
        [test2 setImage:purplebubble];
    }

代替テキスト

4

4 に答える 4

0

一度に 1 つの色のみが有効な場合、これらを常に特定の順序で次々にヒットするつもりですか? もしそうなら、順番に色で構成されるUIImages のスタックを作成できます (組み込みのスタック データ型はないと思いますが、 で簡単にシミュレートできます)。NSMutableArray

また、画面上のすべてのカラー サークル サブビューを別の で追跡しますNSMutableArray。次に、ユーザーが円をヒットするたびに、次のコードを実行します。

if(hitImageView.image == [imageStack peek]) {
    //"hit the right one" logic

    //you hit it, so remove it from the screen
    [allImageViews removeObject:hitImageView];
    [hitImageView removeFromSuperView];

    //if it was the last imageview of the "correct" color...
    BOOL wasLast = YES;

    for(UIImageView *imageView in allImageViews) {
        if(imageView.image == [imageStack peek]) {
            wasLast = NO;
            break;
        }
    }

    //...then set the correct color to whatever is next
    if(wasLast)
        [imageStack pop];

    if(![imageStack hasItems])
       ;//"won the game" logic

}
else {
    //"hit the wrong one" logic
}

(これは、残りの円を決定するための O(N) ですが、このような小さなセットを扱っている場合は、実際には問題になりません。最適化する必要がある場合は、もちろん、それぞれの残りのカウントを追跡できます。色。)

別の注意点として、その巨大なif-elseブロックを使用して正しい色を識別する代わりに、ファイルcolor1.pngcolor2.png、 などの名前を付けて、[UIImage imageNamed:[NSString stringWithFormat:@"color%i.png", randNum]];

于 2010-02-28T18:31:43.657 に答える
0

はい、UIImageView のimageプロパティを同じ UIImage に設定できます。実際、あなたはすでにこれを行っています!

imageNamed:クラス メソッドは、同じ画像ファイル名で再度呼び出されると、同じオブジェクトへの参照を返します。

ただし、4 つの UIImage 参照を一度取得してから使用する必要があります。また、このコードを短くシンプルにするために、配列とループ、または少なくとも関数を使用する必要があります。

image実際には、タップされた UIImageView オブジェクトのプロパティを後でそれらと比較できるように、4 つの UIImage 参照をインスタンス変数にする必要があるようです。

于 2010-02-19T06:34:56.510 に答える
0

さまざまなカラー画像を画像ビューに割り当てるためのより合理的な方法を作成することも賢明だと思うので、このソリューションは両方を行います。

これらはクラスのヘッダーで宣言する必要があります

NSArray *allCircleImagesViews; // These are suppose to be the onscreen UIImagesViews 

NSArray *circlesByColor;
NSMutableArray *correctCircles; // The current circles the user is allowed to click
NSArray *colorOrder; // The order of the colors to click
int currentColorIndex; // The current index in the order of colors

次に関数について説明します。最初の関数では、異なるカラー イメージを割り当て、正しい色の順序を設定し、正しい色がクリックされたかどうかを判断するメカニズムを設定します。

- (void) populateImages
{
    NSArray *images = [NSArray arrayWithObjects:
                       [UIImage imageNamed:@"bluebubble.png"],
                       [UIImage imageNamed:@"redbubble.png"],
                       [UIImage imageNamed:@"yellowbubble.png"],
                       [UIImage imageNamed:@"greenbubble.png"],
                       [UIImage imageNamed:@"orangebubble.png"],
                       [UIImage imageNamed:@"pinkbubble.png"],
                       [UIImage imageNamed:@"purplebubble.png"],
                       nil];

    NSArray *circlesByColor=[NSArray arrayWithObjects:
                             [NSMutableArray array],
                             [NSMutableArray array],
                             [NSMutableArray array],
                             [NSMutableArray array],
                             [NSMutableArray array],
                             [NSMutableArray array],
                             [NSMutableArray array],
                             nil];
    [circlesByColor retain];

    // Assign images to circles and set the 
    for (UIImageView *currCircle in allCircleImagesViews)
    {
        int nextIndex = arc4random()%7; 
        currCircle.image = [images objectAtIndex:0];
        [(NSMutableArray *)[circlesByColor objectAtIndex:nextIndex] addObject:currCircle];
    }

    // Set the correct order
    NSArray *colorOrder = [NSArray arrayWithObjects:
                  [NSNumber numberWithInt:5], // Pink
                  [NSNumber numberWithInt:0], // Blue 
                  [NSNumber numberWithInt:1], // etc.
                  [NSNumber numberWithInt:4],
                  [NSNumber numberWithInt:2],
                  [NSNumber numberWithInt:3],
                  [NSNumber numberWithInt:6],nil];
    [colorOrder retain];

    currentColorIndex = 0;            
    correctCircles = [circlesByColor objectAtIndex:[[colorOrder objectAtIndex:currentColorIndex] intValue]];
}

次の関数は、正しい円がクリックされたかどうかを確認します

- (void) checkCircle:(UIImageView *)clickedImageView
{
    BOOL result;

    if ([correctCircles containsObject:clickedImageView])
    {
        [correctCircles removeObject:clickedImageView];
        result = YES;
    }
    else {
        result =  NO;
    }


    if ([correctCircles count] == 0)
    {
        currentColorIndex++;
        if (currentColorIndex < 7)
            correctCircles = [circlesByColor objectAtIndex:[[colorOrder objectAtIndex:currentColorIndex] intValue]];
        else
            correctCircles = nil;
    }

    if (!result)
    {
        // Wrong circle clicked logic
    }
    else {
        if (!correctCircles)
        {
            // Game won logic
        }
        else {
            // Correct circle clicked logic
        }

    }

}
于 2010-02-28T19:27:36.883 に答える