2015-01-08 2 views
0

Я довольно новичок в программировании, но я любопытно и хочу узнать больше. В настоящее время я пытаюсь сделать очень простую программу, где я могу перемещать 2-мерный шар вокруг экрана. Однако в настоящее время я должен использовать кнопки в программе для перемещения мяча. Я хотел бы иметь возможность использовать WASD или такой. Я искал этот сайт, но не нашел достаточно простого. Мой вопрос на самом деле довольно простой - как я могу это сделать, когда я нажимаю клавишу, например, W, мяч перемещается в этом направлении (или какое-либо событие, которое я добавляю к нему)? Я видел что-то вроде этого на этом сайте: (g.getKeyCode() == KeyEvent.VK_LEFT)Как подключить WASD-ключи к специальным событиям?

Однако вышеописанный код не работает, чтобы заставить мяч перемещаться. Есть ли простой код для подключения нажатой клавиши и события? Обратите внимание, что я использую NetBeans.

Ниже вы можете увидеть описание того, что я пытаюсь работать с (и который не работает):

EDIT: Для clerify, здесь есть весь код, я работаю с, в качестве примера:

package gamePanel; 
    import java.awt.Color; 
    import java.awt.Graphics; 

    public class GamePanel extends javax.swing.JPanel { 


public GamePanel() { 
    initComponents(); 
} 

@SuppressWarnings("unchecked") 
// <editor-fold defaultstate="collapsed" desc="Generated Code">       
private void initComponents() { 

    btnUp = new javax.swing.JButton(); 
    btnDown = new javax.swing.JButton(); 
    btnLeft = new javax.swing.JButton(); 
    btnRight = new javax.swing.JButton(); 

    btnUp.setText("Up"); 
    btnUp.addActionListener(new java.awt.event.ActionListener() { 
     public void actionPerformed(java.awt.event.ActionEvent evt) { 
      btnUpActionPerformed(evt); 
     } 
    }); 

    btnDown.setText("Down"); 
    btnDown.addActionListener(new java.awt.event.ActionListener() { 
     public void actionPerformed(java.awt.event.ActionEvent evt) { 
      btnDownActionPerformed(evt); 
     } 
    }); 

    btnLeft.setBackground(new java.awt.Color(140, 140, 140)); 
    btnLeft.setText("Left"); 
    btnLeft.addActionListener(new java.awt.event.ActionListener() { 
     public void actionPerformed(java.awt.event.ActionEvent evt) { 
      btnLeftActionPerformed(evt); 
     } 
    }); 

    btnRight.setBackground(new java.awt.Color(140, 140, 140)); 
    btnRight.setText("Right"); 
    btnRight.addActionListener(new java.awt.event.ActionListener() { 
     public void actionPerformed(java.awt.event.ActionEvent evt) { 
      btnRightActionPerformed(evt); 
     } 
    }); 

    javax.swing.GroupLayout layout = new javax.swing.GroupLayout(this); 
    this.setLayout(layout); 
    layout.setHorizontalGroup(
     layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) 
     .addGroup(layout.createSequentialGroup() 
      .addGap(84, 84, 84) 
      .addComponent(btnLeft, javax.swing.GroupLayout.PREFERRED_SIZE, 59, javax.swing.GroupLayout.PREFERRED_SIZE) 
      .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) 
      .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false) 
       .addComponent(btnUp, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) 
       .addComponent(btnDown, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) 
      .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) 
      .addComponent(btnRight) 
      .addContainerGap(129, Short.MAX_VALUE)) 
    ); 
    layout.setVerticalGroup(
     layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) 
     .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup() 
      .addContainerGap(238, Short.MAX_VALUE) 
      .addComponent(btnUp) 
      .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) 
      .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) 
       .addComponent(btnDown) 
       .addComponent(btnLeft) 
       .addComponent(btnRight)) 
      .addGap(10, 10, 10)) 
    ); 
}// </editor-fold>       

int x = 0; 
int y = 0; 

private void btnUpActionPerformed(java.awt.event.ActionEvent evt) {          

    y -= 10; 
    repaint(); 
}          

private void btnDownActionPerformed(java.awt.event.ActionEvent evt) {           

    y += 10; 
    repaint(); 
}          

private void btnLeftActionPerformed(java.awt.event.ActionEvent evt) {           

    x -= 10; 
    repaint(); 
}          

private void btnRightActionPerformed(java.awt.event.ActionEvent evt) {           

    x += 10; 
    repaint(); 
}           

protected void paintComponent(Graphics g){ 
    super.paintComponent(g); 

    g.setColor(Color.BLACK); 
    g.fillOval(x, y, 25, 25); 
} 


