# "Graphikoberfläche" für ein 2D-Spiel



## Bruegge (9. Mai 2005)

Hallo!

Ich habe vor ein 2D-Spiel (ähnlich wie Diablo) in Java zu Programmieren. Im Moment stehe ich jedoch vor dem Problem,
dass ich eine geeignete Graphikoberfläche suche. Ich möchte keine Frame verwenden (also das Spiel in einem Fenster spielen) und auch kein Applet. Ich möchte eigentlich, dass das Spiel quasi im Vollbildmodus läuft und ich images einfügen kann. Oder ist der Vollbildmodus eine Frame die man dementsprechend verändert?

Naja wenn jemand eine Idee hat, wie genau so ein "Vollbildmodus" funktioniert, oder einen Link dazu, wäre ich sehr dankbar!

Vielen Dank,
Christian


----------



## stev.glasow (9. Mai 2005)

Was diabloiges läuft das ja unter 3D, und meines Wissen unterstützen Java 3D und Co. alle einen Vollbildmodus. 
Was nutzt du denn zum zeichnen?


----------



## Wildcard (9. Mai 2005)

```
GraphicsEnvironment.getLocalGraphicsEnvironment().getDefaultScreenDevice().setFullScreenWindow(frame);
```


----------



## Bruegge (9. Mai 2005)

zum zeichnen nutze ich momentan noch garnichts, also ich bin quasi grade erst angefangen... habe auch noch nie ein "graphisches" Spiel programmiert. Was würdest du mir zum zeichnen empfehlen? laden von einzelnen images (zb. als .jpg irgendwo abgelegt?) 
Der Vollbild-Modus funktioniert mit dem Befehl einwandfrei, danke!!


----------



## Guest (10. Mai 2005)

hmm .. soeben hat sich ein neues Problem ereignet, hab schon das ganze Forum nach einer Antwort abgesucht, aber leider nichts gefunden. Ich habe eine Bilddatei "bg.gif" und will diese einfach nur mit gr.drawimage() in der frame ausgeben. Der Code sieht so aus:


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

public class MainFrame extends JFrame implements ActionListener {
  
  private Image background;
  
  public MainFrame() {
    background = Toolkit.getDefaultToolkit().getImage( "C:\bg.gif" );
    this.setResizable(false);
    this.setUndecorated(true);
    GraphicsEnvironment.getLocalGraphicsEnvironment().getDefaultScreenDevice().setFullScreenWindow(this);
    this.getGraphics()..drawImage( background, 0, 0, this );
  }
  
  public void actionPerformed(ActionEvent e) {
  }
}
```

Das Problem ist, das nichts auf dem Bildschirm passiert. Ich hab es auch schon mit repaint() versucht, aber da
tut sich nix.


----------



## Bruegge (10. Mai 2005)

Ich habe noch ein wenig rumexperiementiert... der Code sieht nun folgendermaßen aus:


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


public class MainFrame extends JFrame {

  private Image background;

  public MainFrame() {
    background = getToolkit().getImage( "C:\bg.png" );
    
    setIgnoreRepaint(true);
    this.setResizable(false);
    this.setUndecorated(true);
    GraphicsEnvironment.getLocalGraphicsEnvironment().getDefaultScreenDevice().setFullScreenWindow(this);
    
    drawBg(this.getGraphics(), background);
  }

  public void drawBg(Graphics gr, Image background) {     
    gr.drawImage( background, 100, 100, this );
    this.getGraphics().drawString("test", 500, 500);  // <-- Das funktioniert einwandfrei
    if(background == null)
      System.out.println("null!"); // <-- wird nicht ausgegeben, also background != null!
  }
}
```

Ich habe mit System.out.println(background.getHeight()); die höhe ausgeben lassen, und es kommt "-1". 
Ich hab allerdings keine Ahnung warum.


----------



## Hansdampf (10. Mai 2005)

das Bild ist noch nich ganz da, entweder du nimmst einen MediaTracker und wartest, bis es ganz geladen ist oder noch besser :

ImageIO.read(file);


----------



## Campino (10. Mai 2005)

Bruegge hat gesagt.:
			
		

> Ich habe mit System.out.println(background.getHeight()); die höhe ausgeben lassen, und es kommt "-1".
> Ich hab allerdings keine Ahnung warum.


