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

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

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

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

Q&A

解決済

2回答

400閲覧

Processing Java mousePressed

Tara_tara

総合スコア13

Processing

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

1グッド

0クリップ

投稿2022/06/19 05:36

編集2022/06/19 06:12

訳があって画像を貼ることは出来ないのですがmousePressedがマウスを押したときだけにしかTrueにならないのでlineを引いて右側からif(mousePressed)でlineのX座標を-方向に短くしたとしても、マウスボタンを離すとすぐに戻ってしまいます。mousePressedを使っている状態でも元に戻らずにそのままの状態にする方法はありますか?
ちなみにmousePressed==trueやboolean型の変数を試してみたりもしたのですが出来なかったです。
draw() {
mpos();
}
void mpos () {
int s;
s=100;
line(100,100,100+s,100);
if(mousePressed) {
s-=5;
}
}

TN8001👍を押しています

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

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

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

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

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

thkana

2022/06/19 05:59 編集

「lineのX座標を-方向に短く...戻ってしまいます」とかの話は、あなたの頭の中の図を共有していない回答者には説明になりません。 画像は要りませんが、ソースコードは提示して下さい。 https://teratail.com/help/question-tips#questionTips35 を見ると 「最も良いのは、現象を再現するためのミニマムなプログラムを改めて作ることです。」 とあります。良い方法を選択してください。 > mousePressed==trueやboolean型の変数 これも、具体的に「こうしたら」「こうなった」についての観察できる事実の記載がないと情報として無意味です。解決に役立つのはあなたの頑張ったアピールではなく、プログラム/ソースコードの状態についての「事実」です。
guest

回答2

0

そのプログラム、やっていることは以下のようになるはずです。是非「声に出して」読んでみてください。

  • draw()関数を繰り返し実行します。draw()関数に入ると...
  • mpos()関数を呼び出します。mpos()関数の中では
  • 変数sを宣言しsに100を代入します
  • 100,100 から 100+s,100に線を引きます。sは先程100を代入しているので常に100です。 結果、100,100から200,100に線が引かれます。
  • もしマウスボタンが押されていたら、sから5を引きます。sは95になります。
  • (sはローカル変数なので、値は捨てられて)mpos()関数を終了してdraw()に戻ります。
  • draw()関数を終了します。

質問には、

マウスボタンを離すとすぐに戻ってしまいます

とありますが、このプログラムでは100,100から200,100以外の線は引かれないはずですが、短くなった線が実際に描画されているのですか? ならば、あなたが見ているソースコードと実行しているプログラムは別のもの、ということになります。とても重要なことなので確認してください。

元に戻らずにそのままの状態にする方法はありますか?

ローカル変数は関数が終わると寿命を終えてなくなってしまいます。関数を抜けても「そのまま」を保持するのならグローバル変数を使用して下さい。もちろん、なにか代入した途端にそれまでの値は失われますから、余計な代入はしてはいけません。

投稿2022/06/19 06:24

編集2022/06/19 06:24
thkana

総合スコア7652

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

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

0

ベストアンサー

訳があって画像を貼ることは出来ないのですが

画像は貼らないでいいのでコードを提示してください。
もちろんすべてのコードを出す必要はなく、現象を説明できる(かつ実行できる)最低限のコードで十分です。

mousePressedがマウスを押したときだけにしかTrueにならない

mousePressedはそういうものですからね^^;
mousePressed / Reference / Processing.org

boolean型の変数を試してみたりもしたのですが出来なかったです。

この方針でできると思うのですが、どううまくいかなかったですか?

Processing

