2014-06-08 55 views
0

我需要爲我在java中製作的'炸彈人'風格遊戲製作一個3秒的coundown計時器。我想讓炸彈在3秒倒計時爆炸,但是當我給劇本添加延遲時,它會延遲整個程序。 (Thread.sleep()做同樣的事情)。製作一個簡單的計時器

所以我需要一個非常簡單的腳本示例,它運行一個主程序,並運行另一個運行3秒計時器的線程。

我對Java很新,所以不要使用很多沒有解釋的花哨詞語!!!!!

import java.awt.*; 
import java.awt.event.*; 

import javax.swing.*; 
import javax.swing.border.Border; 

public class MainClass extends JFrame implements KeyListener{ 

    private static final long serialVersionUID = 1L; 

    public MainClass(){  
     super("WaterBalloonWars"); 
     JPanel panel=new JPanel(new GridLayout(width,height)); 
     myGrid = new JPanel[width][height]; 
     Border border=BorderFactory.createLineBorder(Color.DARK_GRAY, 1); 
     for(int r=0;r<width-1;r++){ 
      for(int c=0;c<height-1;c++){ 
       double randNum = Math.random(); 
       myGrid[c][r] = new JPanel(); 
       myGrid[c][r].setBackground(Color.WHITE); 
       myGrid[c][r].setBorder(border); 
       if(randNum<=0.65){ 
        myGrid[c][r].setBackground(Color.GRAY); 
       } 
       if((r & 1)==1){ 
        if((c & 1)==1){ 
         myGrid[c][r].setBackground(Color.BLACK); 
        }     
       } 

       panel.add(myGrid[c][r]);    
          } 
     }    
     myGrid [0][0].setBackground(Color.BLUE); 
     myGrid [0][1].setBackground(Color.WHITE); 
     myGrid [1][0].setBackground(Color.WHITE); 
     myGrid [2][0].setBackground(Color.WHITE); 
     myGrid [0][2].setBackground(Color.WHITE); 
     myGrid [10][10].setBackground(Color.RED); 
     myGrid [10][9].setBackground(Color.WHITE); 
     myGrid [9][10].setBackground(Color.WHITE); 
     myGrid [8][10].setBackground(Color.WHITE); 
     myGrid [10][8].setBackground(Color.WHITE); 
     super.setContentPane(panel); 
     this.addKeyListener(new UKeyListener()); 
     this.addKeyListener(new DKeyListener()); 
     this.addKeyListener(new LKeyListener()); 
     this.addKeyListener(new RKeyListener()); 
     this.addKeyListener(new ShiftKeyListener()); 
     this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     this.setResizable(false); 
     } 

    class ShiftKeyListener implements KeyListener{ 
     @Override 
     public void keyPressed(KeyEvent event) { 
      if (event.getKeyCode() == KeyEvent.VK_SHIFT) { 
       plantBomb(Color.red); 
      } 
     } 
     @Override 
     public void keyReleased(KeyEvent e) { 

     } 
     @Override 
     public void keyTyped(KeyEvent e) {   
     } 
    } 

    class UKeyListener implements KeyListener{   

     @Override 
     public void keyPressed(KeyEvent event) { 
      if (event.getKeyCode() == KeyEvent.VK_UP) { 
       redMove(1); 
      } 
     } 
     @Override 
     public void keyReleased(KeyEvent e) { 

     } 
     @Override 
     public void keyTyped(KeyEvent e) {   
     } 
     } 
    class DKeyListener implements KeyListener{   
     @Override 
     public void keyPressed(KeyEvent event) { 
      if (event.getKeyCode() == KeyEvent.VK_DOWN) { 
       redMove(2); 
      } 
     } 
     @Override 
     public void keyReleased(KeyEvent e) { 

     } 
     @Override 
     public void keyTyped(KeyEvent e) {   
     } 
    } 
    class LKeyListener implements KeyListener{   
     @Override 
     public void keyPressed(KeyEvent event) { 
      if (event.getKeyCode() == KeyEvent.VK_LEFT) { 
       redMove(3); 
      } 
     } 
     @Override 
     public void keyReleased(KeyEvent e) { 

     } 
     @Override 
     public void keyTyped(KeyEvent e) {   
     } 
    } 
    class RKeyListener implements KeyListener{   
     @Override 
     public void keyPressed(KeyEvent event) { 
      if (event.getKeyCode() == KeyEvent.VK_RIGHT) { 
       redMove(4); 
      } 
     } 
     @Override 
     public void keyReleased(KeyEvent e) { 

     } 
     @Override 
     public void keyTyped(KeyEvent e) {   
     } 
    } 
     public void plantBomb(Color color){  
      if(color.equals(Color.red)){ 
       rbombx=rx; 
       rbomby=ry; 
       myGrid[rbombx][rbomby].setBackground(Color.orange); 
       redBombPlaced=true; 
       explode(Color.red,2,rbombx,rbomby); 

      } 
      if(color.equals(Color.blue)){ 

      } 
     } 
    public void explode(Color color,int power,int x,int y){ 

//這是我希望定時器TO GO部分

 boolean ublock=false; 
     boolean dblock=false; 
     boolean lblock=false; 
     boolean rblock=false; 
     for(int i=1;i<=power;i++){ 
      if(!rblock&&(x+i)<=10){ 
       if(myGrid[x+i][y].getBackground().equals(Color.black)){ 
        rblock=true;      
       }else{myGrid[x+i][y].setBackground(Color.white);} 
      } 
      if (!lblock&&(x-i)>=0){ 
       if(myGrid[x-i][y].getBackground().equals(Color.black)){ 
        lblock=true;     
       }else{myGrid[x-i][y].setBackground(Color.white);} 
      } 
      if(!dblock&&(y+i)<=10){ 
       if(myGrid[x][y+i].getBackground().equals(Color.black)){ 
        dblock=true; 
       }else{myGrid[x][y+i].setBackground(Color.white);} 
      } 
      if(!ublock&&(y-i)>=0){ 
       if(myGrid[x][y-i].getBackground().equals(Color.black)){ 
        ublock=true; 
       }else{myGrid[x][y-i].setBackground(Color.white);} 
      } 

      if(color.equals(Color.red)){ 
       redBombPlaced=false; 
      } 
     } 
    } 


