Java Graphics如何在keyPressed中绘制图像

时间:2013-01-05 02:55:17

标签: java graphics paint

我正在学习一些新的,在Java中有些困难 - 这是图形!下面我解释两个类的作用。我现在的新障碍是想出一种方法,通过仅按Z来绘制不同的图像(即:像激光一样的射弹)。

问题是如果我编写一个方法,例如:“g.drawImage(laser,laser_dx,laser_dy,this)在包含”KeyEvent.VK_Z“的if语句中,我的keyPressed方法突然说”这个方法是不在当地使用“。我有什么办法来解决这个障碍?

到目前为止我所做的是在“GameBoard”类中编写了一个嵌套类,其中包含我程序的所有键盘事件。

       private class Adapter extends KeyAdapter
       {

                public void keyPressed(KeyEvent e)
            {
                int keyCode = e.getKeyCode();
                if(keyCode == KeyEvent.VK_RIGHT)
                {
                    ball_dx += ball_velocity;

                }
                if(keyCode == KeyEvent.VK_LEFT)
                {
                    ball_dx -= ball_velocity;
                }
                if(keyCode == KeyEvent.VK_Z){

                }

            }

        }

这是一个名为“Gameboard”的单独类中的绘图图形方法:这个类只绘制一个绿球(这是一个.png图像)的图像,它可以用箭头键左右移动!

    public class GameBoard extends JPanel implements ActionListener
    {

        public void paintComponent(Graphics g)
            {

            super.paintComponent(g);

            g.drawImage(ball, ball_dx, ball_dy, this);

            Toolkit.getDefaultToolkit().sync();

        }

        public void actionPerformed(ActionEvent arg0) 
        {

            repaint();
        }

    }

1 个答案:

答案 0 :(得分:3)

你必须重新考虑逻辑:处理关键事件的代码和绘制所有内容的代码应该共享一个状态,以便

  • 事件设置状态
  • 图纸根据状态而变化

只是为了简单起见并给你一个想法:

boolean isLaser = false;

public void keyPressed(KeyEvent e) {
  isLaser = true;
}

public void keyReleased(KeyEvent e) {
  isLaser = false;
}

public void paintComponent(Graphics g) {
  if (isLaser)
    // do something
}

当然,在更复杂的环境中,您将拥有更加结构化的解决方案,例如

List<Entity> entities = new ArrayList<Entity>();

public void paintComponent(Graphics g) {
  for (Entity e : entities)
    e.draw(g);
}

public void keyPressed() {
  entities.add(new LaserEntity(...));
}