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

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

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

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

Swing

SwingはJavaに標準で付属するグラフィック関連のクラスライブラリを指します。

Javaアプレット

Javaアプレットは、Webページに組み込まれて実行されるJavaアプリケーションの形式です。Java SE 11で廃止となりました。

Q&A

解決済

3回答

3613閲覧

Javaの画像の重なりの判定について

asdf123456789

総合スコア25

Java

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

Swing

SwingはJavaに標準で付属するグラフィック関連のクラスライブラリを指します。

Javaアプレット

Javaアプレットは、Webページに組み込まれて実行されるJavaアプリケーションの形式です。Java SE 11で廃止となりました。

0グッド

0クリップ

投稿2016/08/02 16:56

趣味でJavaのゲーム作りの勉強をしています。

「キャラクターを十字キーで動かし、動いた後に岩と重なるとき、キャラクターは動かない」
というプログラムを作ってみたのですが、うまくいきません。

以下のプログラムはその一部です。chackRockX,Yメソッドで岩の左上の座標を取得しています。
collisionメソッドの引数はキーのIDで、どのキーが押されたかによって、キャラクターの
動いた後の座標がそれぞれlink_x,y_nextにされています。

また、checkOverlapメソッドで、
「キャラクターの左上、左下、右上、右下のどれかが岩の左のx座標より大きく右のx座標より小さく
上のy座標より大きく下のy座標より小さい位置にある状態が重なっている(trueを返す)」
と判定したつもりなのですが、キャラクターがうまく動きません。

(キャラクターの名前をどこかで聞いたことがあるかもしれませんが気にしないでください。)
(キャラクター、岩の画像はそれぞれ32x32です。)

Java

