趣味で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 }

回答3件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。