2014-04-16 2 views
0

Мои KeyListener и методы работают, но они ничего не делают. Когда я запускаю код и пытаюсь использовать клавиши со стрелками, ничего не происходит. У меня также есть другая проблема. Я делаю игру, и я уже сделал карту, но когда я вставляю карту, карта имеет приоритет и охватывает моего персонажа. Как я могу их исправить? Это пакет JFrame.KeyListener не работает и перекрывает символ карты

package MyGamePKG; 

import java.awt.BorderLayout; 

public class GameJFrame extends JFrame { 

private JPanel contentPane; 
private int x,y,x_vel,y_vel; 

/** 
* Launch the application. 
*/ 
public static void main(String[] args) { 
    EventQueue.invokeLater(new Runnable() { 
     public void run() { 
      try { 
       GameJFrame frame = new GameJFrame(); 
       frame.setVisible(true); 
      } catch (Exception e) { 
       e.printStackTrace(); 
      } 
     } 
    }); 
} 

/** 
* Create the frame. 
*/ 
public GameJFrame() { 


    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    setBounds(100, 100, 720, 520); 
    contentPane = new JPanel(); 
    contentPane.setBorder(new EmptyBorder(5, 5, 5, 5)); 
    setContentPane(contentPane); 
    contentPane.setLayout(null); 

    GameJPanel Jpanel = new GameJPanel(); 
    Jpanel.setBounds(0, 0, 720, 480); 
    contentPane.add(Jpanel); 
    Jpanel.setLayout(null); 




} 


} 

Это JPanel.

package MyGamePKG; 

import java.awt.BasicStroke; 

public class GameJPanel extends JPanel implements ActionListener, KeyListener { 

private int frameRate = 30; 
private int x=0; 
private int y=0; 
private int x_vel, y_vel; 
private Image map; 

/** 
* Create the panel. 
*/ 
public GameJPanel() { 
    new ImageIcon(getClass().getResource("/Resources/gamemap.png")); 
    gamemap = map.getImage(); //error here 
    this.addKeyListener(this); 
    this.setFocusable(true); 
    Timer timer = new Timer(30, this);  
    timer.start(); 


} 


} 

public void background() 
{ 
    ImageIcon icon = new ImageIcon(this.getClass().getResource("/Resources/gamemap.png")); 
    map = icon.getImage(); 
} 
@Override 
public void paintComponent(Graphics g) 
{ 
    super.paintComponent(g); 
    setBackground(Color.WHITE); 

    Graphics2D g2d = (Graphics2D) g; 

    RenderingHints rh = new RenderingHints(RenderingHints.KEY_ANTIALIASING, 
      RenderingHints.VALUE_ANTIALIAS_ON); 

    g2d.setRenderingHints(rh); 

    g2d.setColor(Color.green); 
    g2d.setStroke(new BasicStroke(5)); 


    myDrawBoxOvalsandRect(x,y,100,g2d); 
    myDrawArc(x+25,y+40,50,50,550,170,g2d); 
} // paintComponent 
public void myDrawBoxOvalsandRect(int x, int y, int scale, Graphics my_g) 
{ 
    my_g.setColor(Color.cyan); 
    my_g.fillOval(x, y, 100, 100); //face 

    my_g.setColor(Color.red); 
    my_g.fillOval(x+20, y+25, 15, 15); //left eye 

    my_g.setColor(Color.red); 
    my_g.fillOval(x+60, y+25, 15, 15); //right eye 

    my_g.setColor(Color.cyan); 
    my_g.fillRect(x+25,y+100,50,80);//body 

    my_g.setColor(Color.cyan); 
    my_g.fillRect(x-30,y+105,55,20); //left arm 

    my_g.setColor(Color.cyan); 
    my_g.fillRect(x+70, y+105, 60, 20); //right arm 

    my_g.setColor(Color.red); 
    my_g.fillOval(x-47, y+105, 20, 20); //left hand 

    my_g.setColor(Color.red); 
    my_g.fillOval(x+126,y+105,20,20); //right hand 

    my_g.setColor(Color.cyan); 
    my_g.fillRect(x+25, y+175, 20, 50); //left leg 

    my_g.setColor(Color.cyan); 
    my_g.fillRect(x+55,y+175,20,50); // right leg 

} 
public void myDrawArc(int x, int y, int height, int width, int angle1, int angle2, Graphics my_g) 
{ 
    my_g.setColor(Color.red); 
    my_g.drawArc(x, y, 50, 50, 550, 170); //happy face  
} 
@Override 
public void keyPressed(KeyEvent e) { 
    // TODO Auto-generated method stub 
    int c = e.getKeyCode(); 

    if(c == KeyEvent.VK_LEFT) 
    { 
     x_vel = -1; 
     y_vel = 0; 
    } 
    if(c == KeyEvent.VK_UP) 
    { 
     x_vel = 0; 
     y_vel = -1; 
    } 
    if(c == KeyEvent.VK_RIGHT) 
    { 
     x_vel = 1; 
     y_vel = 0; 
    } 
    if(c == KeyEvent.VK_DOWN) 
    { 
     x_vel = 0; 
     y_vel = 1; 
    } 
    repaint(); 

} 
@Override 
public void keyReleased(KeyEvent e) { 
    // TODO Auto-generated method stub 
    x_vel = 0; 
    y_vel = 0; 
    repaint(); 
} 
@Override 
public void keyTyped(KeyEvent e) { 
    // TODO Auto-generated method stub 

} 
@Override 
public void actionPerformed(ActionEvent e) { 
    // TODO Auto-generated method stub 
    if(x < 0) 
    { 
     x_vel = 0; 
     x = 0; 
    } 
    if(x > 720) 
    { 
     x_vel = 0; 
     x = 720; 
    } 
    if(y < 0) 
    { 
     y_vel = 0; 
     y = 0; 
    } 
    if(y > 480) 
    { 
     y_vel = 0; 
     y = 480; 
    } 
    x = x + x_vel; 
    y = y + y_vel; 
    repaint(); 

} 


} 

