2013-01-05 30 views
1

我正在学习Java中的一些新东西并且有点困难 - 这是图形!下面我解释两个班级所做的事情。我现在的新障碍正在想出一种方法,通过只按Z来为球体(即:像激光那样的射弹)绘制不同的图像。Java图形如何在keyPressed中绘制图像

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

什么我迄今所做的写入包含我的程序的所有的键盘事件“游戏键盘”类中的嵌套类。

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

    } 

回答

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(...)); 
} 
+0

更加结构化的解决方案,我会尝试你的方法杰克。感谢这些简单而复杂的例子,它给了我足够的理由来让我思考你的方法。 =] – Nicholas