如何避免形状超出java中的框架边框

时间:2016-02-12 01:24:30

标签: java swing animation

我有这个程序,按箭头键时它超出了框架。但是我希望在超过边界时形状会反弹。任何人都可以帮助我。

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

1 个答案:

答案 0 :(得分:3)

使用类似

的范围检查
if (xLocation + 100 >= getWidth()) { 
    xLocation = getWidth() - 100;
} else if (xLocation < 0) {
    xLocation = 0;
}

你应该为yLocation

做同样的事情

一般来说,你应该有一个主/游戏循环,负责更新游戏的当前状态(根据输入的当前状态和其他要求(如幽灵的AI))并安排更新UI。

这样,您可以在键处理程序中设置一个标志,主/游戏循环将检查该标志,更新播放器的状态以及重绘的计划。这克服了第一次按键事件和重复事件之间延迟的固有问题。

我还考虑在KeyListener上使用密钥绑定API。

或许,请查看How to Use Key BindingsHow to use Swing TimersHow to eliminate delay in keyPress?了解更多想法