ответ

4

У вас есть несколько проблем, которые нужно иметь дело с

  1. Вы создали два набора переменных. Один набор в вашем фрейме и один набор в вашей панели. С помощью Keyalistener вы меняете только значения в кадре, которые не будут влиять на те, которые находятся на панели.

  2. Обновления пользовательского интерфейса должны быть выполнены в разделе «Диспетчер событий». Не используйте новую резьбу с while(true) и Thread.sleep(). Вместо этого используйте анимацию javax.swing.Timer. См. Больше на How to Use Swing Timers. Вы также видите кучу примеров here и here и here и here и here и here.

  3. Вы должны использовать привязку клавиш для ключевых действий, а не KeyListener. См. Больше на How to Use Key Bindings. Вы также можете увидеть простой пример here


Другие:

  • Почему вы использованием ActionListener, когда он не добавляется ни к чему?
  • Не используйте пустые макеты. Научитесь использовать LayoutManagers и дайте им сделать выбор и позиционирование для вас.
  • Для окрашенных панелей, вы должны переопределить getPreferredSize() установить предпочтительный размер для панели, и она будет соблюдена, когда вы pack() ваш кадр (как следует, вместо установки размера)
  • Не установить фон в методе краски. Сделайте это в конструкторе.

UPDATE

Вот полный код. Он отлично работает для меня

import java.awt.BasicStroke; 
import java.awt.Color; 
import java.awt.EventQueue; 
import java.awt.Graphics; 
import java.awt.Graphics2D; 
import java.awt.Image; 
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 javax.swing.ImageIcon; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 
import javax.swing.Timer; 
import javax.swing.border.EmptyBorder; 

public class GameFrame extends JFrame { 

    private JPanel contentPane; 

    /** 
    * Launch the application. 
    */ 
    public static void main(String[] args) { 
     EventQueue.invokeLater(new Runnable() { 
      public void run() { 
       try { 
        GameFrame frame = new GameFrame(); 
        frame.setVisible(true); 
       } catch (Exception e) { 
        e.printStackTrace(); 
       } 
      } 
     }); 
    } 

    /** 
    * Create the frame. 
    */ 
    public GameFrame() { 

     setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     setBounds(100, 100, 720, 520); 
     contentPane = new JPanel(); 
     contentPane.setBorder(new EmptyBorder(5, 5, 5, 5)); 
     setContentPane(contentPane); 
     contentPane.setLayout(null); 

     GameJPanel Jpanel = new GameJPanel(); 
     Jpanel.setBounds(0, 0, 720, 480); 
     contentPane.add(Jpanel); 
     Jpanel.setLayout(null); 

    } 
} 

class GameJPanel extends JPanel implements ActionListener, KeyListener { 

    private int frameRate = 30; 
    private int x = 0; 
    private int y = 0; 
    private int x_vel, y_vel; 
    private Image map; 

    /** 
    * Create the panel. 
    */ 
    public GameJPanel() { 
     map = new ImageIcon(getClass().getResource("/resources/gamemap.png")).getImage(); 
     this.addKeyListener(this); 
     this.setFocusable(true); 
     Timer timer = new Timer(30, this); 
     timer.start(); 
     /* 
     Thread myAnimationThread = new Thread() { 
      @Override 
      public void run() { 
       while (true) { 
        repaint(); // Refresh the display which calls paintComponent 
        try { 
         Thread.sleep(1000/frameRate); 
        } // try 
        catch (InterruptedException ex) { 
        } 
       } // while 
      } // run 
     }; // Thread 
     */ 
    } 