1boolean b; 2 3void setup() { 4 size(400, 300); 5} 6 7void draw() { 8 background(255); 9 10 if (mousePressed) { // マウスが押されたらboolean型の変数をtrueに 11 b = true; 12 } 13 14 if (b) { // boolean型の変数の状態を見て長さを切り替える 15 line(0, 100, width/2, 100); 16 } else { 17 line(0, 100, width, 100); 18 } 19} 20 21//void mousePressed() { // こうでも同じ 22// b = true; 23//}

こういうこと?

Processing

1boolean select; // マウスが一度でも押されたらtrueになるboolean型のグローバル変数 2int g_cm = 100; // あるいは長さのほうをグローバル変数にするか 3 4void setup() { 5 size(700, 710); 6} 7 8void draw() { 9 background(255); 10 battle(); 11} 12 13void battle() { 14 int cm = 100; 15 if (select) { 16 cm -= 5; 17 } 18 19 if (mousePressed) { 20 if (mouseButton == LEFT) { 21 if (mouseX > 25 && mouseX < 345 && mouseY > 455 && mouseY < 570) { 22 select = true; 23 g_cm = 95; 24 } 25 } 26 } 27 28 rect(25, 455, 320, 115); 29 line(210, 240, 210 + cm, 240); 30 line(400, 140, 400 + g_cm, 140); 31}

投稿2022/06/19 06:15

編集2022/06/19 06:59
TN8001

総合スコア9363

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

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

Tara_tara

2022/06/19 06:30

試してみましたが変化しなかったです。 変更前のソースコードです。 int xspeed,yspeed; int x,y; int battleMode; boolean select=false; void setup() { size(700,710); x=350; y=350; grass_field(); } void draw() { background(255); int w,h,ew,eh; float c=x_rdpos(0); float d=y_rdpos(0); w=30; h=30; ew=30; eh=30; x+=xspeed; y+=yspeed; if(battleMode==0){ grass_field_enemy(c,d,ew,eh); rect(x,y,w,h); if(c<x+w && x<c+ew && d<y+h && y<d+eh){ battleMode+=1; } } if(battleMode==1){ battle(); } } void keyPressed() { if(keyCode==RIGHT) { xspeed=8; } if(keyCode==LEFT) { xspeed=-8; } if(keyCode==UP) { yspeed=-8; } if(keyCode==DOWN) { yspeed=8; } } void keyReleased() { if(keyCode==RIGHT || keyCode==LEFT||keyCode==UP||keyCode==DOWN) { xspeed=0; yspeed=0; } } void grass_field() { int w,h; w=300; h=300; rect(0,0,w,h); } void grass_field_enemy(float a,float b,float ew,float eh) { a=x_rdpos(a); b=y_rdpos(b); rect(a,b,ew,eh); } float x_rdpos(float xr) { xr=random(0,270); return xr; } float y_rdpos(float yr) { yr=random(0,270); return yr; } void battle() { String d="kougeki"; String s="kaihuku"; String f="bougyo"; String k="kaihi"; String p="teki"; String p2="mikata"; float mx=200; float ex=400; int cm; cm=100; ellipse(250,400,160,30); rect(mx,300,100,100); ellipse(445,290,150,30); rect(ex,200,90,90); rect(10,450,width-20,245); fill(255,0,0); rect(25,455,320,115); rect(25,575,320,115); rect(355,455,320,115); rect(355,575,320,115); textSize(25); fill(0); text(p,350,150); line(400,140,400+cm,140); text(p2,130,250); line(210,240,210+cm,240); text(d,150,520); text(s,150,635); text(f,465,520); text(k,475,635); if ( mousePressed){ if (mouseButton==LEFT){ select=true; if(select==true){ if ( mouseX > 25 && mouseX < 345 && mouseY > 455 && mouseY < 570){ cm-=5; } else if ( mouseX > 25 && mouseX < 345 && mouseY > 575 && mouseY < 690 ){ line(mouseX,mouseY,pmouseX,pmouseY); } else if ( mouseX > 355 && mouseX < 675 && mouseY > 455 && mouseY < 570 ){ rect(0,0,100,100); } else if ( mouseX > 355 && mouseX < 675 && mouseY > 575 && mouseY < 690 ){ rect(0,0,100,100); } } } } }
TN8001

2022/06/19 06:44

selectとcmのことを言っているんですよね? cmはローカル変数なので使った後に減らしても意味はありません。 line(400,140,400+cm,140); と使うより前に cm-=5; と減っていないといけないわけです。 ifの後に描画周りを持っていきましょう。
TN8001

2022/06/19 06:59

んーーちょっと違うか。 最低限に削って追記しました。こういうことですか?
Tara_tara

2022/06/19 07:21

動きは合っていました。ボタンをクリックした場合、(書き換えていませんでしたが)line(400,140,400+cm,140)のcmを-5して線が消えるまでそれを繰り返そうとしてました。 95にしたい訳ではありません。
TN8001

2022/06/19 07:23

じゃあ0になるまで g_cm -= 5; でいいのでは?
Tara_tara

2022/06/19 07:40 編集

解決しました。ありがとうございます
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.47%

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

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

質問する

関連した質問