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

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

新規登録して質問してみよう
ただいま回答率
87.20%
コードレビュー

コードレビューは、ソフトウェア開発の一工程で、 ソースコードの検査を行い、開発工程で見過ごされた誤りを検出する事で、 ソフトウェア品質を高めるためのものです。

Processing

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

解決済

ブロック崩しについて

sirasus0623
sirasus0623

総合スコア1

コードレビュー

コードレビューは、ソフトウェア開発の一工程で、 ソースコードの検査を行い、開発工程で見過ごされた誤りを検出する事で、 ソフトウェア品質を高めるためのものです。

Processing

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

1回答

1評価

1クリップ

367閲覧

投稿2022/06/16 09:08

processingでブロック崩しを作っています。

前提

processingでブロック崩しを作りたい。

画面をクリックするとスタートするようにしているのですが、クリックしてもボールが動きません。この原因が分かりません。
また、上から降ってくる玉が自機に当たるとダメージを受けてしまい、3回当たると失敗
という風ににしたいのですが、実行すると当たってないのに体力が減ってしまいます(当たり判定がおかしい)
どのようにすれば解決できるか教えていただけたらありがたいです。
よろしくお願いします。

実現したいこと

始めに画面をクリックしたらボールが動き、ゲームが始まる。

発生している問題・エラーメッセージ

・始めに画面をクリックしてもボールが動かない
・降ってくる玉と自機との当たり判定がよくわからない

該当のソースコード

processing

int block[][] = new int[10][10]; float x, y =60; float b_w = 10, b_h = 10, dx, dy; float r_w = 50.0, r_h = 3.0; int hp = 3; int enemy_x[]=new int[10]; int enemy_y[]=new int[10]; int enemy_speed[]=new int[10]; int r_x = mouseX; int r_y = height-50; int gseq; int mcnt; void setup() { size(600,700); initBall(); initBlocks(); showEnemy(); } void draw() { background(192, 192, 255); rect(x, y, b_w, b_h); // ball if(gseq == 0){ gameTitle(); }else if(gseq == 1){ x += dx; // dx は1フレームごとにx方向に動く距離(速度) y += dy; // dy は1フレームごとにy方向に動く距離(速度) gameplay(); }else{ gameover(); } checkBlocks(); showBlocks(); checkAndShowRacket(height-50); // 壁との衝突 if (y + b_h >= height) { //initBall(); initBlocks(); gseq = 2; } if (x < 0 || x+b_w >=width) {dx = -dx;} if (y < 0) {dy = -dy;} } void initBall() { x = 40; y = 400; dx = 1; dy = 2; } float bw, bh = 40.0; /* 10個のブロックを初期化する */ void initBlocks() { for(int j=0; j<3; j++){ for (int i = 0; i < block.length ; i++) { block[i][j] = 1; } bw = width / block.length; // ブロックの幅を決める } } /* 10個のブロックのどれかにぶつかっていたら跳ね返る */ void checkBlocks() { for (int j = 0; j < 3; j++) { for (int i = 0; i < block.length ; i++) { if (block[i][j] > 0) { int ret = blockHitCheck(i*bw,j*bh+200,bw,bh,x,y,b_w,b_h,dx,dy); if (ret > 0) { if (ret == 1) { dx = -dx; block[i][j]--; } else if (ret == 2) { dy = -dy; block[i][j]--; } else if (ret == 3) { dx = -dx; dy = -dy; block[i][j]--; } return; } } } } } /* 10個のブロックを表示する */ void showBlocks() { for (int j = 0; j < 3; j++) { for (int i = 0; i < block.length ; i++) { if (block[i][j] > 0) { fill(255); rect(i * bw, j*bh+200, bw, bh); // ブロックの形の表示 } } } } void enemymove(){ for(int i=0;i<10;i++){ fill(255,0,0); rect(enemy_x[i],enemy_y[i],10,10); enemy_y[i]+=enemy_speed[i]; if(enemy_y[i]>height){ enemy_x[i]=int(random(width)); enemy_y[i]=-50; enemy_speed[i]=int(random(2,6)); } } } void hitEnemy(){ for(int i=0;i<10;i++){ if((enemy_x[i]<r_x+50 || r_x<enemy_x[i]) && enemy_y[i]==r_y){ hp=hp-1; } } } void showMyhp(){ fill(255); text("hp:"+hp,10,30); } void showEnemy(){ for(int i=0;i<10;i++){ enemy_x[i]=int(random(width)); enemy_y[i]=-50; enemy_speed[i]=int(random(2,6)); } } /* ふたつの長方形が重なるかどうかをしらべて、 重なったとき: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; } /* checkAndShowRacket() float r_y; // r_hはラケットのy座標 */ void checkAndShowRacket(float r_y) { 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 = -2; } rect(r_x, r_y, r_w, r_h); // racketを表示する } void gameTitle(){ checkAndShowRacket(height-50); showBlocks(); mcnt++; if((mcnt%60)<40){ textSize(20); fill(255,0,0); text("Click to start!!", 220,400); } } void gameInit(){ x += dx; // dx は1フレームごとにx方向に動く距離(速度) y += dy; // dy は1フレームごとにy方向に動く距離(速度) gseq = 0; //initBall(); showBlocks(); mcnt = 0; } void gameplay(){ x += dx; // dx は1フレームごとにx方向に動く距離(速度) y += dy; // dy は1フレームごとにy方向に動く距離(速度) checkAndShowRacket(height-50); showBlocks(); initBall(); enemymove(); hitEnemy(); showMyhp(); } void gameover(){ checkAndShowRacket(height-50); showBlocks(); textSize(50); fill(0); text("GAME OVER", 200, 500); mcnt++; if((mcnt%60) < 40){ textSize(20); fill(0); text("Click to retry!!", 170,400); } } void mousePressed(){ if(gseq == 2){ gameInit(); return; } if(gseq == 0){ gseq = 1; } }

試したこと

ボールが動かないことに関しては、gameplay()やgameInit()の中を色々変えてみた。
当たり判定に関しては、ボールと同じようにやろうとしたが、分からなくなった。

良い質問の評価を上げる

以下のような質問は評価を上げましょう

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

評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

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

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

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

teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

  • プログラミングに関係のない質問
  • やってほしいことだけを記載した丸投げの質問
  • 問題・課題が含まれていない質問
  • 意図的に内容が抹消された質問
  • 過去に投稿した質問と同じ内容の質問
  • 広告と受け取られるような投稿

評価を下げると、トップページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

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

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

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

ただいまの回答率
87.20%

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

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

質問する

関連した質問

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

コードレビュー

コードレビューは、ソフトウェア開発の一工程で、 ソースコードの検査を行い、開発工程で見過ごされた誤りを検出する事で、 ソフトウェア品質を高めるためのものです。

Processing

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