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?
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
Komponente ändern '(float) (screen.getWidth()/SCW) 'to' screen.getWidth()/(float) scW' was die gerade auftretende Integer-Trunkierung entfernen soll – MadProgrammer
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