Wenn i (for-Loop) bestimmter Wert, dann neue Zeile eines Buttons

erik4tw

Mitglied
Hallo,

der Titel ist vielleicht etwas ungünstig gewählt, aber ich wusste nicht, wie ich mein kleines (wahrscheinlich mathematisches) Problem sonst beschreiben sollte.

Ich programmiere ein Spiel mit verschiedenen Levels. Es gibt einen Screen, in welchem man aussuchen kann, welches Level man spielen möchte. Das sieht ungefähr so aus wie im Anhang.

levelscreen.png

Die Buttons werden mittels For-Schleife generiert. Mein Problem ist, dass ich nicht weiß, wie man nach 4 Buttons jeweils eine neue Zeile anfängt. Der Code für die Position der Buttons sieht derzeit so aus:

Java:
for(int i = 0; i < 12; i++) {
    //Generieren der Buttons...
    //Position der Buttons (x-Wert, y-Wert)
    sLevelButton[i].setPosition(150 * i - 350, 80);
}

Das Fenster geht in der X-Achse von –400 bis +400, daher auch die „-350“. Der erste Button (für i = 0) hätte also die Position 150 * 0 - 350 = -350, also fast ganz links. Der 4. Button hätte die Position 150 * 3 – 350 = 100. Die Buttons gehen also wie im Anhang zu sehen von links nach rechts.

Ich möchte nun, dass ab dem 5. / 9. / usw. Button der X-Wert der Position jeweils wieder auf -350 rückt und der Y-Wert um, sagen wir 130 Einheiten, kleiner wird (die Buttons sind 100 * 100 Einheiten groß, und ein kleiner Y-Wert bedeutet weiter unten im Fenster). Sprich, dass die nächsten 4 Buttons in eine neue "Zeile" kommen.

Welche Möglichkeiten gibt es, sowas möglichst "dynamisch" zu programmieren? ("dynamisch", da wahrscheinlich noch mehr Levels und damit Buttons kommen werden und dann automatisch alle 4 Buttons eine neue Zeile begonnen werden soll)

Vielen Dank im Voraus für eure Hilfe und falls es Verständnisfragen gibt, fragt ruhig =)
 
Verwende zwei For-Schleifen. Eine für die Zeilen und eine für die Spalten.
Ansonsten hätte man auch mit if/else lokale x,y-Werte ändern können, finde ich aber unübersichtlicher als einfach zwei For-Schleifen.
 
Java:
final int numberOfBtn = 12;
final int btnPerLine = 4;
final int numberOfRows = (numberOfBtn%btnPerLine==0)?(numberOfBtn/btnPerLine):((numberOfBtn/btnPerLine)+1); // Diese Rechnung nur falls die Anzahl der Btns flexibel ist...
for(int y = 0; y < numberOfRows; y++){
   for(int x= 0; x < btnPerLine; x++) {
       sLevelButton[y*btnPerLine+x].setPosition(150 * x - 350, 80 + 150*y);
       //debug   
       System.out.println("index: "+(y * btnPerLine + x) + " x: " + (150 * x - 350) + " y: " + (150 * y+80));
   }
}
 
Zuletzt bearbeitet:
Vielen Dank, bis auf 2 Kleinigkeiten, die ich noch verbessert habe, klappt der Code super.
Mein fertiger Code sieht jetzt so aus:

Java:
for(int y = 0; y < numberOfRows; y++){
            for(int x= 0; x < btnPerLine; x++) {

                if(y*btnPerLine+x < numberOfBtn) {
                    sLevelButton[y * btnPerLine + x].setPosition(150 * x - 350, 80 - 150 * y);
                    //debug
                    System.out.println("index: " + (y * btnPerLine + x) + " x: " + (150 * x - 350)
                            + " y: " + (150 * y + 80));
                }
            }
        }

Dein Code funktionierte nämlich "nur", wenn die Anzahl der Buttons durch 4 teilbar war, deswegen habe ich noch das if-Statement in der Schleife hinzugefügt. Jetzt funktioniert er bei jeder beliebigen Anzahl. Außerdem musste ich noch bei setPosition ein Vorzeichen ändern, aber das liegt wohl eher an der Game-Library, die ich benutze (da geht die y-Achse von unten nach oben).

Danke nochmal @JCODA =)
 
Man hätte übrigens auch Module benutzen können:

Java:
    int row = 1;
        for (int i = 0; i < 10; i++) {
            System.out.print("row: " + row + " column: " + (i % 4) + " | ");
            if ((i + 1) % 4 == 0) {
                System.out.println();
                row++;
            }
        }


Ausgabe:
row: 1 column: 0 | row: 1 column: 1 | row: 1 column: 2 | row: 1 column: 3 |
row: 2 column: 0 | row: 2 column: 1 | row: 2 column: 2 | row: 2 column: 3 |
row: 3 column: 0 | row: 3 column: 1 |
 

Neue Themen


Zurück
Oben