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

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

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

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

Q&A

解決済

1回答

2713閲覧

ブロック崩しのなかでブロックが壊れるとともにボールを増やす方法

Sakamoto

総合スコア1

Processing

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

1グッド

0クリップ

投稿2022/06/12 22:39

ブロック崩しを作っているのですが、ブロックを壊したときに新たにボールが出るコードをおしえていただきたいです。

 現状はボールを3つ出すことに成功していて、ブロックは二段になっています。その3つのボールはスタートと同時に発生し、いずれかのブロックを壊すことで、新たにボールが出てくるのを想定しています。初めからある3つのボールはすべて落ちると、ゲームオーバーで新たに増えるボールはいくら落ちてもかまわないようにしたいです。
どのような考えと関数を用いればいいのか助言をお願いします。

java

1-blockPlain- 2int block[] = new int[20];//下段のブロック、横の長さをを[]の数で割る 3int block1[]= new int[20];//上段のブロック 4int ball[]; 5int rnd1 (int n ,int m ) { 6 return int(random(n,m)); 7} 8int rnd2 (int n ,int m ) { 9 return int(random(n,m)); 10} 11float x, y = 5, b_w = 10, b_h = 10, dx, dy = 1;//ボール1の情報 12float x1, y1 = 5, b_w1 = 10, b_h1= 10, dx1, dy1 = 1;//ボール2の情報 13float x2, y2 = 5, b_w2 = 10, b_h2= 10, dx2, dy2 = 1;//ボール3の情報 14float xm,ym = 5, b_wm = 9, b_hm = 9, dxm,dym = 1;//無限ボールの情報 15float r_w = 75.0, r_h = 3.0;//ラケットの情報 16int score = 0; //keep score value 17int h_score = 0; 18 19void setup() { 20 size(600, 900); 21 initBall(); 22 initBall2(); 23 initBall3(); 24 initBlocks(); 25 initBlocks1(); 26 mugenball(); 27 frameRate (120); 28 h_score = load_hi_score(); 29} 30 31void draw() { 32 x += dx; // dx は1フレームごとにx方向に動く距離(速度) 33 y += dy; // dy は1フレームごとにy方向に動く距離(速度) 34 35 x1 += dx1; // dx1 は1フレームごとにx方向に動く距離(速度) 36 y1 += dy1; // dy1 は1フレームごとにy方向に動く距離(速度) 37 38 x2 += dx2; // dx2 は1フレームごとにx方向に動く距離(速度) 39 y2 += dy2; // dy2 は1フレームごとにy方向に動く距離(速度) 40 41 42 xm += dxm; 43 ym += dym; 44 background(0); 45 rect(x, y, b_w, b_h); // ball1 46 rect(x1, y1, b_w1, b_h1);// ball2 47 rect(x2, y2, b_w2, b_h2);// ball3 48 49 checkBlocks(); 50 checkBlocks1(); 51 showBlocks(); 52 showBlocks1(); 53 54 // ボールがラケットに衝突したらボールの速度を変え、かつこの場所でスコアを増やす 55 if (checkAndShowRacket(height-50)) { 56 score ++; 57 if (h_score < score) { 58 h_score = score; 59 store_hi_score(h_score); 60 } 61 } 62 //textの色 63 fill(255); // fill を黒に 64 text(score, 30, height - 50); 65 fill(255); // fill を黒に 66 text(h_score, 30, height - 20); 67 fill(255); // fill を白に 68 69 // 壁との衝突 70 if ((y + b_h >= height) && (y1 + b_h1 >= height) && (y2 + b_h2 >= height)) { 71 initBlocks(); 72 initBlocks1(); 73 initBall(); 74 initBall2(); 75 initBall3(); 76 score = 0; 77 } 78 //ボール1の挙動 79 if (x < 0 || x+b_w >=width) { 80 dx = -dx; 81 } 82 if (y < 0) { 83 dy = -dy; 84 } 85 //ボール2の挙動 86 if (x1 < 0 || x1+b_w1 >=width) { 87 dx1 = -dx1; 88 } 89 if (y1 < 0) { 90 dy1 = -dy1; 91 } 92 //ボール3の挙動 93 if (x2 < 0 || x2+b_w2 >=width) { 94 dx2 = -dx2; 95 } 96 if (y2 < 0) { 97 dy2 = -dy2; 98 } 99} 100 101-ball_function- 102//ボール1 103void initBall() { 104 x = 10; 105 y = 90; 106 dx = 2; 107 dy = 1; 108} 109//ボール2 110void initBall2() { 111 x1 = 10; 112 y1 = 130; 113 dx1 = 1; 114 dy1 = 2; 115} 116//ボール3 117void initBall3() { 118 x2 = 50; 119 y2 = 90; 120 dx2 = 2; 121 dy2 = 2; 122} 123void mugenball() { 124 rect (10, 90, 5, 5); 125 dxm = 1; 126 dym = 1; 127} 128 129-block_function- 130float bw, bh= 40.0; 131float bw1, bh1 =40.0; 132 133/* 134 10個のブロックを初期化する 135 */ 136void initBlocks() { 137 for (int i = 0; i < block.length; i++) { 138 block[i] = rnd1(1,10) ; 139 } 140 bw = width / block.length; // ブロックの幅を決める 141} 142 143void initBlocks1() { 144 for (int n = 0; n < block.length; n++) { 145 block1[n] = rnd2(1,10) ; 146 } 147 bw1 = width / block.length; // ブロックの幅を決める 148} 149 150/* 151 10個のブロックのどれかにぶつかっていたら跳ね返る 152 */ 153void checkBlocks() { 154 for (int i = 0; i < block.length; i++) { 155 if (block[i] > 0) { 156 int ret = blockHitCheck(i*bw, 40, bw, bh, x, y, b_w, b_h, dx, dy); 157 if (ret > 0) { 158 if (ret == 1) { 159 dx = -dx; 160 } else if (ret == 2) { 161 dy = -dy; 162 block[i]--; 163 } else if (ret == 3) { 164 dx = -dx; 165 dy = -dy; 166 block[i]--; 167 } 168 return; 169 } 170 } 171 } 172 for (int i = 0; i < block.length; i++) { 173 if (block[i] > 0) { 174 int ret = blockHitCheck(i*bw, 40, bw, bh, x1, y1, b_w1, b_h1, dx1, dy1); 175 if (ret > 0) { 176 if (ret == 1) { 177 dx1 = -dx1; 178 } else if (ret == 2) { 179 dy1 = -dy1; 180 block[i]--; 181 } else if (ret == 3) { 182 dx1 = -dx1; 183 dy1 = -dy1; 184 block[i]--; 185 } 186 return; 187 } 188 } 189 } 190 for (int i = 0; i < block.length; i++) { 191 if (block[i] > 0) { 192 int ret = blockHitCheck(i*bw, 40, bw, bh, x2, y2, b_w2, b_h2, dx2, dy2); 193 if (ret > 0) { 194 if (ret == 1) { 195 dx2 = -dx2; 196 } else if (ret == 2) { 197 dy2 = -dy2; 198 block[i]--; 199 } else if (ret == 3) { 200 dx2 = -dx2; 201 dy2 = -dy2; 202 block[i]--; 203 } 204 return; 205 } 206 } 207 } 208} 209/* 210 10個のブロックを表示する 211 */ 212void showBlocks() { 213 for (int i = 0; i < block.length; i++) { 214 if (block[i] > 0) { 215 fill(255); 216 rect(i * bw, 40, bw, bh); // ブロックの形の表示 217 fill(255); 218 text(block[i], i * bw, 100); // 消すために必要なhitの個数 219 fill(255); 220 } 221 if (block[i] == 0) { 222 mugenball(); 223 } 224 } 225} 226//ブロック2 227void checkBlocks1() { 228 for (int n = 0; n < block.length; n++) { 229 if (block1[n] > 0) { 230 int ret = blockHitCheck(n*bw1, 0, bw1, bh1, x, y, b_w, b_h, dx, dy); 231 if (ret > 0) { 232 if (ret == 1) { 233 dx = -dx; 234 } else if (ret == 2) { 235 dy = -dy; 236 block1[n]--; 237 } else if (ret == 3) { 238 dx = -dx; 239 dy = -dy; 240 block1[n]--; 241 } 242 return; 243 } 244 } 245 } 246 for (int n = 0; n < block.length; n++) { 247 if (block1[n] > 0) { 248 int ret = blockHitCheck(n*bw1, 0, bw1, bh1, x1, y1, b_w1, b_h1, dx1, dy1); 249 if (ret > 0) { 250 if (ret == 1) { 251 dx1 = -dx1; 252 } else if (ret == 2) { 253 dy1 = -dy1; 254 block1[n]--; 255 } else if (ret == 3) { 256 dx1 = -dx1; 257 dy1 = -dy1; 258 block1[n]--; 259 } 260 return; 261 } 262 } 263 } 264 for (int n = 0; n < block.length; n++) { 265 if (block1[n] > 0) { 266 int ret = blockHitCheck(n*bw1, 0, bw1, bh1, x2, y2, b_w2, b_h2, dx2, dy2); 267 if (ret > 0) { 268 if (ret == 1) { 269 dx2 = -dx2; 270 } else if (ret == 2) { 271 dy2 = -dy2; 272 block1[n]--; 273 } else if (ret == 3) { 274 dx2 = -dx2; 275 dy2 = -dy2; 276 block1[n]--; 277 } 278 return; 279 } 280 } 281 } 282} 283/* 284 10個のブロックを表示する 285 */ 286void showBlocks1() { 287 for (int n = 0; n < block.length; n++) { 288 if (block1[n] > 0) { 289 text(block1[n], n * bw1, 90); // 消すために必要なhitの個数 290 rect(n * bw1, 0, bw1, bh1); // ブロックの形の表示 291 } 292 } 293} 294 295-hi_score- 296int load_hi_score() { 297 String lines[]; 298 lines = loadStrings("data.txt"); 299 if (lines == null) { // data.txt というファイルが読めなかった時 300 return 0; 301 } else { 302 return int(lines[0]); 303 } 304} 305 306void store_hi_score(int hi_score) { 307 String lines [] = new String[1]; 308 // str(整数) は整数を表す文字列を返す 309 lines[0] = str(hi_score); 310 saveStrings("data.txt", lines); 311} 312 313-hit- 314/* 315 ふたつの長方形が重なるかどうかをしらべて、 316 重なったとき:true, 重ならないとき:false を返す 317*/ 318boolean isOverlap(float x1, float y1, float w1, float h1, 319 float x2, float y2, float w2, float h2) { 320 return x1 < x2+w2 && x2 < x1+w1 && y1 < y2+h2 && y2 < y1+h1; 321} 322 323/* 324 ブロックの位置と大きさ、 325 ボールの位置と大きさ、ボールの移動速度の情報を与えて 326 跳ね返る方向(x軸、y軸の別)を返す 327 跳ね返らない時: 0 328 x軸のみの時: 1 329 y軸のみの時: 2 330 x軸, y軸両方の時: 3 331*/ 332int blockHitCheck(float x, float y, float w, float h, 333 float bx, float by, float bw, float bh, float dx, float dy) { 334 int xflag = 0, yflag = 0; 335 336 if (!isOverlap(x,y,w,h,bx+dx,by+dy,bw,bh)) { 337 return 0; // ぶつからなかったら 0を返す 338 } 339 340 if (isOverlap(x,y,w,h,bx+dx,by,bw,bh)) xflag = 1; 341 if (isOverlap(x,y,w,h,bx,by+dy,bw,bh)) yflag = 2; 342 if (xflag + yflag > 0) { return xflag + yflag;} 343 return 3; 344} 345 346-racket_function- 347/* 348 checkAndShowRacket() 349 float r_y; // r_hはラケットのy座標 350 */ 351boolean checkAndShowRacket(float r_y) { 352 boolean hit = false; // 最初は false なのでなにもなければ falseが返る 353 float r_x = mouseX; // r_x はラケットの左側のx座標 354 355 if (r_x + r_w > width) { // 右に寄りすぎていたら補正する 356 r_x = width - r_w; 357 } 358 359 /* ブロックがぶつかっていたら上に跳ね返る */ 360 if (blockHitCheck(r_x, r_y, r_w, r_h, x, y, b_w, b_h, dx, dy) > 0) { 361 dy = -(dy+1);//1づつ速くなっていく 362 hit = true; // ぶつかった時は返す値を true に変化させる 363 } 364 if (blockHitCheck(r_x, r_y, r_w, r_h, x1, y1, b_w1, b_h1, dx1, dy1) > 0) { 365 dy1 = -(dy1+1);//1づつ速くなっていく 366 hit = true; // ぶつかった時は返す値を true に変化させる 367 } 368 if (blockHitCheck(r_x, r_y, r_w, r_h, x2, y2, b_w2, b_h2, dx2, dy2) > 0) { 369 dy2 = -(dy2+1);//1づつ速くなっていく 370 hit = true; // ぶつかった時は返す値を true に変化させる 371 } 372 rect(r_x, r_y, r_w, r_h); // racketを表示する 373 return hit; 374}
TN8001👍を押しています

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

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

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

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

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

