2016-02-12 71 views
0

我有这个程序,当按箭头键时,它超过了框架。但是,我希望形状在超出边界时反弹回来。谁可以帮我这个事。如何避免形状超过java框架的边框

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

回答

3

放在距离检查它采用类似

if (xLocation + 100 >= getWidth()) { 
    xLocation = getWidth() - 100; 
} else if (xLocation < 0) { 
    xLocation = 0; 
} 

你应该这样做同样的事情

一般来说,你应该有一个主/游戏循环,负责更新游戏的当前状态(基于输入和其他要求的当前状态(如幽灵的AI))和时间表更新到用户界面。

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

我也考虑使用KeyListener以上的密钥绑定API。

也许,看看How to Use Key BindingsHow to use Swing TimersHow to eliminate delay in keyPress?一些更多的想法