1

我正在学习 Java 中一些新的但有些困难的东西——图形!下面我解释一下这两个类的作用。我现在的新障碍是想出一种方法,只需按下 Z 即可为来自球的(即:像激光一样的射弹)绘制不同的图像。

问题是如果我在包含“KeyEvent.VK_Z”的if语句中编写一个方法例如:“g.drawImage(laser,laser_dx,laser_dy,this),我的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();
        }

    }
4

1 回答 1

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(...));
}
于 2013-01-05T03:10:20.890 回答