    @Override 
    public void paintComponent(Graphics g) { 
     super.paintComponent(g); 
     setBackground(Color.WHITE); 

     Graphics2D g2d = (Graphics2D) g; 

     RenderingHints rh = new RenderingHints(RenderingHints.KEY_ANTIALIASING, 
       RenderingHints.VALUE_ANTIALIAS_ON); 

     g2d.setRenderingHints(rh); 

     g2d.setColor(Color.green); 
     g2d.setStroke(new BasicStroke(5)); 


     g2d.drawImage(map, 0, 0, 720, 480, getParent()); 
     myDrawBoxOvalsandRect(x, y, 100, g2d); 
     myDrawArc(x + 25, y + 40, 50, 50, 550, 170, g2d); 
    } // paintComponent 

    public void myDrawBoxOvalsandRect(int x, int y, int scale, Graphics my_g) { 
     my_g.setColor(Color.cyan); 
     my_g.fillOval(x, y, 100, 100); // face 

     my_g.setColor(Color.red); 
     my_g.fillOval(x + 20, y + 25, 15, 15); // left eye 

     my_g.setColor(Color.red); 
     my_g.fillOval(x + 60, y + 25, 15, 15); // right eye 

     my_g.setColor(Color.cyan); 
     my_g.fillRect(x + 25, y + 100, 50, 80);// body 

     my_g.setColor(Color.cyan); 
     my_g.fillRect(x - 30, y + 105, 55, 20); // left arm 

     my_g.setColor(Color.cyan); 
     my_g.fillRect(x + 70, y + 105, 60, 20); // right arm 

     my_g.setColor(Color.red); 
     my_g.fillOval(x - 47, y + 105, 20, 20); // left hand 

     my_g.setColor(Color.red); 
     my_g.fillOval(x + 126, y + 105, 20, 20); // right hand 

     my_g.setColor(Color.cyan); 
     my_g.fillRect(x + 25, y + 175, 20, 50); // left leg 

     my_g.setColor(Color.cyan); 
     my_g.fillRect(x + 55, y + 175, 20, 50); // right leg 

    } 

    public void myDrawArc(int x, int y, int height, int width, int angle1, 
      int angle2, Graphics my_g) { 
     my_g.setColor(Color.red); 
     my_g.drawArc(x, y, 50, 50, 550, 170); // happy face 
    } 

    public void keyPressed(KeyEvent e) { 
     // TODO Auto-generated method stub 
     int c = e.getKeyCode(); 

     if (c == KeyEvent.VK_LEFT) { 
      x_vel = -1; 
      y_vel = 0; 
     } 
     if (c == KeyEvent.VK_UP) { 
      x_vel = 0; 
      y_vel = -1; 
     } 
     if (c == KeyEvent.VK_RIGHT) { 
      x_vel = 1; 
      y_vel = 0; 
     } 
     if (c == KeyEvent.VK_DOWN) { 
      x_vel = 0; 
      y_vel = 1; 
     } 
     repaint(); 

    } 

    public void keyReleased(KeyEvent e) { 
     // TODO Auto-generated method stub 
     x_vel = 0; 
     y_vel = 0; 
     repaint(); 
    } 

    public void keyTyped(KeyEvent e) { 
     // TODO Auto-generated method stub 

    } 

    public void actionPerformed(ActionEvent e) { 
     // TODO Auto-generated method stub 
     if (x < 0) { 
      x_vel = 0; 
      x = 0; 
     } 
     if (x > 720) { 
      x_vel = 0; 
      x = 720; 
     } 
     if (y < 0) { 
      y_vel = 0; 
      y = 0; 
     } 
     if (y > 480) { 
      y_vel = 0; 
      y = 480; 
     } 
     x = x + x_vel; 
     y = y + y_vel; 
     repaint(); 

    } 
} 
+0

Мы еще не узнали о Key Binding, таймерах, getPreferredSize() и пакетах. Есть ли другие альтернативы? – user3542484

+0

Я также попытался поставить keylistener в JPanel, но он не имел никакого эффекта. – user3542484

+0

Вы можете прочитать эти ссылки и узнать их самостоятельно и произвести впечатление на своего учителя :) Способы, которые я упомянул, являются правильными способами. Попробуйте их изучить. Поработайте над этим, и если вы застрянете где-нибудь в попытке, отредактируйте свой пост, и я буду рад помочь. –

Смежные вопросы