guest

回答1

0

ベストアンサー

いずれかのブロックを壊すことで、新たにボールが出てくるのを想定しています。
どのような考えと関数を用いればいいのか助言をお願いします。

少なくともボールはクラスに変えて、ArrayListで管理するのがいいと思います。

クラスにすることで同じような関数を、(メソッドを呼び出す)単純なループに置き換えられます。
個数が不定の場合は、配列よりもリストのほうが扱いやすいです。

ArrayList of objects / Examples / Processing.org

b-10 オブジェクト指向プログラミング (OOP) - Proessing 学習ノート

[Processing×Java] クラスの使いかた - Qiita


本題には関係ないが気になった点

いくらなんでもブロックが固すぎ&ボールの速度が上がりすぎじゃないですか?(数個壊すので精一杯ですw

ボールが速くなりすぎるとバーをすり抜けます(とはいえちゃんとやるのは案外大変^^;

初めからある3つのボールはすべて落ちると、ゲームオーバーで新たに増えるボールはいくら落ちてもかまわないようにしたいです。

「初めからあるボール」がなくなったら、「増えるボール」が残っていてもゲームオーバーですか?
(ボールの差をはっきりつけたとしても)ちょっと理不尽に感じます。

所々にウソのコメント(fill(255); // fill を黒に等)があるのはいただけません。
第3者目線だと自分で何をやっているのかわかっていないのか・単に変え忘れなのかの区別がつきません。

こちらと共通点がやけに多いですが、「改造してみよう」みたいな課題なんですかね?
ブロック崩しゲームにおいて自分の考えた内容をどうゆう風にプログラムで書き換えばいいのか教えてください。

投稿2022/06/13 14:05

TN8001

総合スコア9412

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

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

TN8001

2022/06/13 14:05

「助言」ということなので特にコードは出しませんが、必要ならコメントしてください。
Sakamoto

2022/06/15 04:09

ありがとうございます! もらった助言をもとにもう少し頑張ってみます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.46%

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

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

質問する

関連した質問