Zeichnen von getSubimage funktioniert nicht

tugberk

Mitglied
Hallo,

ich programmiere gerade eine kleine Grafikanwendung und habe folgendes Problem: Ich schneide mit getSubimage aus einem BufferedImage ein kleines Stück heraus und versuche es dann mit drawImage zu zeichnen. Leider passiert da gar nichts. Das Zeichnen vom einem BufferedImage funktionert jedoch. Was mache ich falsch? Hier der Code:
Java:
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.Toolkit;
import java.awt.Font;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;

import javax.imageio.ImageIO;
import javax.swing.ImageIcon;
import javax.swing.JPanel;


public class Game extends JPanel implements Runnable {

    //private Image star, integral, test2;
    private BufferedImage bad ,audi, test;
    //private BufferedImage[] teile = new BufferedImage[3];
    private Thread animator;
    private int x, y;
    public Font f1; 
    public long frameRate = 0;
    public long frames = 0;
    public long seconds = 0;

    private final int DELAY = 25; // Framerate: 40 Bilder pro Sekunde


    public Game() {
    	int width;
    	int height;
        //setBackground(Color.WHITE);
        setDoubleBuffered(true);
        /*
        ImageIcon ii = new ImageIcon(this.getClass().getResource("star.png"));
        star = ii.getImage();
        ImageIcon i2 = new ImageIcon(this.getClass().getResource("integral.png"));
        integral = i2.getImage();
        */
        
        try
        {
           audi = ImageIO.read( new File("audi.png") ) ;
        }
        catch(IOException ex)
        {
        	ex.printStackTrace();
        	System.out.println("Datei nicht gefunden");
        	System.exit(1);
        }
        
        try
        {
           bad = ImageIO.read( new File("bad.png") ) ;
        }
        catch(IOException ex)
        {
        	ex.printStackTrace();
        	System.out.println("Datei nicht gefunden");
        	System.exit(1);
        }
        width = bad.getWidth();
        height = bad.getHeight();
        BufferedImage bad = new BufferedImage(width, height, BufferedImage.TYPE_INT_ARGB);
        width = audi.getWidth();
        height = audi.getHeight();
        BufferedImage audi = new BufferedImage(width, height, BufferedImage.TYPE_INT_ARGB);
        //BufferedImage test = new BufferedImage(200, 200, BufferedImage.TYPE_INT_ARGB);
        test = audi.getSubimage(100, 100, 200, 200);
        /*
        test2 = audi.getSubimage(100, 100, 200, 200);
        teile[0] = audi.getSubimage(0, 0, 200, 200);
        teile[1] = audi.getSubimage(100, 100, 50, 50);
        teile[2] = audi.getSubimage(200, 200, 50, 50);
        */
        
        f1 = new Font("Arial",Font.BOLD,20);

        x = y = 10;
    }

    public void addNotify() {
        super.addNotify();
        animator = new Thread(this);
        animator.start();
    }

    public void paint(Graphics g) {
        super.paint(g);
        Graphics2D g2d = (Graphics2D)g;
        g2d.drawImage(audi, 0, 0, this);
        //g2d.drawImage(star, x, y, this);
        //g2d.drawImage(integral, 200, 200, this);
        g2d.drawImage(bad, 200+x, 200+y, this);
        /*
        g2d.drawImage(teile[0],0,0,this);
        g2d.drawImage(teile[1],500,200,this);
        g2d.drawImage(teile[2],300,300,this);
        */
        g2d.drawImage(test,150,150,this);
       
        g2d.setColor(Color.WHITE);
        g2d.setFont(f1);
        g2d.drawString("Framerate: " + frameRate,850,30);
        g2d.drawString("Sekunden: " + seconds,850,50);
        Toolkit.getDefaultToolkit().sync();
        g.dispose();
    }


    public void cycle() {

        x += 1;
        y += 1;

        if (y > 440) {
            y = -45;
            x = -45;
        }
    }

    public void run() {

        long beforeTime, timeDiff, sleep;
        long fTime=0, dTime;

        beforeTime = System.currentTimeMillis();

        while (true) {

            cycle();
            repaint();

            dTime = System.currentTimeMillis() - fTime;
            
            timeDiff = System.currentTimeMillis() - beforeTime;
            sleep = DELAY - timeDiff;

            if (sleep < 0)
                sleep = 25;
            try {
                Thread.sleep(sleep);
            } catch (InterruptedException e) {
                System.out.println("interrupted");
            }

            beforeTime = System.currentTimeMillis();
            if(dTime >= 1000)
            {
            	frameRate = frames * 1000 / dTime;
            	frames = 0;
            	fTime = System.currentTimeMillis();
            	seconds++;
            }
            frames++;
        }
    }
}
Danke für die Antworten
 
Erstmal ist das ein Swing-Component, d.h. du solltest die paintComponent() überschreiben!

In welcher Zeile wird das Bild gemalt welches nicht funktioniert?
 
Auch paintComponent() hilft nicht weiter. Das Image "audi" und "bad" wird gemalt. Nur das mit getSubimage() herausgeschnittene Image "test" wird nicht gemalt.🙁
 
Du hast eine Klassenvariable audi, in die liest du ein Bild ein. Dann erstellst du eine lokale Variable audi, der verpasst du ein leeres Bild. Von dieser lokalen Variable willst du jetzt was ausschneiden. In einem leeren bild is aber nix drin, drum is im Ausschnitt auch nix.
Einfachste Lösung: Variablennamen nur einmal verwenden.
 
Zuletzt bearbeitet:
Ja, alles sehr verwirrend...
@bERt0r: Du meintest sicher die Variable "bad"? Oder "bad" und "audi"? Naja, gilt für beides.

Also nachdem "bad" und "audi" per ImageIO eingelesen wurden sind es bereits ein BIs (wie bERt0r schon sagt: das sind auch noch Instanzvariablen), die musst du in den Zeilen 64 bis 69 nicht erneut instanzieren. Und wenn du so etwas machst, dann solltest du die Quellen zumindest auch wieder reinpinseln, sonst bleiben die Bilder leer. Die Lösung liegt hier (evtl. bereits) in der schlichten Löschung der Zeilen 64 bis 69.
 
Zuletzt bearbeitet von einem Moderator:

Neue Themen


Zurück
Oben