Frage

Ok, ich werde versuchen, dies deutlich zu machen, weil meine letzte Frage äußerst verwirrend war. Ich habe ein Bild dieser Zeit enthalten. Jeder dieser Kreise ist ein UIImageView, und sie sind jeweils ein Zufallsbild zugeordnet ist, die eine von 7 Farben ist. So konnte jeder Kreis eine von sieben Farben sein. Ich will es machen, so dass der Benutzer über die Kreise in der Reihenfolge einer vorgegebenen Reihenfolge nach Farbe treffen. Zum Beispiel, blau, grün, gelb, rosa, lila, orange, rot. Mein großes Problem ist, dass ich nicht scheinen, um herauszufinden, wie kann, um zu bestimmen, ob eine Farbe, die angeblich nicht Hit Hit bekam sein. Gibt es eine Möglichkeit, mehrere Bildansichten den gleichen Wert und dann irgendwie haben eine if-Anweisung zuweisen, sagt ....

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

Der einzige Weg, ich weiß, wie man Code dies eine unglaubliche Menge von Code wäre, weil alle die zufälligen Bilder zugeordnet ist.

    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];
    }

alt text

War es hilfreich?

Lösung

Ich denke, es ist klug, auch eine vernünftige Art und Weise zu erstellen, um die verschiedene Farbbilder zu Ihrem Bildansicht zuweisen, so dass diese Lösung sowohl der Fall ist.

Diese sollten in der Kopfzeile der Klasse

deklariert werden
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

Jetzt für die Funktionen: Der erste schafft die verschiedenen Farbbilder assign, stellt die richtige Reihenfolge der Farben und setzt den Mechanismus, um zu bestimmen, ob die richtige Farbe war klickten

- (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]];
}

Die folgende Funktion kümmert sich um die Überprüfung, ob der richtige Kreis war klickten

- (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
        }

    }

}

Andere Tipps

Ja, können Sie die image Eigenschaft von UIImageView auf den gleichen UIImage gesetzt. In der Tat, tun Sie dies bereits!

Die imageNamed: Klassenmethode wird einen Verweis auf das gleiche Objekt zurück, wenn wieder mit dem gleichen Bilddateinamen genannt.

Sie sollten jedoch die vier UIImage Referenzen einmal und dann diejenigen verwenden. Sie sollten auch einen Array und Schleife oder zumindest eine Funktion diesen Code kürzer und einfacher zu machen.

Eigentlich ist es klingt wie Sie Ihre vier UIImage Referenzen wollen, werden Instanzvariablen sein, so dass Sie die image Eigenschaft angezapft vergleichen können UIImageView Objekte gegen sie später.

Wenn Ihr Zweck ist einfach die, wenn Klausel, dann, was ich tun würde, ist zwei Wörterbücher mit dem Schlüssel, wie die Farbe zu definieren und die Werte als die Anordnungen von plätschert mit dem Wert der Position des burble sein.

NSDictionary *hitDictionaryOfBurbles;
NSDictionary *notCurrentlyBeingHitDictionaryOfBurbles;

Mit diesem Wörterbuch definiert sind, haben Sie mit Ihnen alle Artikel in allen Farben zur Zeit nicht getroffen zu werden. Anschließend können Sie dieses Wörterbuch leicht überprüfen, den Wert des Feldes von Orange Farbe, um zu sehen, wie viele Elemente gibt.

Offcourse, sobald der burble Hit wird, sollten Sie den Wert dieser beiden Wörterbücher ändern, um die Änderung widerzuspiegeln.

Es.

hitDictioanryOfBurbles: 
        "blue", [0,7,13]
        "green", [2,6,16]
         etc...
notCurrentlyBeingHitDictioanryOfBurbles: 
        "blue", [25,33,37]
        "green", [19,27,29]
         etc...

Wenn Sie andere Logik-Unterstützung, dann sollten Sie mehr Datenstrukturen definieren.

Gehst du immer diese in einer bestimmten Reihenfolge zu treffen, eine nach der anderen, wo nur eine Farbe zu einem Zeitpunkt gültig ist? Wenn ja, können Sie einen Stapel von UIImages erstellen (ich glaube nicht, es gibt einen eingebauten Typ Stapeldaten, aber man kann es mit NSMutableArray leicht simulieren), bestehend aus den Farben um.

Sie halten auch den Überblick über alle Farbenkreis Subviews auf dem Bildschirm in einem separaten NSMutableArray. Dann, wenn ein Benutzer einen Kreis trifft, führen Sie den folgenden Code ein:

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
}

(Dies ist O (N) für verbleibende Kreise zu bestimmen, aber wenn man es zu tun mit einem solchen kleinen Satz dann ist es wirklich keine Rolle. Wenn Sie es optimieren benötigt, man kann natürlich verfolgen die verbleibenden zählt jede Farbe.)

Auf einer anderen Anmerkung, werden Sie viel glücklicher Mensch sein, wenn anstelle der Verwendung dieser gigantischen if-else Block die richtige Farbe zu identifizieren, nennen Sie einfach die Dateien color1.png, color2.png usw. und sagen [UIImage imageNamed:[NSString stringWithFormat:@"color%i.png", randNum]];

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top