2015-01-06 32 views
0

在此代碼中,我有一個具有兩個坦克的圖形(繪圖分量圖形)。 paintcomponent由變量控制,然後重繪()。現在,只有一個按鈕被按下或按下時,它才能正常工作。但是,例如,如果我左側是坦克1,右側是坦克2,則最後一個鍵是「贏」的那個鍵:它是唯一發生的方向。使用以前的答案,無法同時按下兩個圖片「同時移動」

在我的代碼中,您會發現大約4次我最近嘗試過的'迭代'添加到代碼中。

基本設置是:鍵綁定→AbstractAction→...

以上的設置,而不省略號(...)表示原始嘗試。然後,在另一次嘗試中,這被鏈接到一個線程。同樣的結果。在另一個嘗試中,抽象動作被設置爲改變數組值,該值連接到每20秒檢查一次的計時器。從那裏分支的兩次嘗試是定時器到線程的連接,並且直接重繪放入定時器。

我現在唯一的其他選擇是爲每個組合鍵單獨鍵綁定(即,左鍵和D [D移動tank1]將是鍵碼「LEFT D」的鍵綁定,因此將是一個單獨的事件那兩個都動了)。然而,這將是一個麻煩,因爲我也有角度變化的炮塔,以及射擊的子彈......另外我想認爲有一個更體面的方式來做到這一點。

任何幫助將不勝感激。代碼如下。

class OneMoveRightThread implements Runnable { //This is a thread that contains code to 'move' the tank1. 

