2016-11-10 17 views
-1

Я пытался конвертировать одну из своих игр в Applet, но так как это мой первый раз с использованием Applet, я столкнулся с проблемой. В основном, когда я открываю игру, экран начинает мигать. Я уверен, что из-за отсутствия BufferStrategy, но всякий раз, когда я пытаюсь создать такой, как «BufferStrategy bg = this.getBufferStrategy()», он не работает. Может кто-нибудь помочь?Как остановить апплет от мигания?

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

Вы пробовали ручной двойной буферизации или добавления, instance, JPanel, на который нужно рисовать (который по умолчанию должен быть двойной буферизацией)? – Gelunox

+0

1) 'g.dispose();' Никогда не удаляйте объект «Graphics», который ваш код не создавал. 2) Изменить 'public void paint (Graphics g) { // DRAW HERE' to' public void paint (Графика g) { super.paint (g); // ПРОВЕРЬТЕ ЗДЕСЬ, чтобы уважать цепь краски. 3) Чтобы получить более эффективную помощь, отправьте сообщение [MCVE] или [Short, Self Contained, Correct Example] (http://www.sscce.org/). 4) См. [Поддержка устаревших Java-плагинов] (http://www.gizmodo.com.au/2016/01/rest-in-hell-java-plug-in/) и [Переход в плагиновую сеть] (https://blogs.oracle.com/java-platform-group/entry/moving_to_a_plugin_free). –

+0

5) 'public void stop() { try { System.exit (1);' A) Система безопасности Java должна предотвращать вызовы 'System.exit (int)' Апплет будет остановлен, когда ему сообщают с помощью JVM - это просто означает, что сам апплет должен обрабатывать dicontinue, сам апплет не должен пытаться остановить JVM. B) Но обратите внимание, что любое целое число, отличное от '0', зарезервировано для аномального выхода, тогда как метод' stop() 'вызывается другими процессами, чтобы указать нормальный, а в остальном полностью ожидаемый останов (аппроксимация ** **) апплета виды деятельности. –

ответ

-1

Вместо вызова перекрасить(), попробуйте позвонить

paint(getGraphics()). 

Другое дело, добавьте этот метод в ваш апплет:

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

Оба этих совета - это плохое программирование в лучшем случае и, в худшем случае, шутки. Программирование вуду крайне нецелесообразно. –

+0

Второй совет - очень старый совет, используемый в Java-коде 19 лет назад. Не уверен, что он устарел, но поскольку Java по-прежнему поддерживает 1.1, он может быть действительным. –

+0

* «Не уверен, устарел ли он» *. Не используйте советы, предназначенные для AWT. Даже тогда это был довольно плохой совет. Где вы его видели (ссылка)? –