1public boolean collision(int ID) { 2 3 link_x_next = link_x + LINK_SPEED; 4 link_y_next = link_y + LINK_SPEED; 5 6 Rectangle linkrect; 7 8 9 int rockX[]; 10 int rockY[]; 11 12 rockX = checkRockX(); 13 rockY = checkRockY(); 14 15 16 switch(ID) { 17 18 case KeyEvent.VK_UP: 19 link_y_next = link_y - LINK_SPEED; 20 link_x_next = link_x; 21 22 break; 23 24 case KeyEvent.VK_DOWN: 25 link_y_next = link_y + LINK_SPEED; 26 link_x_next = link_x; 27 28 break; 29 30 case KeyEvent.VK_LEFT: 31 link_x_next = link_x - LINK_SPEED; 32 link_y_next = link_y; 33 34 break; 35 36 case KeyEvent.VK_RIGHT: 37 link_x_next = link_x + LINK_SPEED; 38 link_y_next = link_y; 39 40 break; 41 42 default: 43 return false; 44 } 45 46 if(rockX[0] != ERROR && rockY[0] != ERROR) { 47 48 //移動後のリンクが岩に重なるかどうかの判定 49 //いずれかの岩と重なればtrueを返す 50 //trueが返されると重なっているので、リンクは移動しない 51 52 Rectangle a; 53 54 for(int i = 0; i < rockX.length; i++) { 55 56 57 boolean b = checkOverlap(link_x_next, link_y_next, rockX[i], rockY[i]); 58 59 if(b == true) { 60 return true; 61 } 62 63 } 64 65 } 66 return false; 67 68 } 69 70 public int[] checkRockX(){ 71 72 int[] tips = new int[512]; 73 74 int error[] = {9999}; 75 int num = 0; 76 77 for(int i = 0; i<1024; i+=32) { 78 for(int j = 0; j< 512; j+= 32) { 79 80 if(mapdata[i/32][j/32] == ROCK){ 81 tips[num] = i; 82 83 num++; 84 } 85 } 86 } 87 return tips; 88 } 89 90 91 92 public int[] checkRockY(){ 93 94 int[] tips = new int[512]; 95 int error[] = {9999}; 96 int num = 0; 97 98 for(int i = 0; i<1024; i+=32) { 99 for(int j = 0; j< 512; j+= 32) { 100 101 if(mapdata[i/32][j/32] == ROCK){ 102 tips[num] = j; 103 104 num++; 105 } 106 } 107 } 108 return tips; 109 } 110 111 112 113 public boolean checkOverlap(int x, int y, int x2, int y2) { 114 115 //x = 左 116 //x+32 = 右 117 //y = 上 118 //y+32 = 下 119 120 if(x >= x2 && x <= x2+32){ 121 122 if(y >= y2 && y <= y2+32) { 123 return true; 124 }else if(y+32 >= y2 && y <= y2+32){ 125 return true; 126 } 127 128 }else if(x+32 >= x2 && x <= x2+32){ 129 130 if(y >= y2 && y <= y2+32) { 131 return true; 132 }else if(y+32 >= y2 && y <= y2+32){ 133 return true; 134 } 135 136 } 137 138 return false; 139 140 }

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

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

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

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

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

guest

回答3

0

自己解決

すみません。自己解決しました。お二人の回答を参考にさせていただきました。

Java

1public boolean collision(int ID) { 2 3 link_x_next = link_x; 4 link_y_next = link_y; 5 6 7 8 int rockX[]; 9 int rockY[]; 10 11 int[][] rockXY = checkRockXY(); 12 13 rockX = checkRockX(); 14 rockY = checkRockY(); 15 16 17 switch(ID) { 18 19 case KeyEvent.VK_UP: 20 link_y_next = link_y - LINK_SPEED; 21 link_x_next = link_x; 22 23 break; 24 25 case KeyEvent.VK_DOWN: 26 link_y_next = link_y + LINK_SPEED; 27 link_x_next = link_x; 28 29 break; 30 31 case KeyEvent.VK_LEFT: 32 link_x_next = link_x - LINK_SPEED; 33 link_y_next = link_y; 34 35 break; 36 37 case KeyEvent.VK_RIGHT: 38 link_x_next = link_x + LINK_SPEED; 39 link_y_next = link_y; 40 41 break; 42 43 default: 44 return false; 45 } 46 //移動後のリンクが岩に重なるかどうかの判定 47 //いずれかの岩と重なればtrueを返す 48 //trueが返されると重なっているので、リンクは移動しない 49 50 51 52 for(int i = 0; i < rockXY.length; i++) { 53 54 boolean b = false; 55 56 if(rockXY[i][0] != 0 && rockXY[i][1] != 0) { 57 58 b = checkOverlap(link_x_next, link_y_next, rockXY[i][0], rockXY[i][1]); 59 60 } 61 62 if(b == true) { 63 return true; 64 }else{} 65} 66 return false; 67 68 } 69 70 int[][] checkRockXY() { 71 72 int[][] tips = new int[1024][2]; 73 int num = 0; 74 75 for(int i = 0; i<1024; i+=32) { 76 for(int j = 0; j< 512; j+= 32) { 77 if(mapdata[i/32][j/32] == ROCK){ 78 // 位置i x j の mapdataがROCKになっているので、iとjの値を保持する 79 tips[num][0] = i; 80 tips[num][1] = j; 81 num++; 82 } 83 } 84 } 85 return tips; 86 87 } 88 89 public boolean checkOverlap(int x, int y, int x2, int y2) { 90 91 //x = 左 92 //x+32 = 右 93 //y = 上 94 //y+32 = 下 95 96 if(x >= x2 && x <= x2+32){ 97 98 if(y >= y2 && y <= y2+32) { 99 System.out.println("a"); 100 return true; 101 }else if(y+32 >= y2 && y+32 <= y2+32){ 102 System.out.println("b"); 103 return true; 104 } 105 106 }else if(x+32 >= x2 && x+32 <= x2+32){ 107 108 if(y >= y2 && y <= y2+32) { 109 System.out.println("c"); 110 return true; 111 }else if(y+32 >= y2 && y+32 <= y2+32){ 112 System.out.println("d"); 113 return true; 114 } 115 116 } 117 118 return false; 119 120 }

投稿2016/08/03 04:54

asdf123456789

総合スコア25

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

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

0

Java

1public boolean checkOverlap(int x, int y, int x2, int y2) { 2//x = 左 3//x+32 = 右 4//y = 上 5//y+32 = 下 6 if(x >= x2 && x <= x2+32){ 7 8 if(y >= y2 && y <= y2+32){ //左上の判定 9 return true; 10 }else if(y+32 >= y2 && y+32 <= y2+32){ //左下の判定 11 return true; 12 } 13 14 //}else if(x+32 >= x2 && x <= x2+32){ 15 }else if(x+32 >= x2 && x+32 <= x2+32){ 16 17 if(y >= y2 && y <= y2+32){ //右上の判定 18 return true; 19 //}else if(y+32 >= y2 && y <= y2+32){ 20 }else if(y+32 >= y2 && y+32 <= y2+32){ //右下の判定 21 return true; 22 } 23 24 } 25 return false; 26}

衝突判定のコードは、+32が抜けている部分があるだけのようですね

投稿2016/08/03 01:44

abs123

総合スコア1280

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

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

asdf123456789

2016/08/03 03:03

回答ありがとうございます。試してみます。
guest

0

checkRockXとcheckRockYで位置情報個別に判定しているので、
n個めの岩のX座標とY座標がかみ合ってないからではないでしょうか?

最低限、元の意味を損なわないレベルで動きそうなところまで、
修正したコードを書きます。
※コンパイル、デバッグはやってません。

Java

1public boolean collision(int ID) { 2 3 link_x_next = link_x; 4 link_y_next = link_y; 5 6 int[][] rockXY = checkRockXY(); 7 8 switch(ID) { 9 10 case KeyEvent.VK_UP: 11 link_y_next = link_y - LINK_SPEED; 12 link_x_next = link_x; 13 break; 14 15 case KeyEvent.VK_DOWN: 16 link_y_next = link_y + LINK_SPEED; 17 link_x_next = link_x; 18 break; 19 20 case KeyEvent.VK_LEFT: 21 link_x_next = link_x - LINK_SPEED; 22 link_y_next = link_y; 23 break; 24 25 case KeyEvent.VK_RIGHT: 26 link_x_next = link_x + LINK_SPEED; 27 link_y_next = link_y; 28 break; 29 30 default: 31 return false; 32 } 33 34 if(rockXY[0][0] != ERROR && rockXY[0][1] != ERROR) { // FIXME: ERRORが何を意味しているのか分からないため、そのままにしてあります 35 36 //移動後のリンクが岩に重なるかどうかの判定 37 //いずれかの岩と重なればtrueを返す 38 //trueが返されると重なっているので、リンクは移動しない 39 40 for(int i = 0; i < rockXY.length; i++) { // FIXME: rockXYは生成した配列サイズになっている(1024) 41 // 岩iのx座標:rockXY[i][0]、岩iのy座標:rockXY[i][1] 42 boolean b = checkOverlap(link_x_next, link_y_next, rockXY[i][0], rockXY[i][1]); 43 if(b == true) { 44 return true; 45 } 46 } 47 } 48 return false; 49} 50 51 52 53int[][] checkRockXY() { 54 int[][] tips = new int[1024][2]; 55 int num = 0; 56 57 for(int i = 0; i<1024; i+=32) { 58 for(int j = 0; j< 512; j+= 32) { 59 if(mapdata[i/32][j/32] == ROCK){ 60 // 位置i x j の mapdataがROCKになっているので、iとjの値を保持する 61 tips[num][0] = i; 62 tips[num][1] = j; 63 num++; 64 } 65 } 66 } 67 return tips; 68}

投稿2016/08/02 19:50

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

asdf123456789

2016/08/03 03:02

回答ありがとうございます。参考にさせていただきます。 ちなみにERRORはマップ上に岩がなかった場合に返されます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問