dann wurde das Bild nicht richtig geladen. Außerdem solltest du drawBG() nicht im konstruktor sondern in der paintComponent()-Methode des JFrames aufrufen.


----------



## Bruegge (10. Mai 2005)

Also ich hab jetzt alles mögliche mit ImageIO.read(file) versucht, aber ich bekomme immer wieder fehler... wie genau würde denn der  Code aussehen zum lesen und ausgeben des Bildes? Ich habe den jetzt so:


```
try {
      File f = new File("C:\bg.gif");
      background = ImageIO.read(f);
    } catch (IOException e) { 
    }
    
    gr.drawImage( background, 100, 100, this );
```


----------



## Hansdampf (10. Mai 2005)

ich lade Bilder so:


```
static BufferedImage loadImage(File file) throws Exception
  {
     BufferedImage initial = ImageIO.read(file);
        GraphicsConfiguration gc =new Frame().getGraphicsConfiguration();
        BufferedImage result=gc.createCompatibleImage(initial.getWidth(),initial.getHeight(),
        initial.getColorModel().getTransparency());
        Graphics2D g = result.createGraphics();
        g.drawImage(initial,0,0,null);
        g.dispose();
        return result;
}
```

setzen so:

g.drawImage(image,x,y,null);

edit:
mach mal File f = new File("C:\*\*bg.gif");

dann gehts auch.


----------



## Bruegge (10. Mai 2005)

Ich habe deinen Code exakt so kopiert und bei mir die Methode eingefügt, diese habe ich dann aus der paint() aufgerufen und es tut sich immernoch nichts in meinem Programm... woran kann es noch liegen?


----------



## Hansdampf (10. Mai 2005)

siehe oben "edit"


----------



## Bruegge (10. Mai 2005)

Hab das versucht, ging aber nicht.. darauf hin hab ich nochmal das internet durchsucht und gesehen , dass andere es mit "c:/bg.gif" machen ... das funktioniert nun!  :roll: Außerdem musste das "setIgnoreRepaint(true);" weg... ich weiß auch nicht wieso ich das dahin gemacht habe! 

Naja, jetzt läuft es jedenfalls!!  Danke an alle!!!


----------



## Guest (18. Mai 2005)

falls es dich interessiert: der "\" ist in java reserviert für spezialzeichen willst du z.b. " ausgeben, musst du 
System.out.println(" \" "); schreiben. nach dem Backslash \ kommt ein spezialzeichen das normalerweise ein steuerzeichen ist

eigentlich müsste der pfad mit c:\\bg.gif auch gehen, weil \\ für \ steht. aber wie du ja schon gemacht hast kann man überall auch einfach / schreiben.

ein kleiner tipp noch zum zeichnen: verwende double-buffering! wenn du ganz normal mit graphics zeichnest, wirst du wie ich bald merken dass alles flimmert, weil java das komisch realisiert.

such im goole einfach nach double buffering, müsstest was finden was dir hilft. zur paint-funktion kommt noch die update fkt und 2 variable hinzu, dann kannst du auch große bilder flimmer-frei zeichnen!!


----------



## Illuvatar (19. Mai 2005)

Inwiefern realisiert Java das komisch? Bei jedem paint wird halt immer erstmal alles überzeichnet damit keine Fragment bleiben. U.U. flackert das halt, aber das kann man duch double Biffering oder entfernen des überzeichnen-schrittes verhindern. Aber wie sollte das sonst gehen bzw. wie macht das C++? Double Buffered das automatisch (wie Swing) ?


----------



## Reality (19. Mai 2005)

Double Buffering ist auch nicht das Wahre! 

1. Entsteht dadurch der Tearing-Effekt
2. Können je nach Auflösung und Bit-Tiefe hohe Daten-Mengen bei der Kopiererei entstehen => Langsam!

Besser ist BufferStragety das Page Flipping einsetzt, sofern das die Grafikkarte mit macht; ansonsten benutzt es Double Buffering.

Liebe Grüße
Reality


----------



## Guest (19. Mai 2005)

BufferStrategy? erklär mal


----------



## Reality (19. Mai 2005)

http://java.sun.com/docs/books/tutorial/extra/fullscreen/bufferstrategy.html
http://java.sun.com/j2se/1.4.2/docs/api/java/awt/image/BufferStrategy.html
http://java.sun.com/docs/books/tutorial/extra/fullscreen/doublebuf.html


----------

