2016-05-11 16 views
0

Ich versuche, Kacheln aus einem Array anzuzeigen, die ich habe, damit sie immer die Größe des Bildschirms ausfüllen, wenn sie zusammen gezogen werden. Ich ignoriere das Seitenverhältnis für jetzt.X- und Y-Koordinaten von neuer Bildschirmgröße neu berechnen

So funktioniert mein Code. Ich habe Kachelobjekte, die an ein Tileset übergeben werden (Klasse für die Verwaltung eines Arrays von Kachelobjekten), und dann iteriere ich durch das Tileset-Array, gebe jede Kachelobjekt-ID zurück und rendere ein Teilbild meines Tileset-Bildes basierend auf diesen IDs.

Hier ist meine mapUpdate Methode, die auf jedem JFrame Resize-Ereignis aufgerufen wird:

public synchronized void mapUpdate(Screen screen) { 
    factorX = (float)(screen.getWidth()/scW); 
    factorY = (float)(screen.getHeight()/scH); 

    for (int i = 0; i < tileset.getRows(); i++) { 
     for (int j = 0; j < tileset.getCols(); j++) { 
      int x = tileset.getTile(i, j).getX(); 
      int y = tileset.getTile(i, j).getY(); 
      tileset.getTile(i, j).setX((int)(x * factorX)); 
      tileset.getTile(i, j).setY((int)(y * factorY)); 
     } 
    } 

    mapTiles.clear(); 

    for (int i = 0; i * 70 < mapImage.getWidth(); i++) { 
     mapTiles.add(mapImage.getSubimage(70 * i, 0, 70, 70).getScaledInstance(screen.getWidth()/10, screen.getHeight()/10, Image.SCALE_SMOOTH)); 
    } 
} 

mapTiles ist eine Arraylist von Bildern, und auf jeder Größe ändern Ereignisses die Arraylist setzt, skaliert meiner Unter-Bilder auf 1/10tel Breite und Höhe, und fügt dann die neu bemessenen Bilder wieder hinzu, die ich zum Rendern abrufen kann (das Tileset-Bild besteht nur aus 3 Kacheln mit einer Originalgröße von 70 x 70).

Und hier ist die componentResized Methode, wenn Sie neugierig waren:

public void componentResized(ComponentEvent e) { 
    canvas.setSize(app.getContentPane().getWidth(), app.getContentPane().getHeight()); 
    if (level1 != null) { 
     level1.mapUpdate(this); 
    } 
} 

Wie Sie in meinem mapUpdate Methode sehen kann, ich versuche, einen Schwimmer zu bekommen jeden aktuellen x- und y-Wert zu multiplizieren, um den neuen zu erhalten korrekte Werte (es wird die ganzen Zahlen runden), aber das funktioniert überhaupt nicht.

Gibt es eine Lösung, um meine X- und Y-Koordinaten einfach neu zu berechnen, damit die Kacheln richtig gezeichnet werden?

+0

Sofern Sie ein 'null' Layout es verwenden soll nicht nötig sein, um die Größe der Komponente zu setzen, unter der Annahme,' canvas' eine – MadProgrammer

+0

Komponente ändern '(float) (screen.getWidth()/SCW) 'to' screen.getWidth()/(float) scW' was die gerade auftretende Integer-Trunkierung entfernen soll – MadProgrammer

+0

Auch Vorsicht, 'componentResized' kann mehrmals in schneller Folge aufgerufen werden, das willst du wirklich nicht etwas tun, was zeitraubend ist, da es zu Verzögerungen beim Neu-Rendering Ihrer UI führt, besser alle Caches ungültig machen und beim nächsten Update neu erstellen. – MadProgrammer

Antwort

1

Ihr FaktorX sollte kein Float sein. Es sollte ein Int sein. Wenn Sie einen Float verwenden, werden Sie gerundet, daher haben Sie gelegentlich eine Pixellücke zwischen den Kacheln wegen der Rundung. Wenn Sie nur ein int verwenden, müssen Sie sich darüber keine Gedanken machen. Dann ist der Ort nur der Faktor * der Indexwert der for-Schleife.

Auf der anderen Seite ist die einfachste Lösung, nur ein JPanel mit einem GridLayout zu verwenden. Dann können Sie ein JLabel mit einem Bildsymbol hinzufügen. Das GridLayout wird jede Komponente gleich skalieren.

Sie können dann sogar die Stretch Icon verwenden und die Bilder werden dynamisch angepasst, wenn die Größe des Rahmens geändert wird.

+0

Sie müssen mich verarschen. Das ist eine Sache ..? Ich hätte von diesem GridLayout gewusst, lol. Vielen Dank ... – user3059686

+0

@ user3059686, Informationen zum GridLayout und zum anderen finden Sie im Abschnitt zum Swing-Lernprogramm zu [Layout Manager] (http://docs.oracle.com/javase/tutorial/uiswing/layout/visual.html) Layout-Manager. – camickr

+0

Ah, das habe ich gerade realisiert. Ich glaube nicht, dass die GridLayout-Lösung funktionieren wird, da dieses Spiel ein Scroll-Platformer sein wird und die Kacheln daher scrollbar sein müssen (was bedeutet, dass die angezeigten Gitter nicht immer identische Dimensionen haben sollten). – user3059686

1

LÖSUNG mit freundlicher Genehmigung von @MadProgrammer - Die Lösung bestand darin, einfach die neuen X- und Y- "Ursprünge" für jede Kachel zu berechnen. Ich muss immer noch die Position für Kacheln anpassen, die basierend auf den neu berechneten Ursprüngen verschoben wurden, aber diese Lösung funktioniert für Kacheln, die sich nicht bewegen (einfach die X- und Y-Ursprungspositionen neu berechnen).

public synchronized void mapUpdate(Screen screen) { 
    int originX = screen.getWidth()/10; 
    int originY = screen.getHeight()/10; 

    for (int i = 0; i < tileset.getRows(); i++) { 
     for (int j = 0; j < tileset.getCols(); j++) { 
      tileset.getTile(i, j).setX((originX * j)); 
      tileset.getTile(i, j).setY((originY * i)); 
     } 
    } 

    mapTiles.clear(); 

    for (int i = 0; i * 70 < mapImage.getWidth(); i++) { 
     mapTiles.add(mapImage.getSubimage(70 * i, 0, 70, 70).getScaledInstance(screen.getWidth()/10, screen.getHeight()/10, Image.SCALE_SMOOTH)); 
    } 
} 
Verwandte Themen