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

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

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

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

Q&A

0回答

1300閲覧

Processing ブロック崩し

退会済みユーザー

退会済みユーザー

総合スコア0

Processing

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

0グッド

0クリップ

投稿2021/06/14 13:00

Processingで簡単なブロック崩しを作っています。
ブロックにボールが1回当たるとA~Zのうちランダムの一文字が表示され、その表示されたアルファベットを入力するとブロックが消えるという機能を付けたいです。(つまり2段階)
"表示されたアルファベットを入力すると消える"というのができていません。
教えていただけると幸いです。

該当のソースコード

float gameCR;//画面管理
float bx = 450, by = 340, br = 40;//ボールのx,y座標と直径
float bspx, bspy;//ボールの速度
float boast = 1.03;//ボール加速3%
int score;

void setup() {
size( 1200, 800 );//画面の大きさ
colorMode( HSB, 100, 100, 100 );
frameRate(100);

gameFS();//画面の初期化

//ボール速度定義
bspx = 2.0;
bspy = 2.0;

setupBlockLetter();
}

void draw() {
background( 55, 0, 60 );
if ( gameCR == 0 ) {
gameTitle();//タイトル画面
} else if ( gameCR == 1 ) {
gamePlay();//プレイ画面
} else {
gameSet();//終了画面
}
}

//各画面でのアクション
void gameFS() {
gameCR = 0;
bx = 450;
by = 340;
bspx = 2;
bspy = 2;
score = 0;
for (int i=0; i < block.length; i++) {
for (int j=0; j < block[i].length; j++) {
block[i][j] = 2;
}
}
}
void gameTitle() {
Maintitle();
}
void gamePlay() {
cursol();//カーソル自体
cursolmv();//カーソルの動き
ball();//ボール自体
ballmv();//ボールの動き
block();//ブロック自体
}
void gameSet() {
textSize(140);
fill(84, 69, 100);
text( "GAME OVER", 350, 300 );
textSize(80);
fill(78, 100, 74);
text( "CLICK TO RETRY", 420, 700 );
}

//画面移行
void mousePressed() {
if ( gameCR == 0 ) {
gameCR=1;
return;
}
if ( gameCR == 2 ) {
gameFS();
}
}

void Maintitle(){
textSize( 180 );
fill( 84, 69, 100 );
text("WARD BLOCK", 290, 300);
}

int a=0;
boolean plusFlg = true;
int iro2 = (int)random(0, 100);

void ball() {
int iro = a%101;
if (iro >= 100) {
iro2 = (int)random(0, 100);
}

fill(iro, iro2, 100);
circle(bx, by, br);

if (iro>=100) {
plusFlg = true;
}
if (plusFlg == true) {
a = a+1;
} else {
a = a-1;
}
}

void ballmv() {
nextx = bx;
nexty = by;
bx += bspx;
by += bspy;
if (by > height) {
gameCR = 2;
}
if ( bx + br/2 > width ) bspx *= -1;
if ( bx - br/2 < 0 ) bspx *= -1;
if ( by - br/2 < 0 ) {
by = br/2;
bspy *= -1;
}

//ボールとカーソルの当たり判定
if ( ( bx + br/2 > mouseX && bx - br/2 < mouseX + cw ) //x座標に対して
&&( cy < by+br/2 && by+br/2 < cy+ch ) ) { //y座標に対して
bspy = -bspy*boast;
}
}
int[][] block= new int[12][5];
char[][] blockLetter = new char[12][5];
float nextx, nexty;//ブロック判定を定義

//ブロック
void block() {
int blx, bly;//ブロックのx座標とy座標
for ( int i = 0; i < block.length; i++ ) {
for ( int j = 0; j < block[i].length; j++ ) {
if ( (i+j)%2 == 0 ) {
fill( 64, 46, 100 );
} else {
fill( 64, 20, 100 );
}
if (block[i][j] > 0) {
blx=100i;
bly=40
(j+1);
blockHitCheck(i, j, blx, bly);//当たり判定を定義

rect( blx, bly, 100, 40); textSize( 20 ); fill(0); text(Character.toUpperCase(blockLetter[i][j]), blx+45, bly+25); stroke( 13, 76, 86 ); strokeWeight( 2 ); } }

}
}

