我有这个程序,按箭头键时它超出了框架。但是我希望在超过边界时形状会反弹。任何人都可以帮助我。
{
JFrame frame = new JFrame("PacMan");
PacManObject panel = new PacManObject();
panel.setFocusable(true);
panel.setRequestFocusEnabled(true);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setSize(600,600);
frame.setVisible(true);
frame.add(panel);
panel.addKeyListener(panel);
}
public static void main(String[] args) {
Runnable runnable = new Runnable(){
@Override
public void run() {
new PacMan();
}
};EventQueue.invokeLater(runnable);
}
class PacManObject extends JPanel implements KeyListener{
private int xLocation = 100;
private int yLocation = 100;
private int mouth = 280;
private int angle = 45;
private int xrandomLocation = 300;
private int yrandomLocation = 400;
private int xLocationEyes = 115;
private int yLocationEyes = 115;
我绘制形状的地方
@Override
public void paintComponent(Graphics graphics)
{
super.paintComponent(graphics);
//pacman
graphics.setColor(Color.yellow);
graphics.fillArc(xLocation, yLocation, 100, 100, angle, mouth);
//eyes
graphics.setColor(Color.BLACK);
graphics.fillOval(xLocationEyes, yLocationEyes, 20, 20);
food(graphics);
}
按箭头键
@Override
public void keyPressed(KeyEvent keyboard) {
int keyboardPress = keyboard.getKeyCode();
if(keyboardPress == KeyEvent.VK_RIGHT){
xLocation += 30;
xLocationEyes += 30;
angle = 45;
repaint();
}
else if(keyboardPress == KeyEvent.VK_LEFT){
angle = -145;
xLocation -= 30;
xLocationEyes -= 30;
repaint();
}
}
答案 0 :(得分:3)
使用类似
的范围检查if (xLocation + 100 >= getWidth()) {
xLocation = getWidth() - 100;
} else if (xLocation < 0) {
xLocation = 0;
}
你应该为yLocation
一般来说,你应该有一个主/游戏循环,负责更新游戏的当前状态(根据输入的当前状态和其他要求(如幽灵的AI))并安排更新UI。
这样,您可以在键处理程序中设置一个标志,主/游戏循环将检查该标志,更新播放器的状态以及重绘的计划。这克服了第一次按键事件和重复事件之间延迟的固有问题。
我还考虑在KeyListener
上使用密钥绑定API。
或许,请查看How to Use Key Bindings,How to use Swing Timers和How to eliminate delay in keyPress?了解更多想法