2016-07-06 8 views
-2

私は...次の行でグラフィックsetColorを上にNullPointerException()

p1.setColor(Color.green); 

コードにNullPointer例外を取得しています:arynaqは、Graphicsオブジェクトが値を与えれることはありません、言ったように

import java.awt.Color; 
import java.awt.Graphics; 
import java.awt.Image; 
import java.awt.color.ColorSpace; 
import java.awt.event.KeyEvent; 
import java.awt.event.KeyListener; 

import javax.swing.JFrame; 
import javax.swing.JPanel; 

public class Main extends JPanel implements KeyListener { 


    public int FRAME_WIDTH = 800, FRAME_HEIGHT = 650; 
    public Image screen; 

    //Player 1 
    public int x = 100; 
    public int y = 100; 
    public int px = 117; 
    public int py = 115; 
    public boolean up, down, right, left; 
    public Graphics p1; 

    //Player 2 
    public int x2 = 600; 
    public int y2 = 100; 
    public int px2 = 617; 
    public int py2 = 115; 
    public boolean up2, down2, right2, left2; 
    public Graphics p2; 

    public static void main(String[] args) { 
     JFrame frame = new JFrame("Game"); 
     Main main = new Main(); 
     frame.add(main); 
     frame.setSize(main.FRAME_WIDTH, main.FRAME_HEIGHT); 
     frame.setBackground(Color.BLACK); 
     frame.setVisible(true); 
     frame.setResizable(false); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     main.screen = frame.createImage(main.FRAME_WIDTH, main.FRAME_HEIGHT); 
     main.p1 = main.screen.getGraphics(); 
     main.p2 = main.screen.getGraphics(); 

     while(true) { 
      //Player 1 
      if(main.up = true) { 
       main.y+=2; 
      } 
      if(main.down = true) { 
       main.y-=2; 
      } 
      if(main.right = true) { 
       main.x+=2; 
      } 
      if(main.left = true) { 
       main.x-=2; 
      } 

      //Player 2 
      if(main.up2 = true) { 
       main.y2+=2; 
      } 
      if(main.down2 = true) { 
       main.y2-=2; 
      } 
      if(main.right2 = true) { 
       main.x2+=2; 
      } 
      if(main.left2 = true) { 
       main.x2-=2; 
      } 

      frame.repaint(); 
      try { 
       Thread.sleep(20); 
      } catch (InterruptedException e) { 
       e.printStackTrace(); 
      } 
     } 

    } 

    @Override 
    public void paintComponent(Graphics g) { 
     String player1 = "Player 1"; 
     String player2 = "Player 2"; 
     p1.setColor(Color.green); 
     p2.setColor(Color.green); 
     p1.drawString(player1, x, y); 
     p2.drawString(player2, x2, y2); 
     p1.setColor(Color.red); 
     p2.setColor(Color.red); 
     p1.fillOval(px, py, 5, 5); 
     p2.fillOval(px2, py2, 5, 5); 
     g.drawImage(screen, 0, 0, this); 
    } 

    @Override 
    public void keyPressed(KeyEvent e) { 

     //Player 1 
     if(e.getKeyCode() == KeyEvent.VK_W) { 
      up = true; 
     } 
     if(e.getKeyCode() == KeyEvent.VK_S) { 
      down = true; 
     } 
     if(e.getKeyCode() == KeyEvent.VK_D) { 
      right = true; 
     } 
     if(e.getKeyCode() == KeyEvent.VK_A) { 
      left = true; 
     } 


     //Player 2 
     if(e.getKeyCode() == KeyEvent.VK_UP) { 
      up2 = true; 
     } 
     if(e.getKeyCode() == KeyEvent.VK_DOWN) { 
      down2 = true; 
     } 
     if(e.getKeyCode() == KeyEvent.VK_RIGHT) { 
      right2 = true; 
     } 
     if(e.getKeyCode() == KeyEvent.VK_LEFT) { 
      left2 = true; 
     } 
    } 

    @Override 
    public void keyReleased(KeyEvent e) { 

     //Player 1 - Release 
     if(e.getKeyCode() == KeyEvent.VK_W) { 
      up = false; 
     } 
     if(e.getKeyCode() == KeyEvent.VK_S) { 
      down = false; 
     } 
     if(e.getKeyCode() == KeyEvent.VK_D) { 
      right = false; 
     } 
     if(e.getKeyCode() == KeyEvent.VK_A) { 
      left = false; 
     } 

     //Player 2 - Release 
     if(e.getKeyCode() == KeyEvent.VK_UP) { 
      up2 = false; 
     } 
     if(e.getKeyCode() == KeyEvent.VK_DOWN) { 
      down2 = false; 
     } 
     if(e.getKeyCode() == KeyEvent.VK_RIGHT) { 
      right2 = false; 
     } 
     if(e.getKeyCode() == KeyEvent.VK_LEFT) { 
      left2 = false; 
     } 


    } 

    @Override 
    public void keyTyped(KeyEvent e) { 

    } 

} 
+0

@azu refrog私は 'main.p1 = main.screen.getGraphics();'を使って 'p1'に値を与えるつもりであると仮定しています。重複したフラグがここでは適切ではないと思います。なぜなら、この問題は、なぜ彼が 'p1'に値を割り当てるために使用しようとしたメソッドが、値を割り当てるために働いていないのかということです。 – nhouser9

+1

画面オブジェクトに値が割り当てられることはありません。それはnullです。あなたがフレームを表示するように設定したのでmain.screenからグラフィックスオブジェクトを作成しようとする前にpaintcomponentが実際に呼び出されていると思います。その時点でNPEを取得します。 – arynaq

+0

それは例外なく、私のために働く! –

答えて

1

を、それを初期化する必要がありますが、キーリスナーの問題ではこれを解決するには、フレームにキーリスナーを追加する必要があります。

frame.addKeyListener(this); 
関連する問題