# BufferedImage Position



## .basti (23. Jan 2022)

Guten Abend,
mein Problem ist folgendes: Ich erstelle ein BufferedImage als Spielfigur und lass es mit der g.drawImage()-Methode auf die Position x=0 setzen. Allerdings wird die Spielfigur nicht bei x=0 angezeigt sondern ca. bei x=40. Ich vermute, dass das Bild einfach eine größere Breite hat als das eingezeigt Bild selbst. Meine Frage lautet, wie ich das ändern kann, sodass mein Spieler auch bei x=0 ist.


----------



## Blender3D (23. Jan 2022)

Hier ein Beispiel für eine Spielfigur.
https://www.java-forum.org/thema/spielerbewegungen-realisieren.191048/#post-1246008


----------



## .basti (24. Jan 2022)

ich glaub das löst das Problem nicht richtig. die eigentlich Größe des Bildes ist größer als das gezeigte bild selbst. s. Anhang. ich möchte wissen wie ich das ändern kann also, dass das bild auch so groß ist wie die gezeichnete Größe.


----------



## Blender3D (24. Jan 2022)

.basti hat gesagt.:


> ich glaub das löst das Problem nicht richtig. die eigentlich Größe des Bildes ist größer als das gezeigte bild selbst. s. Anhang. ich möchte wissen wie ich das ändern kann also, dass das bild auch so groß ist wie die gezeichnete Größe.


Zeige etwas Code. Wie ist die GUI aufgebaut?


----------



## .basti (24. Jan 2022)

Ich folge eigentlich deinem Modell welches du mir mal privat geschickt hast:Main Klasse, Spiel, Sprite, Interface. Jetzt habe ich aber noch neue Klassen erstellt und zwar einmal SpielerSprite welche von Sprite erbt. Diese zeichnet das jeweilige Bild als Spieler. Das selbe passiert mit dem Hintergrund. Auch für den habe ich eine weitere Klasse namens BackgroundSprite, die auch von Sprite erbt.

[CODE lang="java" title="SpielerSprite Klasse"]package game;

import java.awt.Graphics;
import java.io.File;
import java.io.IOException;
import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
public class SpielerSprite extends Sprite{
    BufferedImage img ;
    public SpielerSprite(){
        try {
        img = ImageIO.read(new File("images/Spieler.png"));
        }
        catch(IOException e) {
            e.printStackTrace();
        }
}

    public BufferedImage getImg() {
        return img;
    }
    @Override
    public void draw(Graphics g) {
        g.drawImage(getImg(),getX(),getY(),null);
        g.drawRect(getX(), getY(), img.getWidth(), img.getHeight());
    }
}
[/CODE]

[CODE lang="java" title="BackgroundSprite"]package game;
import java.awt.Graphics;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;

import javax.imageio.ImageIO;
public class BackgroundSprite extends Sprite{
    BufferedImage imgBack;


    public BackgroundSprite(){
        try {
            imgBack = ImageIO.read(new File("images/Boden.png"));
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    @Override
    public void draw(Graphics g) {
        g.drawImage(imgBack,100,100,null);
        g.drawRect(100,100,imgBack.getWidth(),imgBack.getHeight());

    }

}
[/CODE]

diese Bilder zeichne ich in meiner Spiel Klasse, welche von Panel erbt, mit paintComponent().


----------



## Blender3D (25. Jan 2022)

.basti hat gesagt.:


> diese Bilder zeichne ich in meiner Spiel Klasse, welche von Panel erbt, mit paintComponent().




```
@Override
    public void draw(Graphics g) {
        g.drawImage(imgBack,100,100,null);
        g.drawRect(100,100,imgBack.getWidth(),imgBack.getHeight());
        
    }
```
Du zeichnest hier an einer konstanten Position (100, 100).
Das ist aber nicht im Sinne eines Sprites. Dieser hat seine eigenen Koordinaten , x, y.
Im Falle einer Klasse die von Sprite erbt, sollten die Variablen Koordinaten unbedingt benutzt werden.
Eine fixe Position kann dann mittels 

```
Sprite s = new Sprite ...
s.setPos(100,100);
```
gesetzt werden.


----------



## .basti (26. Jan 2022)

Sorry, aber das löst das Problem leider immer noch nicht. Mein Image wird immer noch zu klein angezeigt. Die setPosition() Methode funktioniert, aber die hat nix am Problem geändert. Also nochmal: Ich zeichne auf ein Frame zwei verschieden BufferedImage. Beide setze ich mit der eben genannten Methode auf eine Position. Allerdings wird mir das Bild nicht an der jeweiligen Position sondern viel zu weit unten angezeigt.
Bei meinem Anhang ist zu erkennen dass mein Bild (Boden) nicht wie ich will bei x=100, y=100 ist sondern y viel zu groß ist. Das Rechteck Außenrum zeigt die eigentlich Größe des Bildes an, was mich darauf schließen lässt, dass mein Bild, also der Boden, einfach kleiner ist als das eigentliche Bild. Meine Frage ist wie ich das behebe, sodass das der gezeichnete Boden auch bei 100,100 ist.


----------



## Blender3D (26. Jan 2022)

.basti hat gesagt.:


> Meine Frage ist wie ich das behebe, sodass das der gezeichnete Boden auch bei 100,100 ist.


Der Sprite sollte ein passendes Image besitzen. Außerdem ist es ratsam eine Image Loader zu benutzen, und die Bilder vorab zu laden, um Verzögerungen während des Spiels zu vermeiden.
Im obigen Link habe ich einen vereinfachten Image Loader gezeigt, den könntest Du benutzen.
[CODE lang="java" title="ImageLoader" highlight="17-25"]import java.awt.Image;
import java.io.File;
import java.io.IOException;
import java.util.HashMap;
import javax.imageio.ImageIO;

public class ImageLoader {
    public static String sourceDir = "./src/"; // Eclipse source folder
    public static String resourceDir = "resources/"; // Hier den Pfad anpassen
    private final static HashMap<String, Image> images = new HashMap<String, Image>();

    public static Image get(String name) {
        return images.get(name);
    }

    public static Image getScaledImage(String name, int width, int height) {
        Image image = get(name);
        if (image == null)
            return null;
        if (image.getWidth(null) != width || image.getHeight(null) != height) {
            images.remove(name);
            image = image.getScaledInstance(width, height, Image.SCALE_SMOOTH);
            images.put(name, image);
        }
        return image;
    }

    public static void loadImages(String[] nameImages, String type) {
        for (String name : nameImages) {
            String fileName = resourceDir + name + "." + type;
            File file = new File(sourceDir + fileName);
            Image image = null;
            System.out.println(fileName);
            try {
                if (file.exists())
                    image = ImageIO.read(file);
                else
                    image = ImageIO.read(ClassLoader.getSystemResource(fileName));
                if (image != null)
                    images.put(name, image);
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}[/CODE]


----------



## .basti (26. Jan 2022)

Problem hat sich geklärt. War eigentlich ganz einfach ich hatte es nur nicht zugeschnitten gehabt das bild. Danke trotzdem


----------

