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

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

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

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

Processing

Processingは、オープンソースプロジェクトによるCGのためのプログラミング言語です。Javaをベースにしており、グラフィック機能に特化しています。イメージの生成やアニメーションなど、視覚的なフィードバックを簡単に得ることが可能です。

Q&A

1回答

734閲覧

Processing javaでシューティングゲーム作成 配列について

kuriboros

総合スコア23

Java

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

Processing

Processingは、オープンソースプロジェクトによるCGのためのプログラミング言語です。Javaをベースにしており、グラフィック機能に特化しています。イメージの生成やアニメーションなど、視覚的なフィードバックを簡単に得ることが可能です。

0グッド

0クリップ

投稿2019/01/03 12:12

編集2022/01/12 10:55

javaがわかるかた、ご教示頂けたらと思います。

以下のメソッドを呼び出そうとすると、NullpointerExceptionが出ます。

配列を初期化してから、処理を書いているいつもりですが、何が足りないのでしょうか?
クラス名は割愛しています。

メソッドは下記のrect()を使おうと考えています。

/画像の位置(x, y)、画像のサイズ(w, h)を返す**************/
import java.awt.Rectangle;

Game_Control gc;
//画像Sprite.libe
//敵機が何体存在しているかチェックする
int num_x = 3;
int num_y = 3;
PImage[][] enemys_Image = new PImage[num_x][num_y];
Rectangle[][] enemys_rect = new Rectangle[num_x][num_y];

public class Enemy_Machine{
int fromx, fromy;
int[][] fromw, fromh;

//コンストラクタ
Enemy_Machine(int fromx, int fromy, int[][] fromw, int[][] fromh){
this.fromx = fromx;//横の位置
this.fromy = fromy;//縦の位置
this.fromw = fromw;//画像のサイズ横
this.fromh = fromh;//画像のサイズ縦
}

//表示
int[][] display(){
int[][] enemy_display = new int[num_x][num_y];
for(int num_x = 0; num_x < enemys_Image[0].length; num_x++){
for(int num_y = 0; num_y < enemys_Image.length; num_y++){

enemys_Image[num_x][num_y] = loadImage("enemy1.png"); fromx = 800; println("enemys_Image[0][0]" + enemys_Image[0][0]); println("enemys_Image[0][1]" + enemys_Image[0][1]); println("enemys_Image[0][2]" + enemys_Image[0][2]); println("enemys_Image[1][0]" + enemys_Image[1][0]); println("enemys_Image[1][1]" + enemys_Image[1][1]); println("enemys_Image[1][2]" + enemys_Image[1][2]); //enemys_Image[0][0] = null; image( enemys_Image[num_x][num_y], fromx + num_x * 60 + 30, fromy + num_y * 80 + 50, width/15, height/8 ); } } return enemy_display;

}

//非表示
int[][] un_display(){
int[][] un_enemy_display = new int[num_x][num_y];
for(int num_x = 0; num_x < enemys_Image[0].length; num_x++){
for(int num_y = 0; num_y < enemys_Image.length; num_y++){

enemys_Image[num_x][num_y] = loadImage("enemy1.png"); image( enemys_Image[num_x][num_y], fromx + num_x * 60 + 30, fromy + num_y * 80 + 50, width/1000, height/1000 ); } } return un_enemy_display;

}

//動作
int[][] move(){
int[][] enemy_move = new int[num_x][num_y];
for(int num_x = 0; num_x < enemys_Image[0].length; num_x++){
for(int num_y = 0; num_y < enemys_Image.length; num_y++){

enemys_Image[num_x][num_y] = loadImage("enemy1.png"); image(enemys_Image[num_x][num_y], fromx + num_x * 60 + 30, fromy + num_y * 80 + 50); fromx--; if(fromx < 0){ fromx = 1000; //fromy = (int)random(100); fromx --; } } } return enemy_move;

}

//横のサイズを返すメソッド 78
int[][] get_width(){
int[][] ImageWidth = new int[num_x][num_y];

for(int num_x = 0; num_x < enemys_Image[0].length; num_x++){ for(int num_y = 0; num_y < enemys_Image.length; num_y++){ enemys_Image[num_x][num_y] = loadImage("enemy1.png"); ImageWidth[num_x][num_y] = enemys_Image[num_x][num_y].width; } } return ImageWidth;

}

//縦のサイズを返すメソッド 60
int[][] get_height(){
int[][] ImageHeight = new int[num_x][num_y];

for(int num_x = 0; num_x < enemys_Image[0].length; num_x++){ for(int num_y = 0; num_y < enemys_Image.length; num_y++){ enemys_Image[num_x][num_y] = loadImage("enemy1.png"); ImageHeight[num_x][num_y] = enemys_Image[num_x][num_y].height; } } return ImageHeight;

}

void rect(){

for(int a = 0; a < enemys_Image[0].length; a++){ for(int b = 0; b < enemys_Image.length; b++){ for(int num_x = 0; num_x < enemys_Image[0].length; num_x++){ for(int num_y = 0; num_y < enemys_Image.length; num_y++){ enemys_rect[a][b] = new Rectangle(fromx, fromy, fromw[num_x][num_y], fromh[num_x][num_y]); //println("enemys_rect" + enemys_rect); } } } }

}

}//EOF

わかる方が行っらしゃいましたらご教示の程お願いいたします。

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

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

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

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

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

KSwordOfHaste

2019/01/03 12:34

本サイトではコードをそのまま質問文に張り付けても字下げされません。 https://teratail.com/help#about-markdown の「コードを入力」の項に書き方があります。それを参考に質問文を編集ください。質問文の投稿・編集のページ右側にプレビューが表示されていると思いますのでそれで適切な表示になっていることを確認できると思います。
guest

回答1

0

いくつかの配列が登場していて、そのどれかがnullになっている可能性があり、それは質問に書かれいてる情報ではなんとも言えません。
enemys_Image
fromw
fromh
はちゃんと実体を持っているか確認してみては。

---追記---
回答を編集されたようですが、変数を追うにはまだ不十分です。
ベタですが、rect()の冒頭に

Processing

1 void rect() { 2 if (enemys_Image==null) { 3 println("enemys_Image: null"); 4 } 5 if (enemys_Image[0]==null) { 6 println("enemys_Image[0]: null"); 7 } 8 if (fromw==null) { 9 println("fromw: null"); 10 } 11 if (fromw[0]==null) { 12 println("fromw[0]: null"); 13 } 14 if (fromh==null) { 15 println("fromh: null"); 16 } 17 if (fromh[0]==null) { 18 println("fromh[0]: null"); 19 }

とでも入れて具体的にどの変数がnullになっているのか調べてみてはいかがでしょう。

投稿2019/01/03 17:05

編集2019/01/05 07:33
thkana

総合スコア7610

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

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

thkana

2019/01/05 08:10

本題ではないですが、あちこちで enemys_Image[num_x][num_y] = loadImage("enemy1.png"); としているのは必要なのでしょうか。ファイルもキャッシュはされるでしょうが、かなり非効率な気がします。 本当にデータの書き換え(書き戻し?)が必要だとしても、例えば PImage enemys_Image_master=loadImage("enemy1.png"); をプログラム中一箇所で(ゲームレベルのコンストラクタなどで)行っておき、あとは enemys_Image[num_x][num_y]=enemys_Image_master.copy(); とかでのメモリ操作に留めたほうが効率がよいのでは。
kuriboros

2019/01/05 08:43

ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問