2016-08-01 22 views
-1

Ich bin gerade dabei, ein Spiel zu programmieren und ich versuche, es zu haben, wenn Sie auf die erste Taste auf der Titelseite klicken, zeigt es einen Übergangsbildschirm für 5 Sekunden, und zeigt dann das Spiel. Hier ist mein Code:Java-Spiel - Nicht malen bis nach Thread.sleep

import java.awt.Graphics; 
import java.awt.Graphics2D; 
import java.awt.RenderingHints; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import java.awt.event.KeyEvent; 
import java.awt.event.KeyListener; 
import java.awt.event.MouseEvent; 
import java.awt.event.MouseListener; 
import java.awt.image.BufferedImage; 
import java.io.File; 
import javax.imageio.ImageIO; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 
public class ForgottenMain extends JPanel implements KeyListener,MouseListener{ 
    /** 
    * 
    */ 
    private static final int TIMER_DELAY = 35; 
    private static final long serialVersionUID = -4926251405849574401L; 
    public static BufferedImage attic,flashlight,player,killer,frontpage,transition; 
    public static boolean onFrontPage,up,down,left,right,inAttic,onTransition; 
    public static int px,py,kx,ky; 
    public static Thread th1,th2; 
    public static JFrame frame = new JFrame("Forgotten"); 
    public static void main(String[] args){ 
     onFrontPage = true; 
     px = 600; 
     py = 400; 
     ForgottenMain fm = new ForgottenMain(); 
     frame.add(fm); 
     frame.setSize(1200,800); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.setLocationRelativeTo(null); 
     frame.setResizable(false); 
     frame.setVisible(true); 
     frame.add(new ForgottenMain()); 
     fm.repaint(); 
    } 
    public ForgottenMain(){ 
     init(); 
    } 
    public void init(){ 
     setSize(1200,800); 
     setVisible(true); 
     frame.addKeyListener(this); 
     frame.addMouseListener(this); 
     try{  
      player = ImageIO.read(new File("char.png")); 
      flashlight = ImageIO.read(new File("flashlightimage.png")); 
      attic = ImageIO.read(new File("attic.png")); 
      killer = ImageIO.read(new File("killer.png")); 
      frontpage = ImageIO.read(new File("frontpageoutline.png")); 
      transition = ImageIO.read(new File("transitionoutline.png")); 
     } catch (Exception e){ 
      e.printStackTrace(); 
     } 


     // Gameloop 
      new javax.swing.Timer(TIMER_DELAY, new ActionListener() { 
       public void actionPerformed(ActionEvent e) { 
        gameLoop(); 
       } 
       }).start(); 
    } 
    @Override 
    public void paintComponent(Graphics g){ 
     super.paintComponent(g); 
     Graphics2D g2 = (Graphics2D) g; 
     int fx = px - 1033; 
     int fy = py - 635; 
     kx = 500; 
     ky = 500; 
     // Removes the flickering of the images 
     g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); 
     // Resets the screen to make sure that it only shows the character once 
     g2.clearRect(0, 0, 1200, 800); 
     // Draws the background attic 
     if(inAttic == true){ 
      System.out.println("Drawing attic"); 
      g2.drawImage(attic,0,0,this); 
     } 
     if(onFrontPage == true){ 
      g2.drawImage(frontpage, 0, 0, this); 
     } 
     // Draws the player 
     if(onFrontPage == false && onTransition == false){ 
      g2.drawImage(player, px, py, this); 
      // Draws the Serial Killer 
      g2.drawImage(killer, kx, ky, this); 
      // Draws the flashlight 
      g2.drawImage(flashlight, fx, fy, this); 
     } 
     if(onTransition == true){ 
      g2.drawImage(transition, 0, 0, this); 
      System.out.println("Drawing Transition"); 
      try { 
       System.out.println("Sleeping for 5 Seconds"); 
       Thread.sleep(5000); 
      } catch (InterruptedException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } 
      System.out.println("Done sleeping."); 
      onTransition = false; 
      inAttic = true; 
     } 
     System.out.println(px + " " + py); 
    } 
    public void gameLoop(){ 

    } 
    @Override 
    public void mouseClicked(MouseEvent arg0) { 
     System.out.println("MouseLocation: " + arg0.getX() + ", " + arg0.getY()); 
    } 
    @Override 
    public void mouseEntered(MouseEvent arg0) { 

    } 
    @Override 
    public void mouseExited(MouseEvent arg0) { 

    } 
    @Override 
    public void mousePressed(MouseEvent e) { 
     if(e.getX() > 499 && e.getY() > 343 && e.getX() < 748 && e.getY() < 391){ 
      onFrontPage = false; 
      onTransition = true; 
      repaint(); 
     } 
    } 
    @Override 
    public void mouseReleased(MouseEvent arg0) { 

    } 

Mein Problem ist, in der Farbe-Methode in der if-Anweisung der Prüfung, ob onTransition gleich wahr ist, es sollte das Bild Übergang zu ziehen, 5 Sekunden warten, und dann das Spiel ziehen .

Allerdings wartet es jetzt 5 Sekunden, dann schnell den Übergang Bildschirm und dann das Spiel. Aus irgendeinem Grund sind sie nicht in Ordnung.

