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

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

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

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

Q&A

解決済

3回答

9713閲覧

Processingで右から左に連続で途切れることなく文字を表示するにはどうしたらいいでしょうか

tyanoma123

総合スコア15

Processing

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

0グッド

0クリップ

投稿2019/06/04 14:12

編集2019/06/05 12:46

Processingで右から左に連続で途切れることなく文字を表示するにはどうしたらいいでしょうか。
お店の宣伝で使われている電光掲示板のように”EIGHTEIGHTEIGHT…”と繰り返し永久に文字が流れるようにしたいです。

float x;
PFont font;
String msg = "EIGHT";
float speed = -1;

void setup() {
size(400, 200);
font = loadFont("Calibri-BoldItalic-48.vlw");
textFont(font);
textSize(32);
x = width;
}
void draw() {
background(255);
fill(0);
float msgWidth = textWidth(msg);
text(msg, x, height/2);
x = x+speed;
}

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

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

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

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

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

guest

回答3

0

for文を使って同じ処理を繰り返してみるのはいかがでしょうか。
参考文献記載しておきます。
繰り返しループ

投稿2019/06/04 15:00

ices_sinon

総合スコア479

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

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

tyanoma123

2019/06/05 14:37

掲載していただいたページ、とても参考になりました。ありがとうございました。
guest

0

ベストアンサー

追記:最初の回答は質問意図をつかめてなかったため追記の形でコメントします。

まずはウィンドウの幅いっぱいに"EIGHT"を並べる処理を書いてみてください。動かすのはその後で考えましょう。
前回の回答に書いた考え方(各関数や変数が何を意味しているか)も参考になるのではないでしょうか?繰り返し処理についてはices_sinonさんが記述例と実行例が載っているページを紹介してくださってます。そのあたりも参考にしながら考えてみてください。

以下は元の回答

連続で途切れることなく

この正確な意味がはっきりわかりませんが、「画面左端から消えたら再び右から出現する」ということでよいなら、xがある限界より小さくなったときに再度右端の座標に設定しなおせばよいです。

text(msg, x, ...)としていることから変数xはテキストの左端の座標であることがわかります。msgxからx + msgWidthの区間に表示されるのですが、ウィンドウの座標は左端が0、右端がwidthとなりますので、テキストが画面左側から消えるときのxの値は-msgWidthになるはずです。

よって以下のようにすればよいでしょう。

processing

1... 2 3void draw() { 4 ... 5 x = x + speed; 6 7 // ここで以下の処理を追加 8 if (x < -msgWidth) { 9 x = width; 10 } 11}

投稿2019/06/04 18:00

編集2019/06/05 13:26
KSwordOfHaste

総合スコア18394

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

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

tyanoma123

2019/06/05 10:36

説明不足で申し訳ございません。 お店の宣伝で使われている電光掲示板のように”EIGHTEIGHTEIGHT…”と繰り返し永久に文字が流れるようにしたいです。
KSwordOfHaste

2019/06/05 11:24

質問文の記述が不十分だったということですね。 それならコメント欄に書くのではなく質問文を編集してください。閲覧者は回答のコメント欄を一々みたりしないかも知れませんよね?だから質問内容は質問文にかくべきなのです。 自分はわかっているつもりでも他者に正確に伝わらないことはままあります。できだけ正確に丁寧に書くようお願いします。
tyanoma123

2019/06/05 12:53

アドバイスありがとうございました。質問文を編集させていただきました。
tyanoma123

2019/06/05 14:36

何度もお時間を取らせてしまい申し訳ありませんでした。なんとか制作できました。回答ありがとうございました。
thkana

2019/06/05 15:10

PFontで用意した文字サイズとtextSizeで指定した文字サイズが異なると、私の手元ではtextWidthの計算が多少ずれることがあるようです。特に事情がないのであれば合わせたほうがよさそう。
KSwordOfHaste

2019/06/05 17:40

フォントによってそういうことがあるのでしょうかね・・・ "Calibri-BoldItalic-48.vlw"の例で言えば48, 32, 16の3種類ぐらい試してみましたが特に違和感が感じられませんでした。
thkana

2019/06/05 21:43

手元で検討していたソースだと、ちょっとカクカクが見えたので。 とりあえず別回答に載せときます。Windows 10上で試しましたが、何かしら環境依存があるかも知れませんね。
guest

0

KSwirdOfHasteさんのコメント欄のネタ。元の質問と関係ないわけでもないので解答欄で書いておきます。

PFontのサイズ(ファイル生成が面倒なのでcreateFontでやってます。これの影響の有無は確認していないのですが...)とtextSizeが異なると「カクカク」します。
ご参考まで。

Processing

1float x; 2PFont font; 3String msg = "EIGHT"; 4float speed = -1; 5String msgLine=""; 6float msgWidth; 7 8void setup() { 9 size(400, 200); 10 //font = loadFont("Calibri-BoldItalic-48.vlw"); 11 font = createFont("Calibri Bold Italic",48);//2番めのパラメータを32にするとカクカクしない 12 textFont(font); 13 textSize(32); 14 x = width; 15 msgWidth=textWidth(msg); 16 for(int i=0;i<(int)(width/msgWidth)+2; i++){ 17 msgLine+=msg; 18 } 19} 20 21void draw() { 22 background(255); 23 fill(0); 24 text(msgLine, x, height/2); 25 x = x+speed; 26 if(x<-msgWidth){ 27 x=0; 28 } 29}

投稿2019/06/05 21:43

編集2019/06/05 21:44
thkana

総合スコア7629

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

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

thkana

2019/06/05 21:48

noSmooth(); しとかないと描画が微妙にぶれたりしますがそれは別件。
KSwordOfHaste

2019/06/06 01:19

再現しました(Windows 10)textWidthの結果が違うのが原因のようです。 createFont: 48, textFont: 32 -> 86.074127 createFont: 32, textFont: 32 -> 80.562500 となりました。createFontで作ったフォントの場合、textSizeの指定はtextWidthの結果に影響しないみたいです。86.0...はtextSizeが48のときの幅です。なんだかバグのような気がしますが探し方が悪いのかprocessingやstackoverflowからこのトピックを見つけられませんでした... この件とは直接関係ないですが、スムーズに動かすために if (x < -msgWidth) {x = 0; } よりも if (x < -msgWidth) {x += msgWidth; } の方がいいような気がします。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問