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

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

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

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

Q&A

2回答

933閲覧

3回キーボードを打ったら、出ている文章が変化するにはどうすればいいですか

honey_8t1

総合スコア5

Processing

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

0グッド

1クリップ

投稿2020/01/10 07:21

前提・実現したいこと

processingのコードでどのように打てばいいかわからず苦戦しています。

最初に「材料を入れる」の文章が出ている状態で、材料を3つ(A,B,C)を押したら「まぜる」という文章が入れ替わりで出るようにしたいです。

また、「まぜる」の後に57行目~59行目(Hera)をleft、rightを使い
左右に切り替わるように動かしたいです

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

//heraの部分がたくさん出てきてしまう

該当のソースコード

PFont myfont; float x = 250; //float speed = 3.0; void setup() { size(500, 500); myfont = createFont("MS Gothic",48); textFont(myfont,48); textSize(20); background(255, 255, 255); rect(150, 80, 200, 150); fill(255, 249, 137);//egg ellipse(85, 350, 100, 100); fill(154, 232, 234);//milk ellipse(250, 350, 100, 100); fill(252, 173, 69);//flour ellipse(415, 350, 100, 100); fill(149,80,33); textSize(40); text("A",75,450); text("B",240,450); text("C",405,450); } void draw() { fill(149,80,33); textSize(20); text("材料を入れてね",185,270); if (keyPressed) { if((key=='a')|| (key=='A')){ fill(250,237,88); rect(150, 80, 200, 150); }else if((key=='b')|| (key=='B')){ fill(250,236,159); rect(150, 80, 200, 150); }else if((key=='c')|| (key=='C')){ fill(250,218,129); rect(150, 80, 200, 150); }if (key == CODED) { }if (keyCode == RIGHT) { x += 50; } if (keyCode == LEFT) { x -= 50; } fill(252,196,239); rect(x,60,10,80); ellipse(x+5,150,30,40);//hera }else if((key=='k')|| (key=='K')){ background(255,255,255); fill(142,155,160); ellipse(250,200,300,150); } }

試したこと

ここに問題に対して試したことを記載してください。

補足情報(FW/ツールのバージョンなど)

ここにより詳細な情報を記載してください。

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

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

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

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

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

guest

回答2

0

タイトルは「3回キーボードを押したら云々」、発生している問題は「heraがたくさん」
問題はどっち? 両方? だろうね。

アニメーションの基本ってのは、次の画で変わるところを消して、新しい画を描いてやると動いているように見える、ということです。前の画を消さなければ当然前の画に重なった画が描かれるでしょう。ただ、部分だけ消すというのが大変なら全画面を消して、画を全部書き直した方が楽かも知れません。
画面を消す、というか単色で塗りつぶすbackground()という関数で画面クリアして、必要な画を描き直すというのがよく使われる手です。これは既に他の回答に紹介されているので略。

「まぜる」という文章が入れ替わりで出るようにしたいです

Processingでは、draw()が繰り返し実行されるという動作の仕方をします。ですから、draw()に入ったら"材料を入れる"を表示するべきときなのか、"まぜる"を表示するべきときなのかをざっくりとわけてやる必要があります。「今なにをすべきなの?」を表す変数を設けてそれでざっくり切り替えてやればいいでしょう。キーが押されることで「今何をすべきなの?」変数を書き換えてやると、こんなことになります。

Processing

1int status=0; 2void draw(){ 3 background(0); 4 if(status==0){ 5 text("材料を入れる",0,height/3); 6 }else if(status==1){ 7 text("まぜる",0,height*2/3); 8 } 9 if(keyPressed){ 10 status=1; 11 } 12}

さて。

3回キーボードを打ったら

3回というのが、a,b,c各一回とは限らないけど...まぁいいか。

keyPressedは「キーが押されたら」真になるというよりは「キーが押されていると」真になる変数です。

Processing

