2013-10-27 2 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()를 호출하면 레이아웃 관리자 코드가 호출되고 구성 요소의 위치가 다시 계산됩니다.

무작위 움직임이있는 게임의 경우 null 레이아웃을 사용하고 코드에서 setLocation() 메서드를 직접 호출 할 책임이 없기 때문에 revalidate() 및 repaint()를 호출 할 필요가 없습니다.

keyListener 사용시 문제가있는 경우 Motion Using the Keyboard도 참조하십시오.

위의 사항은 필요하지 않습니다. true로 설정하는 두 속성은 true로 기본 설정됩니다. 구성 요소가 눈에 보이는 GUI에 표시되지 않는 한 구성 요소에 포커스를 요청할 수 없기 때문에 여기에 해당 코드를 추가하면 아무런 효과가 없습니다. 또한 requestFocus()가 아니라 requestFocusInWindow()를 사용하는 것이 좋습니다.

+0

감사합니다. 덕분에 모든 것이 어떻게 작동하는지 더 잘 이해할 수있었습니다. 나는 또한 내가 캐릭터 움직임을 망쳤다는 것을 깨달았지만, 화면에서 움직이기를 정말로 요구하지는 않았다. 어쨋든 고마워! – 4Mechanix

관련 문제