Fehler beim Laden eines 2D-Bildes

Ramhotep

Neues Mitglied
Guten Abend,

ich habe die letzten Tage mich mit der Struktur von Videospielen beschäftigt und dabei ein Programm geschrieben, welches dafür sorgt, dass in einem gegebenen JFrame jeder Pixel einzeln gesteuert werden kann. Dafür wollte ich ein Bild einladen welches daraufhin auf den Bildschirm gerendert wird.
Zuerst habe ich einen Spritesheet erstellt der das Bild einlädt (die Importe und nicht relevanten Methoden sind wie auch bei den folgenden Klassen ausgelassen):

Java:
public class SpriteSheet {

    private String path;
    public final int LAENGE, HOEHE;
    public int[] pixels;
    
    public static SpriteSheet Tisch = new SpriteSheet("/Tisch.jpg", 1000, 603);
    
    public SpriteSheet(String path, int laenge, int hoehe){
        this.path = path;
        LAENGE = laenge;
        HOEHE = hoehe;
        pixels = new int [LAENGE*HOEHE];
        load();
    }
    
    private void load(){
        try{
            BufferedImage image = ImageIO.read(SpriteSheet.class.getResource(path));
            int w = image.getWidth();
            int h = image.getHeight();
            image.getRGB(0, 0, w, h, pixels, 0, w);
            
        } catch (IOException e) {e.printStackTrace();}
    }
}

Aus diesem Sheet wird dann der gewünschte Bereich, in diesem Fall das gesamte Bild ausgewählt und einem Pixelarray zugewiesen:

Java:
public class Sprite {
    
    public final int LAENGE,HOEHE;
    private int x,y;
    public int[] pixels;
    private SpriteSheet sheet;
    
    public static Sprite Tisch = new Sprite(1000,603,0,0, SpriteSheet.Tisch);
    
    public Sprite (int laenge, int hoehe, int x, int y, SpriteSheet sheet){
        LAENGE = laenge;
        HOEHE = hoehe;
        pixels = new int [LAENGE * HOEHE];
        this.sheet = sheet;
        load();
    }
    
    private void load(){
        for (int  y = 0; y < HOEHE; y++){
            for (int x = 0; x < LAENGE; x++){
                pixels[x+y*LAENGE] = sheet.pixels[(int)(x + y*sheet.LAENGE)];}
     }     
    }

Danach wird der Pixelarray des Sprites in den Pixelarray des Bildschirms übertragen:

Java:
public class Bildschirm {
private int höhe, länge;
public int [] pixels;

public Bildschirm (int höhe, int länge) {
  this.höhe = höhe; //Macht die Parameter auch außerhalb des Konstruktors abrufbar
  this.länge = länge; 
  pixels = new int[höhe*länge];
} 

public void clear () {
  for (int i=0; i < pixels.length; i++){pixels[i] = 0;}
}

public void render () {
  for (int y = 0; y < höhe; y++){
   
   for (int x = 0; x < länge; x++){
       pixels[x+y*länge] = Sprite.Tisch.pixels[(x + y* Sprite.Tisch.LAENGE)];
     }
  }
}
}
Zum Schluss wird in der Anwendung in einer sich immer wiederholenden Schleife (Für den Fall das sich Bild noch verändert) das Bild im JFrame angezeigt:

Java:
private int[] pixels = ((DataBufferInt)image.getRaster().getDataBuffer()).getData();