    public void redMove(int direction){//1=up 2=down 3=left 4=right 
     if(direction==1){ 
      if(ry-1!=-1){ 
      if(myGrid[rx][ry-1].getBackground()==(Color.BLACK)||myGrid[rx][ry-1].getBackground()==(Color.GRAY)||ry-1==-1){ 
      }else{ 
       ry--;   
       myGrid[rx][ry].setBackground(Color.red); 
       if(redBombPlaced){ 
        redBombPlaced=false; 
       }else{ 
        myGrid[rx][ry+1].setBackground(Color.white); 
       } 
      } 
      } 
     } 
     if(direction==2){ 
      if(ry+1!=11){ 
      if(myGrid[rx][ry+1].getBackground()==(Color.BLACK)||myGrid[rx][ry+1].getBackground()==(Color.GRAY)||ry+1>11){ 
      }else{ 
      ry++; 
      myGrid[rx][ry].setBackground(Color.red); 
      if(redBombPlaced){ 
       redBombPlaced=false; 
      }else{ 
       myGrid[rx][ry-1].setBackground(Color.white); 
      } 
      } 
      } 
     } 
     if(direction==3){ 
      if(rx-1!=-1){ 
      if(myGrid[rx-1][ry].getBackground()==(Color.BLACK)||myGrid[rx-1][ry].getBackground()==(Color.GRAY)||rx-1==-1){ 
      }else{ 
      rx--; 
      myGrid[rx][ry].setBackground(Color.red); 
      if(redBombPlaced){ 
       redBombPlaced=false; 
      }else{ 
       myGrid[rx+1][ry].setBackground(Color.white); 
      } 
      } 
      } 
     } 
     if(direction==4){ 
      if(rx+1!=11){ 
       if(myGrid[rx+1][ry].getBackground()==(Color.BLACK)||myGrid[rx+1][ry].getBackground()==(Color.GRAY)||rx+1==11){ 
       }else{ 
        rx++; 
        myGrid[rx][ry].setBackground(Color.red); 
        if(redBombPlaced){ 
         redBombPlaced=false; 
        }else{ 
         myGrid[rx-1][ry].setBackground(Color.white); 
        } 
       } 
      } 
     } 
    } 
    public void centerFrame(){ 
     Dimension screen=Toolkit.getDefaultToolkit().getScreenSize(); 
     int drawAtX=screen.width/2 - super.getWidth()/2; 
     int drawAtY=screen.height/2 - super.getHeight()/2; 
     super.setLocation(drawAtX-50,drawAtY-50); 
    } 
    private JPanel [][] myGrid; 
    private int width=12; 
    private int height=12; 
    private int rx=10; 
    private int ry=10; 
    int rbombx=0; 
    int rbomby=0; 
    private boolean redBombPlaced=false; 
    private boolean blueBombPlaced=false; 
    /*public static void main(String[] args){ 
     MainClass frame = new MainClass(); 
     frame.setSize(600,600); 
     frame.setVisible(true); 
     frame.centerFrame(); 
    }*/ 
    @Override 
    public void keyPressed(KeyEvent e) { 
    } 
    @Override 
    public void keyReleased(KeyEvent e) { 
    } 
    @Override 
    public void keyTyped(KeyEvent e) {  
    } 
} 

不要在我的編碼發表評論,它可能會讓你畏縮,但沒關係,

+0

你能表現出一定的代碼?你是否真的爲定時器創建了一個單獨的線程? –

+0

更新了我的原帖 – user3720540

回答

1
new Thread(new Runnable() { 
    @Override 
    public void run() { 
     try { 
      Thread.sleep(3000); 
      bombs.explode(); 
     } catch (InterruptedException e) { 
     } 
    } 
}).start(); 
+0

謝謝!這真的有幫助! – user3720540

0

你可以使用TimerTask在一個線程內創建一個Timer。

使用Thread.sleep實際上會將您的主線程設置爲block state

例如:

public class TimerBomb { 
    Toolkit toolkit; 

    Timer timer; 

    public TimerBomb(int seconds) { 
    toolkit = Toolkit.getDefaultToolkit(); 
    timer = new Timer(); 
    timer.schedule(new RemindTask(), seconds * 1000); 
    } 

    class RemindTask extends TimerTask { 
    public void run() { 
     System.out.println("3 second is up"); 
    } 
    } 

    public static void main(String args[]) { 
    System.out.println("About to schedule task."); 
    Thread t = new Thread(new Runnable() { 

     @Override 
     public void run() { 
      new TimerBomb(3); 


     } 
    }); 
    t.start(); 
    System.out.println("Task scheduled."); 
    } 
} 
相關問題