gpt4 book ai didi

java - 按键后 JPanel 不更新

转载 作者:行者123 更新时间:2023-12-01 13:56:01 25 4
gpt4 key购买 nike

所以我正在尝试制作一款具有程序生成等功能的 Roguelike 游戏。但我在角色处理方面遇到了麻烦。问题是,当我想用​​键盘移动角色时,它只是改变它的坐标 - 它当然应该这样做,但我在屏幕上看不到它。我在这个网站上阅读了一些答案,这对我有一点帮助,但并没有完全解决问题。
所以,我确定我做错了什么,这里有一些代码(希望它不会太长):

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);
}


}

希望您能帮忙,谢谢!

最佳答案

默认情况下,JPanel 使用 FlowLayout。

看起来您的代码正在更改玩家位置,但随后您调用 revalidate() ,这会导致调用布局管理器代码并再次重新计算组件的位置。

因此,对于随机移动的游戏,您希望使用空布局,并且不需要调用 revalidate() 和 repaint(),因为您的代码不负责直接调用 setLocation() 方法。

另请参阅Motion Using the Keyboard对于使用 keyListener 的问题。

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

上面的内容是不需要的。您设置为 true 的两个属性默认为 true。除非该组件显示在可见的 GUI 上,否则您无法请求将焦点放在该组件上,因此在此处添加该代码不会执行任何操作。另外,正确使用的方法是 requestFocusInWindow(),而不是 requestFocus()。

关于java - 按键后 JPanel 不更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19623452/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com