【问题标题】:How to avoid shape exceeding the border of frame in java如何避免在java中超出框架边框的形状
【发布时间】:2016-02-12 10:23:05
【问题描述】:

我有这个程序,当按下箭头键时,它会超出框架。但是,我希望形状在超出该边界时反弹。谁能帮我解决这个问题。

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

【问题讨论】:

    标签: java swing animation


    【解决方案1】:

    进行范围检查,使用类似

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

    你应该为yLocation做同样的事情

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

    这样,您将在您的密钥处理程序中设置一个标志,主/游戏循环将检查该标志,更新玩家的状态并安排重绘。这克服了第一次按键事件和重复事件之间延迟的固有问题。

    我还考虑使用KeyListener 上的键绑定 API。

    也许,看看How to Use Key BindingsHow to use Swing TimersHow to eliminate delay in keyPress? 以获得更多想法

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-07-10
      • 1970-01-01
      • 2015-07-29
      • 1970-01-01
      • 1970-01-01
      • 2016-04-08
      • 2022-10-14
      • 2021-02-28
      相关资源
      最近更新 更多