   public Anwendung()
    {
        Dimension Groeße = new Dimension (laenge,hoehe);
        setSize (Groeße);
       
        bildschirm = new Bildschirm (laenge,hoehe);
        frame = new JFrame ();
        key = new Tastatur();
       
        addKeyListener (key);
       
    }


public void render() {
        BufferStrategy bs = getBufferStrategy();
        if (bs == null) {
            createBufferStrategy(3);
            return;
        }
    
        bildschirm.clear();
        bildschirm.render();
        
        for (int i = 0;i < pixels.length; i++){
            pixels[i] = bildschirm.pixels[i];
        }
        Graphics g = bs.getDrawGraphics();
        g.drawImage(image, 0, 0, getWidth(), getHeight(), null);
        g.dispose();
        bs.show();
    }
Zur Funktionsweise:
Am Anfang werden aus dem Bild (Tisch.jpg) in ein zugeschnittenes Array die RGB-Werte der Pixel geladen. In der Spriteklasse wird ein Pixel nach dem anderen einem exakt gleichen Array zugewiesen, da ja hier der Sprite gleich dem Spritesheet ist. Auch in der Bildschirmklasse sind die Pixel des Bildschirm die gleichen wie die des Sprites und in der Anwendung wird daraus dann ein Bild gemacht, welches dann im JFrame angezeigt wird. Man könnte also erwarten das im JFrame das ursprüngliche Bild angezeigt wird, jedoch erscheint nur ein seltsam verzerrtes halb ausgefülltes Bild(1.PNG).

Wenn ich in der Sprite-Klasse die Zeile

Java:
pixels[x+y*LAENGE] = sheet.pixels[(int)(x + y*sheet.LAENGE)];

zu

Java:
pixels[x+y*LAENGE] = sheet.pixels[(int)(x + y*sheet.HOEHE)];

änderte, bekomme ich zumindest ein unverzerrtes Bild (2.PNG).

Dazu ein paar Bemerkungen:
1: Die ausgefüllte Fläche ist nicht beliebig groß. Sie beträgt immer c.a. 60,3% also genau das Verhältnis von Hähe zu Breite des Bildes.
2: Die schwarze Fläche entsteht vermutlich daher, das in den Arrays manche Elemente keinen Wert zugewiesen bekommen haben, also standartgemäß den Wert 0 haben.
3: Im Terminal steht nichts von einer ArrayOutOfBounds-Exceptions jedoch steht dort, dass die Components eine "valid peer" haben müssen.
4: Bei 1.PNG sieht mann dass die Zeilen anscheinend nur die falsche Länge haben (vielleicht die der Höhe statt der Breite), da man klar sieht, dass die Zeilen vertikal nicht glatt ineinander übergehen, wodurch nur 60,3 % des Bildes erreicht werden
5: Wenn man den Befehl:

pixels[x+y*LAENGE] = sheet.pixels[(int)(x + y*sheet.HOEHE)];

benutzt, müssten doch manche Pixel des Sprites auf den gleichen Wert des Sheets zugreifen,
z.B. bei (x=1000, y=0) und (x=307, y=1)

Wenn jemand weiß was hier falsch läuft würde ich mich echt freuen, ich kann schon seit zwei Tagen nicht mehr gut schlafen :confused:
 

Anhänge

