0

私はスネークゲームを作ろうとしていました。しかし、長方形のボックス (スネーク) を移動できません。こんな質問してすみません!しかし、私はJavaの初心者であり、コードのどこに問題があるのか​​ わかりません。

    class Snakexx extends JPanel implements ActionListener , KeyListener{
public static int a,b,x,y;
public int fooda,foodb;
Random rnd ;
Timer t = new Timer(1,this);
public void keyPressed(KeyEvent e){
         if(e.getKeyCode()==e.VK_UP)
        {
        x=0;
        y=-1;
        }
        if(e.getKeyCode()==e.VK_LEFT)
        {
        x=-1;
        y=0;            
        }
        if(e.getKeyCode()==e.VK_DOWN)
        {
        x=0;
        y=1;
        }
        if(e.getKeyCode()==e.VK_RIGHT)
         {
            x=1;
            y=0;
            }
        }
public void keyTyped(KeyEvent e){}
public void keyReleased(KeyEvent f){}

protected Snakexx(){
rnd = new Random();
fooda=rnd.nextInt(1300);
foodb=rnd.nextInt(300);
a=20;
b=20;
t.start();
addKeyListener(this);
setFocusable(true);

} 



protected void paintComponent(Graphics g) {

super.paintComponent(g);
g.fillRect(a,b,10,10) ;
g.fillRect(fooda,foodb,10,10) ;
}
public void actionPerformed(ActionEvent e){
a+=x;
b+=y;
Graphics gr;
gr= new Snakexx().getGraphics();
gr.fillRect(a,b,10,10) ;

}
}

 public class Snake2{


 public static void main(String args[]) 
{
Snakexx abcd = new Snakexx();
JFrame jfrm = new JFrame("Snake Game");
jfrm.setSize(1300, 650);
jfrm.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
jfrm.setVisible(true);

jfrm.add(abcd);
}


}
4

1 に答える 1

2

NullPointerExceptionタイマーアクションにあるようです。インスタンスnew Snakexx().getGraphics();を取得する方法が正しくありません。Graphicsタイマーの刻みごとにパネルの新しいインスタンスを実際に割り当てているため、さらに問題があります。

getGraphics()次の再描画時にリサイクルされる一時的なバッファーであるため、絵画には使用しないでください。paintComponent()絵を描いて、必要に応じて電話してくださいrepaint()

すぐに修正するにはrepaint()、ペイント コードを追加してコメント アウトします。つまり、次のようになります。

public void actionPerformed(ActionEvent e) {
    a += x;
    b += y;
    // Graphics gr;
    // gr= new Snakexx().getGraphics();
    // gr.fillRect(a,b,10,10) ;

    repaint();
}

詳細については、「カスタム ペイントの実行」および「 AWT と Swingでのペイント」を参照してください。

また、キー リスナーは、キーボード入力への低レベル インターフェイスです。パネルがフォーカス可能で、フォーカスがあることを確認してください。ピント合わせは非常に難しい場合があります。キー バインディングを使用する方がはるかに優れています。詳細については、キー バインディングの使用方法を参照してください。

于 2013-03-06T01:58:44.557 に答える