1int count=0; 2void draw(){ 3 background(0); 4 if(keyPressed){ 5 ++count; 6 } 7 text("押された回数"+count, 0,height/3); 8 text("押されたkey "+key, 0,height*2/3); 9}

とすると、キーをちょんと押しただけでも何度もif文の中身が実行されているのがわかるでしょう。ではどうやって「キーが押された」と「キーが押されている」を区別するのか...直前の状態に注目します。「キーが押された」は、今キーが押されていて、直前はキーが押されていなかった。「押されている」は、今も直前も押されている。では、直前の状態を変数に記録しておきましょう。

Processing

1int count=0; 2boolean prevPressed=false; 3void draw(){ 4 background(0); 5 if(keyPressed){ //今押されていて 6 if( ! prevPressed){//前回は押されていなかったら 7 ++count; //カウンタ増加 8 } 9 prevPressed=true;//今回の状態を保存しておく 10 }else{ 11 prevPressed=false;//今回の状態を保存しておく 12 } 13 text("押された回数"+count, 0,height/3); 14 text("押されたkey "+key, 0,height*2/3); 15}

キーが「押された時」に呼ばれるkeyPressed()関数を使うのももう一つの解決です。調べてみるといいでしょう。

投稿2020/01/12 03:29

thkana

総合スコア7629

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

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

0

へらがたくさん出てしまうのは前に描画したヘラがそのまま残ってしまうからです。
アニメーションにしたい場合は毎フレーム描画し直す必要があります。
( draw()メソッドは1秒間に数十回実行されます。 )
状態によって文章や画面を切り替えるには、現在の状態を記憶する変数を用意してその値によって切り替えるのが一般的だと思います。

PFont myfont; float x = 250; //float speed = 3.0; color col = color(255, 255, 255); //容器の色 int status = 0; //状態(入れたものを記憶しておく) void setup() { size(500, 500); myfont = createFont("MS Gothic", 48); textFont(myfont, 48); textSize(20); } void draw() {  //毎フレーム描画し直す background(255, 255, 255); //前フレームに描画したものを全部消す fill(col); //colは現在の容器の色 rect(150, 80, 200, 150); fill(255, 249, 137);//egg ellipse(85, 350, 100, 100); fill(154, 232, 234);//milk ellipse(250, 350, 100, 100); fill(252, 173, 69);//flour ellipse(415, 350, 100, 100); fill(149, 80, 33); textSize(40); text("A", 75, 450); text("B", 240, 450); text("C", 405, 450); if((status & 7) == 7){ //A,B,Cが全部入っていたらstatusの下位3ビットが立っている fill(149, 80, 33); textSize(20); text("まぜる", 185, 270); fill(252, 196, 239); rect(x, 60, 10, 80); ellipse(x+5, 150, 30, 40);//hera } else{ fill(149, 80, 33); textSize(20); text("材料を入れてね", 185, 270); } if (keyPressed) { if ((key=='a')|| (key=='A')) { col = color(250, 237, 88); //容器の色を変える status |= (1 << 0); //Aを入れたらstatusの1桁目のビットを立てる } else if ((key=='b')|| (key=='B')) { col = color(250, 236, 159); //容器の色を変える status |= (1 << 1); //Bを入れたらstatusの2桁目のビットを立てる } else if ((key=='c')|| (key=='C')) { col = color(250, 218, 129); //容器の色を変える status |= (1 << 2); //Cを入れたらstatusの3桁目のビットを立てる } if (key == CODED) { } if (keyCode == RIGHT) { x += 50; } if (keyCode == LEFT) { x -= 50; } //ヘラが容器の外に出ないようにする if(x < 150-5+15) x = 150-5+15; if(x > 350-5-15) x = 350-5-15; } else if ((key=='k')|| (key=='K')) { background(255, 255, 255); fill(142, 155, 160); ellipse(250, 200, 300, 150); } }

投稿2020/01/10 08:05

編集2020/01/10 08:15
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

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

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

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問