  • Tisch.jpg
    Tisch.jpg
    453,1 KB · Aufrufe: 38
  • 1.PNG
    1.PNG
    568,8 KB · Aufrufe: 27
  • 2.PNG
    2.PNG
    557 KB · Aufrufe: 36
Zuletzt bearbeitet von einem Moderator:

Flown

Administrator
Mitarbeiter
Bitte benutz doch keine Farben, sonder Code-Tags, damit du den Code formatierst: [code=java]//Java Code HERE[/code]
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
D Fehler beim Stein Scher papier Spiel Spiele- und Multimedia-Programmierung 3
Z Zeiterfassungsprogramm Fehler Spiele- und Multimedia-Programmierung 7
L Fehler bei "Nochmal Spielen" (Java) Spiele- und Multimedia-Programmierung 1
M Fehler bei MinecraftPlugin Spiele- und Multimedia-Programmierung 3
D Minecraft [Minecraft] Java Start Fehler (Core-Dump) Spiele- und Multimedia-Programmierung 1
coolian glsl shader syntax fehler bei if? Spiele- und Multimedia-Programmierung 8
KeexZDeveoper Fehler von OpenGL Spiele- und Multimedia-Programmierung 1
Kim_Dotcom libGDX - opengl Fehler Spiele- und Multimedia-Programmierung 5
D Fehler bei GUI-Aktualisierung Spiele- und Multimedia-Programmierung 9
2 jMonkey fehler Spiele- und Multimedia-Programmierung 0
T LWJGL VBO's funktionieren nicht, geben aber auch keinen Fehler Spiele- und Multimedia-Programmierung 0
A Minecraft Plugin Teleport Fehler Spiele- und Multimedia-Programmierung 1
O Fehler bei Programmierung lässt Figur nicht bewegen Spiele- und Multimedia-Programmierung 5
R LWJGL: OpenGL Fehler - weitere Informationen auslesen möglich? Spiele- und Multimedia-Programmierung 2
G Sound-Sampling: Sinuston; kein Fehler, aber auch kein Ton :-( Spiele- und Multimedia-Programmierung 3
I Minecraft Java programmierungs fehler "MineCraft" Spiele- und Multimedia-Programmierung 6
V Komischer Fehler in LWJGL Spiele- und Multimedia-Programmierung 18
CookieSoft LWJGL Ubuntu 12.04 Fehler Spiele- und Multimedia-Programmierung 7
CookieSoft Slick Texture laden Fehler Spiele- und Multimedia-Programmierung 6
A Netbeans / Gamegrid Fehler/Maze Spiele- und Multimedia-Programmierung 2
1 Fehler bei Krümel&Monster Spiele- und Multimedia-Programmierung 16
0 Finde den Fehler nicht Spiele- und Multimedia-Programmierung 2
C Java Fehler (If?) Spiele- und Multimedia-Programmierung 14
F fehler Spiele- und Multimedia-Programmierung 2
L Abfrage-Fehler? - Hilfe bei Tetris Spiele- und Multimedia-Programmierung 9
N bei abspielen der wav datei fehler Spiele- und Multimedia-Programmierung 6
D Java 2d translation() fehler Spiele- und Multimedia-Programmierung 4
G Schüsse zeichnen, Fehler? Spiele- und Multimedia-Programmierung 3
R BufferStragety Fehler: Component must have a valid peer Spiele- und Multimedia-Programmierung 5
S drawImage Fehler ! Spiele- und Multimedia-Programmierung 3
V Minesweeperprogrammierung Fehler J0098 Spiele- und Multimedia-Programmierung 8
I Fehler bei Änderung der Bildschirmauflösung Spiele- und Multimedia-Programmierung 3
Atten007 Minecraft Hilfe beim MCreator Plugin benötigt Spiele- und Multimedia-Programmierung 0
Atten007 Minecraft Hilfe beim MCreator Plugin benötigt Spiele- und Multimedia-Programmierung 5
J TreeNode erstellen [Hilfe beim Konstruktor, Zeile 16] Spiele- und Multimedia-Programmierung 2
T Hilfe beim Platzieren der Schiffe Spiele- und Multimedia-Programmierung 14
RalleYTN Brauche Hilfe beim Einlesen von PNGs Spiele- und Multimedia-Programmierung 14
O Problem beim Aufrufen des Spiels von einem Menü Spiele- und Multimedia-Programmierung 7
G LIBGDX Problem beim resizen des Frames Spiele- und Multimedia-Programmierung 3
T Android App Absturz beim Starten Spiele- und Multimedia-Programmierung 41
T LWJGL 2.9.2: Seltsamer Effekt beim Rendern (VertexShader Problem?) Spiele- und Multimedia-Programmierung 3
T Problem beim Aufbau des Spielfelds Spiele- und Multimedia-Programmierung 18
J Perfomance Probleme beim eigenen Editor Spiele- und Multimedia-Programmierung 1
K Probleme beim kompilieren von javakara Spiele- und Multimedia-Programmierung 10
S [LWJGL] schwarzer Bildschrim beim rendern von .obj Model Spiele- und Multimedia-Programmierung 2
L Probleme beim kompilieren von javakara Spiele- und Multimedia-Programmierung 3
N Problem mit Kollisionsabfrage beim Fallen Jump & Run Spiele- und Multimedia-Programmierung 5
L Problem beim Rätsellöser Spiele- und Multimedia-Programmierung 3
D Problem beim bewegen einer Figur Spiele- und Multimedia-Programmierung 2
M Beim schießen richtet sich die Kugel nach der Maus aus (Quaternion) Spiele- und Multimedia-Programmierung 5
Gossi Probleme beim Laden der Images aus dem "Tutorial für Java-Spiele" Spiele- und Multimedia-Programmierung 4
K Problem beim Anzeigen von Bildern Spiele- und Multimedia-Programmierung 5
D Problem mit Überprüfung beim Lottospiel Spiele- und Multimedia-Programmierung 6
D Problem beim Öffnen einer PHP für eine Highscore Spiele- und Multimedia-Programmierung 5
C Java3D Lichtquelle beim Beobachter Spiele- und Multimedia-Programmierung 2
W CannotRealizeException (jmf) beim abspielen eines liedes Spiele- und Multimedia-Programmierung 3
aze Problem beim Laden von Obj File Spiele- und Multimedia-Programmierung 3
N Jogl Probleme mit dem Buffer beim laden einer Textur Spiele- und Multimedia-Programmierung 2
N Totaler Absturz beim mehrmaligen Abspielen von Sounds Spiele- und Multimedia-Programmierung 5
L Fehlersuche beim Weichzeichner-Algorithmus Spiele- und Multimedia-Programmierung 9
S Problem beim laden eines Bildes in einer Methode Spiele- und Multimedia-Programmierung 14
S Probleme mit Thread beim Streaming Spiele- und Multimedia-Programmierung 1
B Problem beim Programmieren von 4Gewinnt Spiele- und Multimedia-Programmierung 5
0x7F800000 weiß einer wozu ANTLR beim build von JOGL verwendet wird? Spiele- und Multimedia-Programmierung 3
G Überlagern von Strings beim zeichnen verhindern Spiele- und Multimedia-Programmierung 3
G Weiße, vertikale Streifen beim Scrollen auf der Map Spiele- und Multimedia-Programmierung 4
D Probleme beim Download von GIF-Bildern Spiele- und Multimedia-Programmierung 4
C KI beim Computergegner? Spiele- und Multimedia-Programmierung 2
G Problem beim Zeichnen von LineArrays Spiele- und Multimedia-Programmierung 9
C Problem beim picken Spiele- und Multimedia-Programmierung 10
B Problem beim Programmieren Von Mühle Spiele- und Multimedia-Programmierung 6
T Exception beim starten von Java3d Apps Spiele- und Multimedia-Programmierung 2
B problem beim Memory Logik Spiele- und Multimedia-Programmierung 13
J Problem beim Instaliren Spiele- und Multimedia-Programmierung 8
W Probleme beim entfernen von Childs im HauptSceneGraph Spiele- und Multimedia-Programmierung 8
S Sudoku Solver funktioniert beim 2. Aufruf nicht mehr Spiele- und Multimedia-Programmierung 11
B Probleme beim zeichnen Spiele- und Multimedia-Programmierung 15
N Rundenstrategiespiel - Problem beim Drehen eines Bildes Spiele- und Multimedia-Programmierung 18
C Graphische Benutzerschnittstelle, Problem beim Zeichnen Spiele- und Multimedia-Programmierung 4
0 Crashes beim Abspielen von Sounds unter Win98 Spiele- und Multimedia-Programmierung 12
G Probleme beim installieren java 3d linux Spiele- und Multimedia-Programmierung 4
T Java2D Spiel, beim Hinzufügen eines Bildes ruckelt das ganze Spiele- und Multimedia-Programmierung 3
A Bildfehler beim schnellen neuzeichnen Spiele- und Multimedia-Programmierung 2
D Pfeiltasten beim KeyListener Spiele- und Multimedia-Programmierung 1
I Beim Picking werden alle Behaviors angesprochen Spiele- und Multimedia-Programmierung 4
Hatsi09 Libvlc laden Spiele- und Multimedia-Programmierung 0
E TMX - Dateien in Java laden Spiele- und Multimedia-Programmierung 1
D JAVA Basiertes Spiel aus dem Internet in eigenem Client laden Spiele- und Multimedia-Programmierung 1
D [JOGL] bibliothek aus jar laden Spiele- und Multimedia-Programmierung 3
D Minecraft Config in andere Class laden/Minecraft Plugin Spiele- und Multimedia-Programmierung 1
R LWJGL: Object Loader -> .obj, .c4d, ... laden Spiele- und Multimedia-Programmierung 3
J Images laden in static Methode Spiele- und Multimedia-Programmierung 8
J Java3D - Textur laden geht nicht Spiele- und Multimedia-Programmierung 9
A Welche chunks im vorraus laden? Spiele- und Multimedia-Programmierung 9
A Speichern un Laden mit Serializable Spiele- und Multimedia-Programmierung 4
S Sounds abspielen, ohne sie jedesmal neu zu laden Spiele- und Multimedia-Programmierung 8
D JOGL2 eigene mipmaps laden Spiele- und Multimedia-Programmierung 13
P .obj-Datei in Java3D laden: ParsingErrorException Spiele- und Multimedia-Programmierung 7
B Teile eines Bildes laden - BitBlk und drawImage Spiele- und Multimedia-Programmierung 3
G Laden von 3D-Modellen Spiele- und Multimedia-Programmierung 3

Ähnliche Java Themen

Neue Themen


Oben