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

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

新規登録して質問してみよう
ただいま回答率
85.48%
Java

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

Q&A

解決済

2回答

1471閲覧

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

nakamura-

総合スコア48

Java

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

0グッド

0クリップ

投稿2016/06/28 09:00

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

コード 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インスタンスの配列を最初に作るのもできないと思います。
こういう場合どうしたらいいのでしょうか?
よろしくお願いします。

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

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

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

投稿2016/06/28 09:13

PineMatsu

総合スコア3579

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

nakamura-

2016/06/28 13:38

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

2016/06/29 00:07

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

2016/07/01 05:43

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

0

自己解決

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

投稿2016/07/01 05:48

nakamura-

総合スコア48

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

masaya_ohashi

2016/07/01 06:02

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

2016/07/01 06:03

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

2016/07/01 06:06

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問