Problem mit Image und Graphics

Status
Nicht offen für weitere Antworten.

Xarathus

Mitglied
Hallo,

Ich bin gerade dabei ein 2D-Plattform Spiel zu programmieren als normale Applikation (kein Applet) zu programmieren. Da ich mich noch nicht so gut mit Grafiken auskenne, stiess ich auf ein Problem.
Ich möchte gerne ein Image erzeugen und dann per "getGraphics()" die Grafik einem Grafik Objekt zuweisen.
Bei folgendem Code krieg ich immer ne NullPointerException, obwohl ein Objekt bei der Zuweisung einer Grösse eigentlich einen Wert besitzen sollte!?

Code:
	if (backgroundimage == null)
		{
			backgroundimage = createImage(gui.getSize().width, gui.getSize().height);
		}
			grafiken = backgroundimage.getGraphics();

Dann dachte ich mir, ich versuch es mit dem Toolkit. Doch leider motzt er dann, dass die Methode getGraphics() nur bei einem Image, dass mit "creatImage(w,h)" erstellt worden ist funktioniert.
Doch diese Methode mit den entsprechenden Parametern gibt es beim Toolkit nicht.


Code:
	if (backgroundimage == null)
		{
			backgroundimage = Toolkit.getDefaultToolkit().createImage(null, gui.getSize().width, gui.getSize().height);
		}
                                                grafiken = backgroundimage.getGraphics();

Brauch Hilfe.

Wäre auch toll, wenn jemand ein gutes Tutorial mit Images und Grafiken für eine normale Applikation (kein Applet) hätte.

Danke
 
Hallo,

das liegt daran, dass die Komponente von der aus createImage aufgerufen wird (noch) nicht angezeigt.

oder siehe API-Dokumentation:

public Image createImage(int width, int height)
...
Returns:
an off-screen drawable image, which can be used for double buffering. The return value may be null if the component is not displayable. This will always happen if GraphicsEnvironment.isHeadless() returns true.


Im übrigen ist es egal ob Applet oder Applikation.
 
ich hab ein ähnliches problem, aber ich hab schon was gemacht:

Code:
package MainPackage;

import Typen.*;
import Spielfeld.*;

import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.lang.*;

public final class MainClass extends JFrame {
	
	Field mainPanel;
	Image welches, offscreenImage;
	String sb1, sb2, sb3, sb4, welchess;
	Spieler spieler = new Spieler(200,300,sb1,sb2,sb3,sb4);
	int x,y;
	Graphics offscreenGraphics;
	
	public MainClass() {
		sb1 = "b1.JPG";
		sb2 = "b2.JPG";
		sb3 = "b3.JPG";
		sb4 = "b4.JPG";
		welchess = "b1.JPG";
		
		x = 200;
		y = 300;

		offscreenImage = createImage( x, y );
		offscreenGraphics = offscreenImage.getGraphics();
		
		welches = Toolkit.getDefaultToolkit().getImage(welchess);
		
		setLayout(new BorderLayout());
		mainPanel = new Field();
		
		setAction("exit", KeyEvent.VK_F2, InputEvent.SHIFT_MASK);
		setAction("oben", KeyEvent.VK_W, 0);
		setAction("links", KeyEvent.VK_A,0);
		setAction("rechts", KeyEvent.VK_D,0);
		setAction("unten", KeyEvent.VK_S,0);
		
	    GraphicsDevice gd = GraphicsEnvironment.getLocalGraphicsEnvironment().getDefaultScreenDevice(); 
	    gd.setFullScreenWindow(this);
		add(mainPanel,"Center");
		
		setVisible(true);
	}
	
    private void setAction(final String action, final int key, final int modifier){ 
        Action a = new AbstractAction(){ 
            public void actionPerformed(ActionEvent e) { 
                doAction(action); 
            } 
        }; 
        mainPanel.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put( 
                KeyStroke.getKeyStroke(key, modifier), action); 
        mainPanel.getActionMap().put(action, a); 
    } 
    
    private void doAction(final String action){ 
    	if(action.equals("exit")) {
    		System.exit(0);
    	}
    	else if(action.equals("oben")) {
    		welchess = "b1.JPG";
    		welches = Toolkit.getDefaultToolkit().getImage(welchess);
    		obewegen();
    		repaint();
    	}
    	else if(action.equals("rechts")) {
    		welchess = "b2.JPG";
    		welches = Toolkit.getDefaultToolkit().getImage(welchess);
    		rbewegen();
    		repaint();
    	}
    	else if(action.equals("links")) {
    		welchess = "b3.JPG";
    		welches = Toolkit.getDefaultToolkit().getImage(welchess);
    		lbewegen();
    		repaint();
    	}
    	else if(action.equals("unten")) {
    		welchess = "b4.JPG";
    		welches = Toolkit.getDefaultToolkit().getImage(welchess);
    		ubewegen();
    		repaint();
    	}
    }
	
	public static void main(String[] args) {
		MainClass frame = new MainClass();
		Spieler spieler1 = new Spieler(100,200,"b1.JPG","b2.JPG","b3.JPG","b4.JPG");
	}
	
	
	public void update( Graphics g )
	{
	  paint( g );
	}
	
	private void Offpaint() {
		offscreenGraphics.drawImage(Field.hintergrund,0,0,Field.x,Field.y,this);
		offscreenGraphics.drawImage(welches,x,y,this);
	}
	
	public void paint( Graphics g )
	{
	  if ( offscreenImage != null )
	    g.drawImage( offscreenImage, 0, 0, this );
	}
	
	public void rbewegen() {
		x += 2;
	}
	
	public void lbewegen() {
		x -= 2;
	}
	
	public void obewegen() {
		y -= 2;
	}
	
	public void ubewegen() {
		y += 2;
	}

}

Code:
package Spielfeld;

import javax.swing.*;
import java.awt.*;

public class Field extends JPanel {
	
	public static Image hintergrund;
	Dimension screen;
	public static int x, y;
	
	public Field() {
		super();
		hintergrund = Toolkit.getDefaultToolkit().getImage("hintergrund.JPG");
		screen = Toolkit.getDefaultToolkit().getScreenSize();
		y = screen.height;
		x = screen.width;
	}

}


Ich bekomm auch eine NullPointerException, aber ich hab auch keine Ahnung ob das mit dem Double Bufferiung geht...
 
Status
Nicht offen für weitere Antworten.

Zurück
Oben