Du verwendest einen veralteten Browser. Es ist möglich, dass diese oder andere Websites nicht korrekt angezeigt werden. Du solltest ein Upgrade durchführen oder ein alternativer Browser verwenden.
ich probiere momentan ein kleines 2D-Spiel zu programmieren. In diesem sollte man unter anderem auch zoomen können. Das zoomen an sich funktioniert auch aber leider zoomt es immer zum Nullpunkt.
Beim zoomen habe ich aber noch ein anderes Problem festgestellt: zwischen den Einzelbildern gibt es je nach Zoomstufe weisse Striche. (siehe Screenshots)
Mein aktueller/relevanter Code:
Java:
public class Game {
private void zoomTo(int x, int y) {
if (Vars.mouseWheelMoved != 0) {
float zoomBefore = Vars.zoom;
if (Vars.zoom - Vars.mouseWheelMoved * 0.1f < 0.1f) {
Vars.zoom = 0.1f;
} else if (Vars.zoom - Vars.mouseWheelMoved * 0.1f > 5.f) {
Vars.zoom = 5.f;
} else {
Vars.zoom -= Vars.mouseWheelMoved * 0.1f;
}
Vars.mouseWheelMoved = 0;
}
}
public void render(Graphics g) {
// map
scaledImages = new Image[images.length];
for (int i = 0; i < images.length; i++) {
Image im = images[i];
scaledImages[i] = Utils.zoomImage(im);
}
if (Vars.map != null) {
for (int i = 0; i < Vars.map.length; i++) {
for (int j = 0; j < Vars.map[i].length; j++) {
g.drawImage(scaledImages[Vars.map[i][j]], (int) ((j * 64 - Vars.cameraX) * Vars.zoom),
(int) ((i * 64 - Vars.cameraY) * Vars.zoom), null);
}
}
}
}
}
Für das Zoomen zu Maus habe ich mir überlegt, dass man einfach bei zoomX und zoomY was dazuaddieren muss. Was genau weiss ich leider nicht, habe aber einiges ausprobiert. (Hat leider nie geklappt)
Und ich verstehe nicht warum zwischen ein paar Einzelbldern ein Abstand ist. Wenn der Abstand zwischen allen Bildern wäre könnte ich das ja noch verstehen, aber so?
1. Wenn du zoomst, verschiebt sich ja der Punkt ueber dem die Maus ist auch nach rechts unten. Diese Differenz musst du berechnen und das Gesamtbild nach oben und links schieben, dann sieht es so aus als wuerde um die Mausposition gezoomt werden.
2. Die weissen Linien enstehen ziemlich sicher durch Rundungsfehler. Dein Zoomfactor ist ja ein float, das Graphics-object erwartet aber int fuer die Position genauso wie Image width und height int sind. Du musst die Groesse des Image auf int runden und den gerundeten Factor auch fuer die Position verwenden, dann sollte es klappen.
1. Wenn du zoomst, verschiebt sich ja der Punkt ueber dem die Maus ist auch nach rechts unten. Diese Differenz musst du berechnen und das Gesamtbild nach oben und links schieben, dann sieht es so aus als wuerde um die Mausposition gezoomt werden.
2. Die weissen Linien enstehen ziemlich sicher durch Rundungsfehler. Dein Zoomfactor ist ja ein float, das Graphics-object erwartet aber int fuer die Position genauso wie Image width und height int sind. Du musst die Groesse des Image auf int runden und den gerundeten Factor auch fuer die Position verwenden, dann sollte es klappen.
Ich glaube das könnte dann zu anderen Berechnungsfehlern führen, z. B. bei der exakten Mausposition. Ich habe das Problem jetzt erstmal so gelöst, dass bei der Bildbreite/-höheberechnung immer aufgerundet wird. Auch nicht wirklich schön, aber es funktioniert.
Wenn ich der Zeichenfläche JButtons hinzufüge, funktioniert der KeyListener nicht mehr. MouseListener hingegen funktionieren weiterhin. Weiss da jemand eine Antwort?