Keller-Dev Docs · Java & Hytale

Java Core

Dynamische 2D-Kameraführung mit Graphics2D-Transformation

Die Kamera entkoppelt die Spielfeldgröße von der eigentlichen Fenstergröße (Viewport). Statt Objekte beim Rendern manuell umzurechnen, transformiert die Kamera den gesamten Zeichenkontext via Graphics2D.translate(-camX, -camY). Wichtige Architektur-Highlights:Zentrierung: Die Zielposition richtet sich an der Mitte der Player-Bounding-Box aus. Clamping: clamp() verhindert, dass die Kamera den sichtbaren Kartenausschnitt verlässt und leeren Raum zeigt. Graphics-Isolation: Um Nebeneffekte auf andere Swing-Renderings zu vermeiden, wird mit g.create() eine Arbeitskopie von Graphics2D erstellt und am Ende via dispose() freigegeben.

Referenz: Datei 1. Spielprojekt · Klasse Camera, GameWindow.GamePanel
// In Camera.java
public void update(Player player, TileMap tileMap) {
    double targetX = player.getX() + player.getSize() / 2.0 - viewportWidth / 2.0;
    double targetY = player.getY() + player.getSize() / 2.0 - viewportHeight / 2.0;

    if (tileMap != null) {
        int mapPixelWidth = tileMap.getWidthInTiles() * TileMap.TILE_SIZE;
        int mapPixelHeight = tileMap.getHeightInTiles() * TileMap.TILE_SIZE;

        targetX = clamp(targetX, 0, Math.max(0, mapPixelWidth - viewportWidth));
        targetY = clamp(targetY, 0, Math.max(0, mapPixelHeight - viewportHeight));
    }
    this.x = targetX;
    this.y = targetY;
}

// In GamePanel.paintComponent(Graphics g)
Graphics2D cameraView = (Graphics2D) g.create();
cameraView.translate((int) Math.round(-camera.getX()), (int) Math.round(-camera.getY()));

drawTileMap(cameraView);
drawInteractables(cameraView);

cameraView.dispose(); // Wichtig: Kopie aufräumen
#camera #viewport #graphics2d #clamp #rendering
Bearbeiten