2013-10-27 4 views
0

Так что я пытаюсь создать игру Roguelike с процедурной генерацией и т. Д. Но у меня проблемы с обработкой символов. Дело в том, что когда я хочу перемещать персонажа с помощью клавиатуры, он меняет только свои координаты - что он должен делать, конечно, но я не вижу его на экране. Я прочитал несколько ответов на этом сайте, и это помогло мне немного, но это не решило проблему полностью.
Таким образом, я уверен, что, обратите внимание, что я делаю не так, вот немного коды (надеюсь, что это не слишком долго):JPanel не обновляется после KeyPressed

public class PanelTest extends JPanel implements KeyListener{ 


    private static final long serialVersionUID = 1L; 
    private Game game; 
    private int width, height; 
    private int tileSize; 

    public PanelTest(Game game, int tileSize) { 
     super(); 

     this.game = game; 
     this.tileSize = tileSize; 
     this.width = game.getMap().getWidth()*tileSize; 
     this.height = game.getMap().getHeight()*tileSize; 

     this.addKeyListener(this); 

     setPreferredSize(new Dimension(width, height)); 
     setRequestFocusEnabled(true); 
     requestFocus(); 
     setVisible(true); 

    } 

    public void paintComponent(Graphics g){ 
     super.paintComponent(g); 
     for(int i=0; i < game.getMap().getWidth(); i++){ 
      for(int j=0; j < game.getMap().getHeight(); j++){ 
       g.setColor(game.getMap().getColor(i,j)); 
       g.fillRect(i*tileSize, j*tileSize, tileSize, tileSize); 
      } 
     } 
// print the correct coordinates 
     System.out.println(game.getPlayer().getX()+" "+game.getPlayer().getY()); 
    } 

    @Override 
    public void keyPressed(KeyEvent e) { 
     // TODO Auto-generated method stub 
     switch(e.getKeyCode()){ 
     case(KeyEvent.VK_Z) : game.getPlayer().moveUp();break; 
     case(KeyEvent.VK_S) : game.getPlayer().moveDown(); break; 
     case(KeyEvent.VK_Q) : game.getPlayer().moveLeft(); break; 
     case(KeyEvent.VK_D) : game.getPlayer().moveRight(); break; 
     } 
     revalidate(); 
     repaint(); 

    } 

    public void addNotify() { 
     super.addNotify(); 
     requestFocus(); 
    } 

    @Override 
    public void keyReleased(KeyEvent e) { 
     // TODO Auto-generated method stub 

    } 

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

    } 

    public static void main(String[] args){ 
     JFrame frame = new JFrame(); 
     frame.setBounds(0, 0, 400, 400); 

     Map map = MapFactory.createNewEmptyMap(); 
     RoomMaker rm = new RoomMaker(map.getWidth()/7,map); 
     TunnelMaker tm = new TunnelMaker(rm, map); 
     rm.carveOut(); 
     tm.carveOut(); 
     Room r = rm.getRandomRoom(); 
     Player p = new Player(map, r.getxCenter(),r.getyCenter()); 
     Game game = new Game(map,p); 

     frame.getContentPane().add(new PanelTest(game, 10)); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.pack(); 
     frame.setVisible(true); 
    } 


} 

Надеется, что вы можете помочь, спасибо!

ответ

1

По умолчанию JPanel использует FlowLayout.

Похоже, что ваш код меняет положение игроков, но затем вы вызываете revalidate(), из-за чего вызывается код менеджера компоновки, и местоположение вашего компонента пересчитывается снова.

Для игр, в которых у вас есть случайное перемещение, вы хотите использовать нулевой макет, и вам не нужно вызывать revalidate() и repaint(), так как ваш код не отвечает за вызов метода setLocation() напрямую.

См. Также Motion Using the Keyboard проблемы с использованием keyListener.

setRequestFocusEnabled(true); 
requestFocus(); 
setVisible(true); 

Вышеупомянутый не требуется. Два свойства, для которых вы устанавливаете true по умолчанию, равны true. Вы не можете запросить фокус на компоненте, если компонент не отображается в видимом графическом интерфейсе, поэтому добавление этого кода здесь ничего не делает. Кроме того, правильным способом использования будет requestFocusInWindow(), а не requestFocus().

+0

Спасибо, что помогло мне лучше понять, как все это работает. Я также понял, что я напортачил свое движение персонажа, я действительно не просил его двигаться по экрану. Но все равно спасибо! – 4Mechanix

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