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

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

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

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

解決済

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

Sakamoto
Sakamoto

総合スコア1

Processing

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

1回答

1リアクション

1クリップ

627閲覧

投稿2022/06/12 22:39

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

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

java

-blockPlain- int block[] = new int[20];//下段のブロック、横の長さをを[]の数で割る int block1[]= new int[20];//上段のブロック int ball[]; int rnd1 (int n ,int m ) { return int(random(n,m)); } int rnd2 (int n ,int m ) { return int(random(n,m)); } float x, y = 5, b_w = 10, b_h = 10, dx, dy = 1;//ボール1の情報 float x1, y1 = 5, b_w1 = 10, b_h1= 10, dx1, dy1 = 1;//ボール2の情報 float x2, y2 = 5, b_w2 = 10, b_h2= 10, dx2, dy2 = 1;//ボール3の情報 float xm,ym = 5, b_wm = 9, b_hm = 9, dxm,dym = 1;//無限ボールの情報 float r_w = 75.0, r_h = 3.0;//ラケットの情報 int score = 0; //keep score value int h_score = 0; void setup() { size(600, 900); initBall(); initBall2(); initBall3(); initBlocks(); initBlocks1(); mugenball(); frameRate (120); h_score = load_hi_score(); } void draw() { x += dx; // dx は1フレームごとにx方向に動く距離(速度) y += dy; // dy は1フレームごとにy方向に動く距離(速度) x1 += dx1; // dx1 は1フレームごとにx方向に動く距離(速度) y1 += dy1; // dy1 は1フレームごとにy方向に動く距離(速度) x2 += dx2; // dx2 は1フレームごとにx方向に動く距離(速度) y2 += dy2; // dy2 は1フレームごとにy方向に動く距離(速度) xm += dxm; ym += dym; background(0); rect(x, y, b_w, b_h); // ball1 rect(x1, y1, b_w1, b_h1);// ball2 rect(x2, y2, b_w2, b_h2);// ball3 checkBlocks(); checkBlocks1(); showBlocks(); showBlocks1(); // ボールがラケットに衝突したらボールの速度を変え、かつこの場所でスコアを増やす if (checkAndShowRacket(height-50)) { score ++; if (h_score < score) { h_score = score; store_hi_score(h_score); } } //textの色 fill(255); // fill を黒に text(score, 30, height - 50); fill(255); // fill を黒に text(h_score, 30, height - 20); fill(255); // fill を白に // 壁との衝突 if ((y + b_h >= height) && (y1 + b_h1 >= height) && (y2 + b_h2 >= height)) { initBlocks(); initBlocks1(); initBall(); initBall2(); initBall3(); score = 0; } //ボール1の挙動 if (x < 0 || x+b_w >=width) { dx = -dx; } if (y < 0) { dy = -dy; } //ボール2の挙動 if (x1 < 0 || x1+b_w1 >=width) { dx1 = -dx1; } if (y1 < 0) { dy1 = -dy1; } //ボール3の挙動 if (x2 < 0 || x2+b_w2 >=width) { dx2 = -dx2; } if (y2 < 0) { dy2 = -dy2; } } -ball_function- //ボール1 void initBall() { x = 10; y = 90; dx = 2; dy = 1; } //ボール2 void initBall2() { x1 = 10; y1 = 130; dx1 = 1; dy1 = 2; } //ボール3 void initBall3() { x2 = 50; y2 = 90; dx2 = 2; dy2 = 2; } void mugenball() { rect (10, 90, 5, 5); dxm = 1; dym = 1; } -block_function- float bw, bh= 40.0; float bw1, bh1 =40.0; /* 10個のブロックを初期化する */ void initBlocks() { for (int i = 0; i < block.length; i++) { block[i] = rnd1(1,10) ; } bw = width / block.length; // ブロックの幅を決める } void initBlocks1() { for (int n = 0; n < block.length; n++) { block1[n] = rnd2(1,10) ; } bw1 = width / block.length; // ブロックの幅を決める } /* 10個のブロックのどれかにぶつかっていたら跳ね返る */ void checkBlocks() { for (int i = 0; i < block.length; i++) { if (block[i] > 0) { int ret = blockHitCheck(i*bw, 40, bw, bh, x, y, b_w, b_h, dx, dy); if (ret > 0) { if (ret == 1) { dx = -dx; } else if (ret == 2) { dy = -dy; block[i]--; } else if (ret == 3) { dx = -dx; dy = -dy; block[i]--; } return; } } } for (int i = 0; i < block.length; i++) { if (block[i] > 0) { int ret = blockHitCheck(i*bw, 40, bw, bh, x1, y1, b_w1, b_h1, dx1, dy1); if (ret > 0) { if (ret == 1) { dx1 = -dx1; } else if (ret == 2) { dy1 = -dy1; block[i]--; } else if (ret == 3) { dx1 = -dx1; dy1 = -dy1; block[i]--; } return; } } } for (int i = 0; i < block.length; i++) { if (block[i] > 0) { int ret = blockHitCheck(i*bw, 40, bw, bh, x2, y2, b_w2, b_h2, dx2, dy2); if (ret > 0) { if (ret == 1) { dx2 = -dx2; } else if (ret == 2) { dy2 = -dy2; block[i]--; } else if (ret == 3) { dx2 = -dx2; dy2 = -dy2; block[i]--; } return; } } } } /* 10個のブロックを表示する */ void showBlocks() { for (int i = 0; i < block.length; i++) { if (block[i] > 0) { fill(255); rect(i * bw, 40, bw, bh); // ブロックの形の表示 fill(255); text(block[i], i * bw, 100); // 消すために必要なhitの個数 fill(255); } if (block[i] == 0) { mugenball(); } } } //ブロック2 void checkBlocks1() { for (int n = 0; n < block.length; n++) { if (block1[n] > 0) { int ret = blockHitCheck(n*bw1, 0, bw1, bh1, x, y, b_w, b_h, dx, dy); if (ret > 0) { if (ret == 1) { dx = -dx; } else if (ret == 2) { dy = -dy; block1[n]--; } else if (ret == 3) { dx = -dx; dy = -dy; block1[n]--; } return; } } } for (int n = 0; n < block.length; n++) { if (block1[n] > 0) { int ret = blockHitCheck(n*bw1, 0, bw1, bh1, x1, y1, b_w1, b_h1, dx1, dy1); if (ret > 0) { if (ret == 1) { dx1 = -dx1; } else if (ret == 2) { dy1 = -dy1; block1[n]--; } else if (ret == 3) { dx1 = -dx1; dy1 = -dy1; block1[n]--; } return; } } } for (int n = 0; n < block.length; n++) { if (block1[n] > 0) { int ret = blockHitCheck(n*bw1, 0, bw1, bh1, x2, y2, b_w2, b_h2, dx2, dy2); if (ret > 0) { if (ret == 1) { dx2 = -dx2; } else if (ret == 2) { dy2 = -dy2; block1[n]--; } else if (ret == 3) { dx2 = -dx2; dy2 = -dy2; block1[n]--; } return; } } } } /* 10個のブロックを表示する */ void showBlocks1() { for (int n = 0; n < block.length; n++) { if (block1[n] > 0) { text(block1[n], n * bw1, 90); // 消すために必要なhitの個数 rect(n * bw1, 0, bw1, bh1); // ブロックの形の表示 } } } -hi_score- int load_hi_score() { String lines[]; lines = loadStrings("data.txt"); if (lines == null) { // data.txt というファイルが読めなかった時 return 0; } else { return int(lines[0]); } } void store_hi_score(int hi_score) { String lines [] = new String[1]; // str(整数) は整数を表す文字列を返す lines[0] = str(hi_score); saveStrings("data.txt", lines); } -hit- /* ふたつの長方形が重なるかどうかをしらべて、 重なったとき:true, 重ならないとき:false を返す */ boolean isOverlap(float x1, float y1, float w1, float h1, float x2, float y2, float w2, float h2) { return x1 < x2+w2 && x2 < x1+w1 && y1 < y2+h2 && y2 < y1+h1; } /* ブロックの位置と大きさ、 ボールの位置と大きさ、ボールの移動速度の情報を与えて 跳ね返る方向(x軸、y軸の別)を返す 跳ね返らない時: 0 x軸のみの時: 1 y軸のみの時: 2 x軸, y軸両方の時: 3 */ int blockHitCheck(float x, float y, float w, float h, float bx, float by, float bw, float bh, float dx, float dy) { int xflag = 0, yflag = 0; if (!isOverlap(x,y,w,h,bx+dx,by+dy,bw,bh)) { return 0; // ぶつからなかったら 0を返す } if (isOverlap(x,y,w,h,bx+dx,by,bw,bh)) xflag = 1; if (isOverlap(x,y,w,h,bx,by+dy,bw,bh)) yflag = 2; if (xflag + yflag > 0) { return xflag + yflag;} return 3; } -racket_function- /* checkAndShowRacket() float r_y; // r_hはラケットのy座標 */ boolean checkAndShowRacket(float r_y) { boolean hit = false; // 最初は false なのでなにもなければ falseが返る float r_x = mouseX; // r_x はラケットの左側のx座標 if (r_x + r_w > width) { // 右に寄りすぎていたら補正する r_x = width - r_w; } /* ブロックがぶつかっていたら上に跳ね返る */ if (blockHitCheck(r_x, r_y, r_w, r_h, x, y, b_w, b_h, dx, dy) > 0) { dy = -(dy+1);//1づつ速くなっていく hit = true; // ぶつかった時は返す値を true に変化させる } if (blockHitCheck(r_x, r_y, r_w, r_h, x1, y1, b_w1, b_h1, dx1, dy1) > 0) { dy1 = -(dy1+1);//1づつ速くなっていく hit = true; // ぶつかった時は返す値を true に変化させる } if (blockHitCheck(r_x, r_y, r_w, r_h, x2, y2, b_w2, b_h2, dx2, dy2) > 0) { dy2 = -(dy2+1);//1づつ速くなっていく hit = true; // ぶつかった時は返す値を true に変化させる } rect(r_x, r_y, r_w, r_h); // racketを表示する return hit; }
TN8001👍を押しています

以下のような質問にはリアクションをつけましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

リアクションが多い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

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

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

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

下記のような質問は推奨されていません。

  • 間違っている
  • 質問になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

適切な質問に修正を依頼しましょう。

まだ回答がついていません

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

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

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

ただいまの回答率
86.12%

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

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

質問する

関連した質問

同じタグがついた質問を見る

Processing

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