2013-06-12 25 views
1

我正在創建一個使用事件驅動編程和動態運動(對於導彈等)組合驅動的飛行模擬器。目前,我有一個使用keyListener接口和非常嘲諷的if-else命令結構的單人遊戲。如果我按下一個按鍵,這將起作用,但如果我按下第二個按鍵,則第一個按鍵執行的操作將停止。我試圖用鍵綁定來解決這個問題,但是,我使用快速的GUI來創建遊戲窗口,並且找不到將keyBindings直接應用於BreezyGUI框架的方法。我也避免嘗試將按鍵綁定到按鈕和文本字段,因爲它們可能會造成焦點問題。在Java中集成BreezyGUI和控制鍵

有沒有辦法將KeyBindings直接綁定到BreezyGUI框架,如果沒有,我該如何繼續?如果我的解釋不充分,請參閱下面的縮略代碼。

import java.awt.*;  
import BreezyGUI.*; 
import java.io.* ; 
import java.util.Scanner; 
import java.awt.event.*; 
import javax.swing.*; 
import java.util.ArrayList; 
import java.lang.Math; 
import java.awt.image.BufferedImage; 
import java.awt.Container; 
import javax.swing.JComponent; 
import javax.swing.Action; 



public class fltsm extends GBFrame implements KeyListener 
{ 
    private static int fps = 0; 
    private static int score = 0; 
    private final int TIMER_DELAY = 100; //milliseconds 
    private static final int KEY_DOWN = 40; // KEYCODES 
    private static final int KEY_UP = 38; 
    private static final int KEY_RIGHT = 39; 
    private static final int KEY_LEFT = 37; 
    private static final int KEY_SPACE = 32; 
    private static final int KEY_0 = 48; 
    private static final int KEY_1 = 49; 
    private static final int KEY_2 = 50; 
    private static final int KEY_3 = 51; 
    private static final int KEY_4 = 52; 
    private static final int KEY_5 = 53; 
    private static final int KEY_6 = 54; 
    private static final int KEY_ENTER = 10; 
    private static final int SCREEN_LENGTH = 1000; 
    private static final int SCREEN_HEIGHT = 600; 
    private static String keyWord; 
    private static String commandString = ""; // When the user types in alphabetic keys, they are added to this String and matched to a list if executable commands. 
    boolean timerStarted = false; 
    boolean keyListenerAdded = false; 
    boolean calledByEvent = true; 
    boolean KeyPressed = false; 
    boolean drawFPS = false; 
    int kCode = 0; 
    KeyEvent event = null; // helps clear out unwanted keyListeners(see object Listener class below) 

    private static ArrayList<Missile> miss = new ArrayList<Missile>(); 
    private static ArrayList<Missile> Co = new ArrayList<Missile>(); 
    World w1 = new World(SCREEN_LENGTH,SCREEN_HEIGHT); 
    Plane flyer = new Plane(); 
    Timer t; 



public void paint(Graphics g) 
{ 
    if (drawFPS == true) 
     fps++; 

    if (Plane.getPlanes().indexOf(flyer) == - 1) // Until I find a better solution... 
    {  
     Plane.addPlane(flyer); 
    } 

    addKeyListener (this); 
    Plane.processPlanes(g); 
    PlaneMissile.processMissiles(g, w1, calledByEvent); 
    BotMissile.processMissiles(g, w1, calledByEvent, flyer); 
    TrackingBot.processBots(g, w1, flyer); 
    DeathLaser.processLasers(g, flyer); 
    ScanningLaser.processLasers(g, flyer); 
    EMP.processEMPs(g, flyer); 
    Wall.processWalls(g, w1, flyer); 

    drawStatBox(g, flyer); 
}  

public static void normalizeGraphics() 
{ 
    GraphicsEnvironment env = GraphicsEnvironment.getLocalGraphicsEnvironment(); 
    GraphicsDevice device = env.getDefaultScreenDevice(); 
    GraphicsConfiguration config = device.getDefaultConfiguration(); 
    BufferedImage buffy = config.createCompatibleImage(SCREEN_LENGTH, SCREEN_HEIGHT, Transparency.TRANSLUCENT); 
} 


public static void main (String[ ] args) 
{ 
     //normalizeGraphics(); 
     Frame frm = new fltsm(); 
     frm.setSize (SCREEN_LENGTH, SCREEN_HEIGHT); 
     frm.setTitle("Flight Simulator"); 
     frm.setVisible(true); 

} 



public void keyPressed(KeyEvent event) 
{  
    kCode = event.getKeyCode(); 
    keyWord = String.valueOf(kCode); 

    if (timerStarted == false) 
    { 
     ObjectListener x = new ObjectListener(); 
     t = new Timer(TIMER_DELAY, x); 
     t.start(); 
     timerStarted = true; 
    } 

} 
public void keyTyped (KeyEvent event) 
{ 
    removeKeyListener(this); // removes unwanted keyListeners (this method cannot be called in the ObjectListener class) 
} 

public void keyReleased (KeyEvent event) 
{ 
} 

public KeyEvent getEvent() 
{ 
    return event; 
} 


class ObjectListener implements ActionListener // Called to process objects that move on the screen 
{          // regardless of whether a key is pressed. 
    public void actionPerformed(ActionEvent event) 
    { 
     keyTyped(getEvent()); // This line clears out the unwanted keylisteners, which would otherwise build up everytime the paint() method is called. 
     repaint(); 
     calledByEvent = false; 
    }  
}  




}  

` I 

----------------- UPDATE ------------------------- ------------

以下Hovercraft的答案我把這段代碼放在我的paint方法中。它似乎沒有工作。

if (Plane.getPlanes().indexOf(flyer) == - 1) // Until I find a better solution... 
     {  
      Plane.addPlane(flyer); 
      JPanel panel = new JPanel(); 
      add(panel); 
      panel.getInputMap().put(KeyStroke.getKeyStroke("1", "doSomething"); 
      panel.getActionMap().put("doSomething", new anAction()); 

     } 

class anAction extends AbstractAction 
{           
    public void actionPerformed(ActionEvent event) 
    { 
     TrackingBot.botMania(); 
    }  
}  

回答

2

我不使用BreezyGUI,但現在看來,在GBFrame擴展java.awt.Frame中,AWT組件,因此按鍵綁定不能連接到它,因爲你只能將它們附加到Swing組件 - 即從JComponent派生的類。

我不確定這是否允許,但如果你添加一個JPanel或其他JComponent到GUI,你可以嘗試附加鍵綁定到它。

+0

謝謝,我會試試看。 –

0

不知何故,我修好了它。我改變的唯一兩件事是代碼的位置和添加方法。我使用「this.add()」而不是「add()」,並將代碼放在構造函數中,而不是放在paint方法中。