mardi 28 avril 2015

window-Klasse, main-loop und unausschaltbares anti-aliasing

Hallo,
ich versuche seit 2 Tagen ein Fenster im Vollbildmodus zu erstellen, worauf ich das zeichnen kann, was ich will und auch volle Kontrolle darüber habe.

Hier meine window-Klasse (Kommentare nur für den post erstellt):
Java Code:

  1. package window;
  2.  
  3. import java.awt.Color;
  4. import java.awt.DisplayMode;
  5. import java.awt.Graphics;
  6. import java.awt.GraphicsDevice;
  7. import java.awt.GraphicsEnvironment;
  8. import java.awt.Toolkit;
  9. import java.awt.image.BufferStrategy;
  10. import java.awt.image.BufferedImage;
  11. import java.lang.reflect.InvocationTargetException;
  12.  
  13.  
  14. import javax.swing.JFrame;
  15. import javax.swing.SwingUtilities;
  16.  
  17.  
  18. public class Window extends JFrame { /* Bei (?) bin ich mir nicht sicher, ob das Wort so bezeichnet wird */
  19. /**
  20.   *
  21.   */
  22. private static final long serialVersionUID = -5779675260844878716L;
  23.  
  24.  
  25. private BufferStrategy bufferStrategy; /* Benutze ich um zu zeichnen und Probleme wie tearing(?) zu umgehen */
  26. private BufferedImage mainImage; /* Das ist das Bild, auf das ich zeichne, dann in der Paint-Methode anzeigen lasse */
  27.  
  28. public Window(String title) {
  29. super(title);
  30.  
  31. setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); /* Sollte sich von selbst erklären */
  32. setSize(Toolkit.getDefaultToolkit().getScreenSize());
  33. setUndecorated(true);
  34. setResizable(false);
  35.  
  36. GraphicsEnvironment environment = GraphicsEnvironment.getLocalGraphicsEnvironment(); /* Verantwortlich für das Vollbild */
  37. GraphicsDevice device = environment.getDefaultScreenDevice();
  38. DisplayMode displayMode = new DisplayMode(device.getDisplayMode().getWidth(),
  39. device.getDisplayMode().getHeight(),
  40. device.getDisplayMode().getBitDepth(),
  41. device.getDisplayMode().getRefreshRate());
  42. device.setFullScreenWindow(this);
  43. device.setDisplayMode(displayMode);
  44.  
  45. try {
  46. SwingUtilities.invokeAndWait(new Runnable() { /* Sollte darauf warten, dass das Fenster komplett aufgebaut und bereit zum Zeichnen ist */
  47.  
  48.  
  49. @Override
  50. public void run() {
  51. createBufferStrategy(1); /* Nur einen buffer(?) erstellen, da ich ein eigenes Bild zum Zeichnen benutze */
  52. bufferStrategy = getBufferStrategy();
  53. mainImage = new BufferedImage(getWidth(), getHeight(), BufferedImage.TYPE_4BYTE_ABGR); /* Das Bild erstellen */
  54.  
  55. setFocusable(true); /* Damit das Fenster fokusiert wird */
  56. requestFocus();
  57. }
  58.  
  59. });
  60. }
  61.  
  62. public void render() {
  63. Graphics g = mainImage.getGraphics(); /* Graphics des Bildes */
  64. g.setColor(Color.blue);
  65. g.fillRect(100, 100, 100, 100); /* Ein blaues Quadrat zeichnen */
  66. g.dispose();
  67. }
  68.  
  69.  
  70. public void paint() {
  71. if(bufferStrategy != null) {
  72. Graphics g = bufferStrategy.getDrawGraphics(); /* Graphics der buffer strategy, also zum Anzeigen des Bildes */
  73. g.drawImage(mainImage, 0, 0, getWidth(), getHeight(), null); /* Zeichnen des Bildes */
  74. g.dispose();
  75. bufferStrategy.show(); /* Das Ganze anzeigen lassen */
  76. }
  77. }
  78. }


Wenn ich in meiner main-Klasse darüber loope, also zuerst die Methode "render()" und dann "paint()" im loop aufrufe, funktioniert das auch ganz gut. Da ich mich nicht damit auskenne, ob das wirklich effizient ist, oder wie ich da genau drüber-loopen soll, wollte ich hier einfach mal fragen, was ihr davon haltet.

Außerdem habe ich das Problem, dass egal was ich den graphics mitteile, das Quadrat immer anti-aliased dargestellt wird...
Also bei beiden Methoden
Java Code:

  1.  ((Graphics2D) g).setRenderingHint(RenderingHints.KEY_ANTIALIASING,
  2. RenderingHints.VALUE_ANTIALIAS_OFF);
hilft nicht.

Ich brauche also Hilfe dabei, wie die window-Klasse aufgebaut sein soll, wie der main-Loop sein soll(Effizienz...) und wie ich das anti-aliasing ausschalten kann.

Ich hoffe ihr könnt mir helfen, danke


window-Klasse, main-loop und unausschaltbares anti-aliasing

0 commentaires:

Enregistrer un commentaire