// Variables declaration - do not modify      
private javax.swing.JButton btnDown; 
private javax.swing.JButton btnLeft; 
private javax.swing.JButton btnRight; 
private javax.swing.JButton btnUp; 
// End of variables declaration     

}

+0

попробуйте с 'KeyListener' – MightyPork

+0

Что такое' g'? И какой метод содержит упомянутый код? – Christian

+0

'KeyListener' .. Существует множество руководств и примеров из« He-Who-Must-Not-Be-Named »(AKA Google) –

ответ

1

использования привязок клавиш. Вот метод из одного из моих приложений Swing. Я привязал ключи к JPanel (gridPanel), но вы можете привязать их к любому компоненту Swing, который вы хотите.

private void setKeyBindings() { 
    InputMap inputMap = 
      gridPanel.getInputMap(JPanel.WHEN_IN_FOCUSED_WINDOW); 
    inputMap.put(KeyStroke.getKeyStroke("W"), "up arrow"); 
    inputMap.put(KeyStroke.getKeyStroke("S"), "down arrow"); 
    inputMap.put(KeyStroke.getKeyStroke("A"), "left arrow"); 
    inputMap.put(KeyStroke.getKeyStroke("D"), "right arrow"); 

    inputMap.put(KeyStroke.getKeyStroke("UP"), "up arrow"); 
    inputMap.put(KeyStroke.getKeyStroke("DOWN"), "down arrow"); 
    inputMap.put(KeyStroke.getKeyStroke("LEFT"), "left arrow"); 
    inputMap.put(KeyStroke.getKeyStroke("RIGHT"), "right arrow"); 

    inputMap = gridPanel.getInputMap(JPanel.WHEN_FOCUSED); 
    inputMap.put(KeyStroke.getKeyStroke("UP"), "up arrow"); 
    inputMap.put(KeyStroke.getKeyStroke("DOWN"), "down arrow"); 
    inputMap.put(KeyStroke.getKeyStroke("LEFT"), "left arrow"); 
    inputMap.put(KeyStroke.getKeyStroke("RIGHT"), "right arrow"); 


    gridPanel.getActionMap().put("up arrow", 
      new UpArrowAction(this, model)); 
    gridPanel.getActionMap().put("down arrow", 
      new DownArrowAction(this, model)); 
    gridPanel.getActionMap().put("left arrow", 
      new LeftArrowAction(this, model)); 
    gridPanel.getActionMap().put("right arrow", 
      new RightArrowAction(this, model)); 
} 

Все приложение Java Swing для можно найти в моей статье 2048 Game in Java Swing.

0

Как и другие уже говорили в комментариях, вы можете использовать KeyListener (см here для более подробной информации) типа event listener так:

myJPanel.addKeyListener(new KeyListener() { 
    @Override 
    public void keyPressed(KeyEvent e) { 
     if (e.getKeyCode() == KeyEvent.VK_UP){ 
      myBall.y -= 10; 
      myJPanel.repaint(); 
     } 
     if(e.getKeyCode() == KeyEvent.VK_DOWN) { 
      myBall.y += 10; 
      myJPanel.repaint(); 
     } 
     ... 
    } 
}); 

В приведенном выше примере предполагается, что вы уже создали JPanel объект (myJPanel), который вы добавили/добавили в ваш общий графический контекст (например, пример JFrame). Он также делает предположение, что ваш основной объект canvas myJPanel, , т. Е., что вы будете добавлять (и рисовать) свой объект myBall на этот конкретный холст.

Постарайтесь выяснить остальную часть со стрелками (справа, слева и т. Д.) Самостоятельно (Подсказка: следуйте приведенному рисунку!).

PS. Также обратите внимание, что для того, чтобы ваш шар действительно был вытягиван (и обновлен) на холсте, вам нужно указать ожидаемое поведение myJPanel.repaint() (метод, который мы использовали в предыдущем фрагменте кода). Для этого вам необходимо переопределить метод JPanel#paintComponent(..) при определении вашего холста myJPanel, , например. что-то вроде следующего:

JPanel myJPanel = new JPanel() { 
    public static final long serialVersionUID = 1L; 

    @Override 
    public void paintComponent(Graphics g) { 
     super.repaint(g); 
     Graphics2D g2D = (Graphics2D)g; 
     g2D.setColor(Color.GREEN); 
     g2D.fill(myBall); 
    } 
} 

, который в свою очередь, предполагает, что ваш myBall был создан с использованием класса Ellipse2D (см here), включенный в Java 2D API.Например:

Ellipse2D.Double myBall = new Ellipse2D.Double(100, 100, 10, 10); 

Мальчик, этот пост получился длинным :) однако он должен содержать всю необходимую информацию, чтобы ваша базовая имитация работала. Удачи!

+0

Спасибо. :) Надеюсь, я смогу чему-то научиться. – fr15827