質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.51%

  • Java

    15824questions

    Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

インスタンス生成のタイミング

解決済

回答 2

投稿

  • 評価
  • クリップ 0
  • VIEW 507

nakamura-

score 40

シューティングゲームをつくっています。
下のはその途中のプログラムです。

コード
public class MyPanel extends JPanel{

    Player player;
    Gun gun;

    /**
     * MyPanelのコンストラクタ
     */
    public MyPanel(){
        setBackground(Color.BLACK);        //背景色設定

        try{
            player = new Player("jiki.gif", 0, 0, 32, 32);
        }
        catch(IOException ioe){
            System.out.println("画像がありません");
        }
    }

    /**
     * キー入力処理
     */
    protected void processKeyEvent(KeyEvent ke){
        /*何かキーが押された場合*/
        if(ke.getID() == KeyEvent.KEY_PRESSED){
            System.out.println("キー" + ke.getKeyCode() + "が押された");

            /*押されたキーが左右だった場合*/
            if(ke.getKeyCode() == KeyEvent.VK_LEFT || ke.getKeyCode() == KeyEvent.VK_RIGHT){
                player.updata(ke.getKeyCode());
                repaint();
            }

            /*押されたキーがENTERだった場合*/
            if(ke.getKeyCode() == KeyEvent.VK_ENTER){
                gun = new Gun(-100, -100);
                gun.startLine(player.m_x, player.m_y);

/*---------------------------------------------------
                try{
                    Thread.sleep(50);
                }
                catch(InterruptedException e){
                }
                gun.updata();
                repaint();
------------------------------------------------------*/
            }
        }
    }

    /**
     * 描画メソッド
     */
    protected void paintComponent(Graphics g){
        super.paintComponent(g);
        requestFocusInWindow();            //キー入力有効化

        player.draw(g);
        gun.draw(g);
    }
}
コード
public class Player{

    BufferedImage m_bi;
    int m_x = 485;
    int m_y = 640;

    /**
     * Playerのコンストラクタ
     */
    public Player(BufferedImage bi){
        m_bi = bi;
    }
    public Player(BufferedImage bi, int x, int y, int w, int h){
        m_bi = bi.getSubimage(x, y, w, h);
    }
    public Player(File file, int x, int y, int w, int h) throws IOException{
        BufferedImage bi = ImageIO.read(file);
        m_bi = bi.getSubimage(x, y, w, h);
    }
    public Player(String str, int x, int y, int w, int h) throws IOException{
        File file = new File(str);
        BufferedImage bi = ImageIO.read(file);
        m_bi = bi.getSubimage(x, y, w, h);
    }

    /**
     * 位置更新メソッド
     */
    public void updata(int keyCode){
        /*押されたキーが右だった場合*/
        if(keyCode == KeyEvent.VK_RIGHT){
            m_x += 32;
        }
        /*押されたキーが左だった場合*/
        if(keyCode == KeyEvent.VK_LEFT){
            m_x -= 32;
        }
    }

    /**
     * 描画メソッド
     */
    public void draw(Graphics g){
        g.drawImage(m_bi, m_x, m_y, null);    //画像表示
    }

}
コード
public class Gun{

    int m_x;
    int m_y;

    /**
     * Gunのコンストラクタ
     */
    public Gun(int x, int y){
        /*初期位置設定(画面外に設定)*/
        m_x = x;
        m_y = y;
    }

    /**
     * 攻撃開始位置設定メソッド
     */
    public void startLine(int x, int y){
        m_x = x;
        m_y = y;
    }

    /**
     * 位置更新メソッド
     */
    public void updata(){
        m_y -= 10;
    }

    /**
     * 描画メソッド
     */
    public void draw(Graphics g){
        g.setColor(Color.WHITE);
        g.fillRect(m_x, m_y, 5, 5);
    }

}


左右の矢印で機体(プレイヤー)を動かして、Enterで攻撃(弾を飛ばす)仕組みになっています。

MyPanelクラスで
弾ごとにインスタンスを作って配列に入れようと考えています。
Enterを押すたびに攻撃するのでprocessKeyEventメソッド内のif(ke.getKeyCode() == KeyEvent.VK_ENTER){のときにGunのインスタンスを作って配列に入れようと考えています。
(Enterを何回押すかわからないので押されてから配列に入れた方がいいと思ったため)
ですがこうするとpaintComponent(Graphics g)メソッドのgun.draw(g);でNullPointerExceptionのエラーが出てしまいます。
Enterを押さないとインスタンスを作らないのでエラーが出るのはわかっているのですが、描画するにはgun.draw(g);をこの場所に書かないといけないと思います。
だからといって何回押されるかわからないgunインスタンスの配列を最初に作るのもできないと思います。
こういう場合どうしたらいいのでしょうか?
よろしくお願いします。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

+1

gun = new Gun(-100, -100);

ENTERキーを押す度にGunをnewしてますが、変数gunは1つしか無いのでこれでは前回作成したインスタンスにアクセスできなくなってしまいます。
生成したGunをListなどのコンテナに格納して、格納されたGunインスタンスそれぞれについてpaintComponent内で処理をする必要があります。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/06/28 22:38

    回答ありがとうございます。
    gunが1つしかないのは故意というか、とりあえず1つの場合を想定して1つにしました。(Enterが1回しか押されないという設定で)
    質問内容としましては、
    このプログラムを実行するとpaintComponent(Graphics g)メソッドのgun.draw(g);でNullPointerExceptionのエラーが発生するのはEnterが押されるまでgunに何も入っていないということはわかっているのですが、gunの生成もprocessKeyEventメソッドに書いた方がいいと思うので、この二つを両立するにはどうすればいいのかということです。
    わかりにくくてすみません。

    キャンセル

  • 2016/06/29 09:07

    paintComponentでgunがnullならgun.drawの描画を行わない、でNullPointerExceptionを回避可能だと思います。

    キャンセル

  • 2016/07/01 14:43

    masaya_ohashiさん
    確かにそうですね!
    それでいけました!
    ありがとうございます。

    キャンセル

check解決した方法

0

masaya_ohashi さんの回答で解決できました。
コメントに書かれていてmasaya_ohashi さんをベストアンサーにできなかったので、すみませんが自己解決というふうにさせてもらいました。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/07/01 15:02

    解決できてよかったです。

    キャンセル

  • 2016/07/01 15:03

    ありがとうございました。
    自己解決にしてしまいすみませんでした。

    キャンセル

  • 2016/07/01 15:06

    自分もあのコメントでベストアンサーをもらおうとは思っていなかったので大丈夫ですよ。

    キャンセル

同じタグがついた質問を見る

  • Java

    15824questions

    Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。