//ブロックとボールの当たり判定
void blockHitCheck(int ii, int jj, int blx, int bly ) {
if ( !((blx < bx) && (blx+95 > bx) && (bly < by) && (bly+35 > by)) ) {
return;
}
block[ii][jj] = 1;
if (block[ii][jj] == 1 && blockLetter[ii][jj] == 0x0) {
int r = int(random(0, 25));
char letter = (char)(97+r);
blockLetter[ii][jj] = letter;
}
//ここから上、左右のブロック当たり判定
if ( (nextx > blx) && (blx+100 > nextx) ) {
bspy = -bspyboast;//上下のブロック当たり判定
return;
}
if ( (nexty > bly) && (bly+40 > nexty) ) {
bspx = -bspx
boast;//左右のブロック当たり判定
return;
}
bspx = -bspxboast;
bspy = -bspx
boast;
}

float cx = 600, cy = 700;//カーソルのx,y座標
float cw = 100, ch = 20;//カーソルの幅、高さ

//カーソル
void cursol() {
fill( 0, 0, 100 );
rect( cx, cy, cw, ch, 5);
}
void cursolmv() {
cx = mouseX;
if (( cx + cw > width )) {
cx = width - cw;
}
}

void setupBlockLetter() {
for(int i = 0; i < blockLetter.length; i++) {
for(int j = 0; j < blockLetter[i].length; j++) {
/*
int r = int(random(0, 25));
char letter = (char)(65+r);
blockLetter[i][j] = letter;
*/
blockLetter[i][j] = (char)0;
}
}
}

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

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

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

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

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

thkana

2021/06/14 13:49

簡単だというのなら自分で考えてください、と言いたくなったり。で、「作っている」のですね? 質問に書いてあるプログラムはしっかり理解しているという前提でいいですね? さて、 「アルファベットを入力」するのはどういう手段を使いますか? ブロックが消えるというのはどういうことですか? 考えていることを教えて下さい。
退会済みユーザー

退会済みユーザー

2021/06/14 14:26

「アルファベットを入力」するのはどういう手段を使いますか? >>keyTyped()などを用いて入力する。実際にこのことを実現するために以下のようなコードを書いたのですが上手くいきませんでした。 void keyTyped() { for (int i = 0; i < block.length; i++) { for (int j = 0; j < block[i].length; j++) { if (key == block[i][j]) { block[i][j] = 0; } } } } ブロックが消えるというのはどういうことですか? >>配列されているブロックが一つ一つ消えるということです。
thkana

2021/06/14 14:57

「上手くいきませんでした」は技術系の質問においてはNGワードと思ってください。それは「思った結果と違った」というあなたの不満をいうだけの言葉です。技術者としては、「期待した結果はこうだったが、そうではなくこういう現象が発生した(観測できた)」ということを説明してください。それが「何でそうなったのか」「どうすれば期待する結果が出るようにできるか」という展開につながります。 で、そのkeyTyped関数は「キーを入力」していないように思うのですがいかがでしょう? key変数は最後に押されたキーのキーコードを保持しているということは言えますが。 >配列されているブロックが一つ一つ消えるということです。 ちょっと言葉が足りませんでしたね。それはプログラム上ではどうやったら表せますか、ということでした。まぁ、答えはすでに書かれているようですが。
TN8001

2021/06/14 21:43

@Rim2さん > if (key == block[i][j]) { 文字が入っている配列はblockLetterのつもりではないのですか?(blockにまとめてもいいとは思いますが)
退会済みユーザー

退会済みユーザー

2021/06/15 00:10

@TM8001さん ご指摘の通りでした。 教えていただきありがとうございます。
thkana

2021/06/16 22:11

解決したのなら解決した方法を自己解決として回答に記しておいてください。 感想レベルで言えば、ブロックに関する情報をBlockクラスとでも言うものを設けてまとめておいて、ブロックの状態とか割り当てられた文字をフィールドにしていれば発生しない間違いかなぁ、などと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問