-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) {
}
}
@azu refrog私は 'main.p1 = main.screen.getGraphics();'を使って 'p1'に値を与えるつもりであると仮定しています。重複したフラグがここでは適切ではないと思います。なぜなら、この問題は、なぜ彼が 'p1'に値を割り当てるために使用しようとしたメソッドが、値を割り当てるために働いていないのかということです。 – nhouser9
画面オブジェクトに値が割り当てられることはありません。それはnullです。あなたがフレームを表示するように設定したのでmain.screenからグラフィックスオブジェクトを作成しようとする前にpaintcomponentが実際に呼び出されていると思います。その時点でNPEを取得します。 – arynaq
それは例外なく、私のために働く! –