Wie kann ich das beheben? Ich habe versucht, alternative Methoden zum Warten von 5 Sekunden, zum Beispiel mit currentTimeMillis();, aber das gleiche Ergebnis.

+4

Verwendung SwingTimer (mit programmatisch neu streichen() zu ForgottenMain) anstelle von Thread.sleep (5000); – mKorbel

+0

Könntest du mich vielleicht mit einem Beispiel verbinden? In einer früheren Frage habe ich nach einer Möglichkeit gefragt, eine Gameloop zu machen und der Timer wurde vorgeschlagen, also habe ich es benutzt, aber ich verstehe es immer noch nicht vollständig. @mKorbel – joey942

+0

@ joey942 siehe http://stackoverflow.com/questions/8088002/how-to-use-a-swing-timer-to-start-stop-animation – Austin

Antwort

2

Sie haben einige schwerwiegende Probleme:

  • Sie fügen Platten zweimal
  • Sie etwas weitschweifigen Verwendung von Rahmen usw.

Darüber hinaus folgendes funktioniert haben: Sie, dass Sie erkennen müssen habe keine Kontrolle über den Malprozess. Daher sollten Sie einen neuen Thread starten, um den Schlaf zu zählen und die Farbe ungehemmt arbeiten zu lassen.

(Auch habe ich statische entfernt - wenn Sie wirklich wollen, können Sie versuchen, sie zurück zu setzen in - wenn es nicht funktioniert, können Sie sie einfach wegzuwerfen)

class F extends JPanel implements MouseListener{ 
    /** 
    * 
    */ 
    private static final int TIMER_DELAY = 35; 
    private static final long serialVersionUID = -4926251405849574401L; 
    public BufferedImage attic,flashlight,player,killer,frontpage,transition; 
    public boolean onFrontPage,up,down,left,right,inAttic,onTransition; 
    public int px,py,kx,ky; 
    public static Thread th1,th2; 
    public JFrame frame = new JFrame("Forgotten"); 
    public F(){ 
     init(); 
    } 
    public void init(){ 
     setSize(1200,800); 
     setVisible(true); 
     onFrontPage = true; 
     px = 600; 
     py = 400; 
     frame.add(this); 
     frame.setSize(1200,800); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.setLocationRelativeTo(null); 
     frame.setResizable(false); 
     frame.setVisible(true); 

     frame.addMouseListener(this); 
     try{  
//   player = ImageIO.read(new File("char.png")); 
//   flashlight = ImageIO.read(new File("flashlightimage.png")); 
//   attic = ImageIO.read(new File("attic.png")); 
//   killer = ImageIO.read(new File("killer.png")); 
      attic = ImageIO.read(new File(...)); 
      frontpage = ImageIO.read(new File(...)); 
      transition = ImageIO.read(new File(...)); 
     } catch (Exception e){ 
      e.printStackTrace(); 
     } 
    } 

    @Override 
    public void paintComponent(Graphics g){ 
     super.paintComponent(g); 
     Graphics2D g2 = (Graphics2D) g; 
     int fx = px - 1033; 
     int fy = py - 635; 
     kx = 500; 
     ky = 500; 
     // Removes the flickering of the images 
     g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); 
     // Resets the screen to make sure that it only shows the character once 
     g2.clearRect(0, 0, 1200, 800); 
     // Draws the background attic 
     if(inAttic == true){ 
      System.out.println("Drawing attic"+System.currentTimeMillis()); 
      g2.drawImage(attic,0,0,this); 
     } 
     if(onFrontPage == true){ 
      g2.drawImage(frontpage, 0, 0, this); 
     } 
     // Draws the player 
     if(onFrontPage == false && onTransition == false){ 
      g2.drawImage(player, px, py, this); 
      // Draws the Serial Killer 
      g2.drawImage(killer, kx, ky, this); 
      // Draws the flashlight 
      g2.drawImage(flashlight, fx, fy, this); 
     } 
     if(onTransition == true){ 
      Graphics gt=transition.getGraphics(); 
      gt.setColor(Color.red); 
      gt.drawString("xxx"+System.currentTimeMillis(), 10, 100); 
      g2.drawImage(transition, 0, 0, this); 
      onTransition = false; 
      inAttic = true; 
     } 
     System.out.println(px + " " + py); 
    } 
    public void gameLoop(){ 

    } 
    @Override 
    public void mouseClicked(MouseEvent arg0) { 
     System.out.println("MouseLocation: " + arg0.getX() + ", " + arg0.getY()); 
    } 
    @Override 
    public void mouseEntered(MouseEvent arg0) { 

    } 
    @Override 
    public void mouseExited(MouseEvent arg0) { 

    } 
    @Override 
    public void mousePressed(MouseEvent e) { 
      onFrontPage = false; 
      onTransition = true; 

    Thread th=new Thread() { 
     public void run() { 
      repaint(); 
      System.out.println("Drawing Transition"+System.currentTimeMillis()); 
      try { 
       System.out.println("Sleeping for 5 Seconds"+System.currentTimeMillis()); 
       Thread.sleep(5000); 
      } catch (InterruptedException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } 
      System.out.println("Done sleeping."+System.currentTimeMillis()); 
      repaint(); 
     } 
    }; 
    th.start(); 


    } 
    @Override 
    public void mouseReleased(MouseEvent arg0) { 

    } 

}