2016-11-10 3 views
-1

Ich habe versucht, eines meiner Spiele in ein Applet zu konvertieren, aber da es das erste Mal ist, dass ich ein Applet benutze, habe ich ein Problem bekommen. Grundsätzlich, wenn ich das Spiel öffne, fängt der Bildschirm an zu blinken. Ich bin mir ziemlich sicher, dass es daran liegt, keine BufferStrategy zu haben, aber wenn ich versuche, einen wie "BufferStrategy bg = this.getBufferStrategy()" zu erstellen, funktioniert es nicht. Kann jemand helfen?Wie man ein Applet davon abhält zu blinken?

package main; 

import java.awt.Color; 
import java.awt.Graphics; 

import javax.swing.JApplet; 

import Handling.Handler; 
import Other.HUD; 
import Other.KeyInput; 


public class Game extends JApplet implements Runnable{ 

    private static final long serialVersionUID = 9021342660060318393L; 

    public static final int WIDTH = 640; 
    public static final int HEIGHT = WIDTH/12 * 9; 

    private Thread thread; 
    private boolean running = false; 

    private Handler handler; 
    private HUD hud; 
    private Spawner spawner; 
    private Menu menu; 

    public enum STATE{ 
     Menu(), 
     Help(), 
     Settings(), 
     DeathScreen(), 
     Game(); 
    }; 

    public enum DIFFICULTY{ 
     Easy(), 
     Mediuм(), 
     Hard(); 
    }; 

    public STATE GameState = STATE.Menu; 
    public DIFFICULTY difficulty = DIFFICULTY.Easy; 







    private void tick(){ 
     handler.tick(); 
     if(GameState == STATE.Game){ 
      hud.tick(); 
      spawner.tick(); 
     }else if(GameState == STATE.Menu){ 
      menu.tick(); 
     } 
    } 

    public void paint(Graphics g){ 

     //DRAW HERE 
     g.setColor(Color.black); 
     g.fillRect(0, 0, WIDTH, HEIGHT); 

     handler.paint(g); 

     if(GameState == STATE.Game){ 
      hud.paint(g); 
     }else if(GameState == STATE.Menu || GameState == STATE.Help || GameState == STATE.Settings || GameState == STATE.DeathScreen){ 
      menu.paint(g); 
     } 
     //STOP DRAWING 

     g.dispose(); 
    } 








    public void init(){ 
     setSize(WIDTH,HEIGHT); 

     handler = new Handler(); 
     menu = new Menu(this, handler); 
     this.requestFocusInWindow(true); 
     this.setFocusable(true); 
     this.addKeyListener(new KeyInput(handler)); 
     this.addMouseListener(menu); 
     hud = new HUD(); 
     spawner = new Spawner(handler, hud, this); 
    } 

    public void start(){ 
     thread = new Thread(this); 
     thread.start(); 
     running = true; 
    } 

    public void destroy(){} 

    public void stop(){ 
     try { 
      System.exit(1); 
      thread.join(); 
      running = false; 
     } catch (InterruptedException e) { 
      e.printStackTrace(); 
     } 

    } 

    public void run() { 
     this.requestFocus(); 
     long LastTime = System.nanoTime(); 
     double amountOfTicks = 60.0; 
     double ns = 1000000000/amountOfTicks; 
     double delta = 0; 
     long timer = System.currentTimeMillis(); 
     int frames = 0; 
     while(running){ 
      long now = System.nanoTime(); 
      delta += (now - LastTime)/ns; 
      LastTime = now; 
      while(delta >= 1){ 
       tick(); 
       repaint(); 
       delta--; 
      } 
      frames++; 

      if(System.currentTimeMillis() - timer > 1000){ 
       timer += 1000; 
       System.out.println("FPS: " + frames); 
       frames = 0; 
      } 
      try { 
       thread.sleep(20); 
      } catch (InterruptedException e) { 
       e.printStackTrace(); 
      } 
     } 
     stop(); 
    } 

} 
+0

Haben Sie manuelle doppelte Pufferung oder Hinzufügen versucht, für Beispiel, ein JPanel, auf dem gezeichnet werden soll (was standardmäßig doppelt gepuffert sein sollte)? – Gelunox

+0

1) 'g.dispose();' Verfügen Sie niemals über ein 'Graphics'-Objekt, das Ihr Code nicht erstellt hat. 2) Ändere 'öffentliche leere Farbe (Graphics g) { // Ziehe HIER' zu' public void paint (Grafik g) { superpaint (g); // HIER ZEICHNEN, um die Farbkette zu respektieren. 3) Um eine bessere Hilfe zu erhalten, sollten Sie ein [MCVE] oder [Short, Self Contained, Correct Example] (http://www.sscce.org/) veröffentlichen. 4) Siehe [Java Plugin-Unterstützung nicht mehr unterstützt] (http://www.gizmodo.com.au/2016/01/rest-in-hell-java-plug-in/) und [Wechsel zu einem Plugin-freien Web] (https://blogs.oracle.com/java-platform-group/entry/moving_to_a_plugin_free). –

+0

5) 'public void stop() { Versuch { System.exit (1);' A) Das Java-Sicherheitssystem sollte Aufrufe von 'System.exit (int) verhindern' Ein Applet wird gestoppt, wenn es dazu aufgefordert wird durch die JVM - es bedeutet einfach, dass das Applet selbst die Verarbeitung fortführen sollte, das Applet selbst sollte nicht versuchen, die JVM zu stoppen. B) Aber beachten Sie, dass jede andere Zahl als "0" für abnormalen Ausgang reserviert ist, während die 'stop()' Methode von anderen Prozessen aufgerufen wird, um einen normalen und ansonsten vollständig erwarteten Stopp für (** aktuelle **) Applet anzuzeigen Aktivitäten. –

Antwort

-1

Statt Repaint() aufgerufen wird, versuchen

paint(getGraphics()). 

Eine andere Sache zu nennen, fügen Sie diese Methode, um das Applet:

public void update(java.awt.Graphics g) {} 
+0

Diese beiden Ratschläge sind bestenfalls schlechte Programmierung und schlimmstenfalls die schlimmsten Dinge. Von voodoo zu programmieren ist sehr zu empfehlen. –

+0

Der zweite Tipp ist ein sehr alter Tipp, der vor 19 Jahren in Java-Code verwendet wurde. Nicht sicher, ob es veraltet ist, aber da Java immer noch 1.1 unterstützt, kann es gültig sein. –

+0

* "Nicht sicher, ob es veraltet ist" * Es ist. Verwenden Sie keinen Rat für AWT. Schon damals war es ein ziemlich schlechter Rat. Wo hast du es gesehen (Link)? –

Verwandte Themen