      public void run(){ 
       tankGraphic.TankOneMoveRight(); 
       gameArea.repaint(); 
      } 
     } 
    class OneMoveLeftThread implements Runnable { //thread to move tank2 

      public void run(){ 
       tankGraphic.TankOneMoveLeft(); 
       gameArea.repaint(); 
      } 
     } 
     //Meow is a [0,0,0,0,0,0,0,0] (8 zeroes) array. When a button is clicked the value is set to 1 for the spot in the array. 
     ActionListener taskPerformer = new ActionListener() { 
      @Override 
      public void actionPerformed(ActionEvent e) { 
       if (meow[0] == 1){ //This attempt uses a timer to constantly check the array for potential movement. Still works for 1 movement at a time. 
        (new Thread(new OneMoveLeftThread())).start(); 
        meow[0]=0; 
       } 
       if(meow[1]==1){ 
        (new Thread(new OneMoveRightThread())).start(); //using code in threads by calling the thread. My hope was that this would fix it. 
        meow[1]=0; 
        } 
       if (meow[2]==1){ //TANK TWO MOVE LEFT using code in threads 
        tankGraphic.TankTwoMoveLeft(); 
        gameArea.repaint(); 
        meow[2]=0; 
       } 

      } 
     }; 
     new Timer(delay, taskPerformer).start(); 

     //This abstract action is a different part of the code. 
     Action doNothing = new AbstractAction() { 
      @Override 
      public void actionPerformed(ActionEvent e) { 
       lifeBar1.setText("\n Player 1: " + player1Name + " \n Health: " + player1Health + " \n Bullets: A LOT!"); 
       lifeBar2.setText("\n Player 2: " + player2Name + " \n Health: " + player2Health + " \n Bullets: A LOT!"); 
      } 
     }; 
     //TANK TWO BELOW 
     Action leftMove = new AbstractAction() { 
      @Override 
      public void actionPerformed(ActionEvent e) { //This is code for "When LEFT arrow is pressed, set meow[2]=1" 
       //tankGraphic.TankTwoMoveLeft(); 
       //gameArea.repaint(); 
       meow[2]=1; 
      } 
     }; 
     Action rightMove = new AbstractAction() { 
      @Override 
      public void actionPerformed(ActionEvent e) { //This is code for when RIGHT arrow is pressed, move tank directly. This and the above have same erroneous result. 
       tankGraphic.TankTwoMoveRight(); 
       gameArea.repaint(); 
      } 
     }; 
     Action angleLEFT = new AbstractAction() { 
      @Override 
      public void actionPerformed(ActionEvent e) { 
       tankGraphic.TankTwoAngleLeft(); 
       gameArea.repaint(); 
      } 
     }; 
     Action angleRIGHT = new AbstractAction() { 
      @Override 
      public void actionPerformed(ActionEvent e) { 
       tankGraphic.TankTwoAngleRight(); 
       gameArea.repaint(); 
      } 
     }; 

     //TANK ONE BELOW 

     Action leftMove2 = new AbstractAction() { 
      @Override 
      public void actionPerformed(ActionEvent e) { 
       meow[0]=1; 

      } 
     }; 

     Action rightMove2 = new AbstractAction() { 
      @Override 
      public void actionPerformed(ActionEvent e) { 
       //(new Thread(new OneMoveRightThread())).start(); 
       meow[1]=1; 
      } 
     }; 
     Action angleLEFT2 = new AbstractAction() { 
      @Override 
      public void actionPerformed(ActionEvent e) { 
       tankGraphic.TankOneAngleLeft(); 
       gameArea.repaint(); 
      } 
     }; 
     Action angleRIGHT2 = new AbstractAction() { 
      @Override 
      public void actionPerformed(ActionEvent e) { 
       tankGraphic.TankOneAngleRight(); 
       gameArea.repaint(); 
      } 
     }; 

     //these two lines are irrelevant. They match the irrelevant abstractaction. 
     gameArea.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put(KeyStroke.getKeyStroke("B"), "doNothing"); 
     gameArea.getActionMap().put("doNothing",doNothing); 

     //below is the code for the keybindings. 
     //the names are reversed, below. (fire1 corresponds to tank two, but the right side of the keyboard) 
     gameArea.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put(KeyStroke.getKeyStroke("LEFT"), "leftMove"); 
     gameArea.getActionMap().put("leftMove",leftMove); 
     gameArea.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put(KeyStroke.getKeyStroke("RIGHT"), "rightMove"); 
     gameArea.getActionMap().put("rightMove",rightMove); 
     gameArea.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put(KeyStroke.getKeyStroke("UP"), "angleLEFT"); 
     gameArea.getActionMap().put("angleLEFT",angleLEFT); 
     gameArea.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put(KeyStroke.getKeyStroke("DOWN"), "angleRIGHT"); 
     gameArea.getActionMap().put("angleRIGHT",angleRIGHT); 
     gameArea.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put(KeyStroke.getKeyStroke("A"), "leftMove2"); 
     gameArea.getActionMap().put("leftMove2",leftMove2); 
     gameArea.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put(KeyStroke.getKeyStroke("D"), "rightMove2"); 
     gameArea.getActionMap().put("rightMove2",rightMove2); 
     gameArea.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put(KeyStroke.getKeyStroke("W"), "angleLEFT2"); 
     gameArea.getActionMap().put("angleLEFT2",angleLEFT2); 
     gameArea.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put(KeyStroke.getKeyStroke("S"), "angleRIGHT2"); 
     gameArea.getActionMap().put("angleRIGHT2",angleRIGHT2); 
     //gameArea.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put(KeyStroke.getKeyStroke("E"), "fire2"); 
     //gameArea.getActionMap().put("fire2",fire2); 
     //gameArea.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put(KeyStroke.getKeyStroke("SLASH"), "fire1"); 
     //gameArea.getActionMap().put("fire1",fire1); 
     frame.requestFocus(); 

回答

1

看看Motion Using the Keyboard

KeyboardAnimation.java示例執行此操作。該課程展示了一種使用Key BindingsSwing Timer添加動畫的方法。每個鍵綁定可以控制不同的圖像和不同的定時器。

一個圖像由4個箭頭鍵控制,另一個由「a,d,w,s」鍵控制。

+0

根據你在鏈接中所做的事情,我認爲我可以將所有東西都堆棧在一個定時器中,並用一個for循環來檢查meow []數組中的每個值(我可能會更改它的名稱)並添加這些值(它們將是x,y座標),然後調用一個單獨的moveTank函數。每個動作只會調整meow []數組!哈哈!這非常聰明。看過這個後,我可以看到爲什麼我還需要「發佈密鑰」。時間重寫一些代碼...感謝Camickr! – Quibble