匿名質問者

Processingを使いプログラミングの勉強しています。

独学なのですが、配列の部分で躓いたので質問させていただきます。

キーボードで入力すると、入力された文字がa b cならば、aとbとcがそれぞれランダムな位地に描写されて、それぞれが上から下へ落下するスケッチを作りたいのですが、イマイチうまく行きません。

キーボードで入力された文字を画面に表示することは出来ました。入力された文字を一文字ずつ配列に格納して、格納された文字にそれぞれアクセスするのが良いと思うのですが、いまいちやり方がわかりません。

何か良いアドバイスがあれば頂きたいです。

ちなみに文字を表示するコードは以下のとおりです。サンプルのままですが念のため公開します。


PFont font;
char keydata = ' ';

void setup()
{
font = loadFont("ArialMT-24.vlw");
}

void draw()
{
fill(0);
stroke(0);
rect(0,0,width,height);

fill(255);
textFont( font );
text( keydata, 50, 50 );
}

void keyPressed()
{
keydata = key;
}

回答の条件
  • 1人5回まで
  • 登録:
  • 終了:2014/08/28 15:15:03

回答2件)

匿名回答1号 No.1

Processingについては全く触れたことがないのですが、どんな言語を使用するにしても、物を動かすにはアニメの手法と同じく、コマを動かさなければいけません。アニメの場合は単に絵を差し替えるだけで十分なわけですが、CGの場合だと、すでに表示されている絵を一旦消して、同じキャンバスの上に新しい絵を再作画するというのが一般的な手法になるかと思われます。

すると必要なのは、思い描く座標の変化を実現させるための関数と、その関数を指定回実行するためのループ構造という事になりそうです。一見したところ、文字表示に関する部分は

text( keydata, 50, 50 );

の部分のみかと思います。X座標50、Y座標50に表示、といったところでしょう。説明するまでもない事とは思いますが、2つの変数にランダムな数値を取得させて、その2つの変数をX座標、Y座標に割り当てるならば、ランダムな位置に表示するというところまではたやすく実現できるでしょう。まずはここまで確認してみてください。

次に関数部分、と言っても下に落ちるだけの単純な変化のようなので、X座標はいじらず、Y座標だけ変化させればいい事になります。これはループ構造を用いて、Y座標を1ずつ増加させていくだけで十分でしょう。Y座標に用いる変数が画面の一番下の座標に到達した時がループの終了条件です。そして、このループ内で、消しては作画を繰り返すことによって、落下する動作を実現できるものと思います。と、ここまでは基本のお話しです。


よくわからないのは配列に言及していることで、例えば割り込み命令をサポートしている言語であれば、この構造1つあれば同時に複数実行することも可能なわけなのですが、そうではない、昔ながらのシークエンスな流れしか実行できない言語であるならば、複数の動作を同時に実行するために、かなり複雑な関数を自前で用意しないといけなくなります。つまり、もしProcessingが後者に属するのであるならば、割り込みをサポートしていない言語を用いて複数の動作を同時に実行するという、最も苦手な分野にわざわざ手を出そうとしているのではないか、とすら思えて仕方がありません。

他1件のコメントを見る
匿名回答1号

調べた限りでは、noLoop, loop など、drawにおけるループを制御するための命令が実際に存在するようですが、そちらの理解は十分ですか?

また、バージョンが異なるのかわかりませんが、for文でループをさせているようなサイトも存在しました。
http://www.d-improvement.jp/learning/processing/06.html

> 自分でループを書く必要はありません。

というのが事実であれば、あなたはどのようにして目的の動きを再現させるつもりなのでしょう?

2014/08/23 17:59:45
匿名回答2号

やっぱり Processing を使ったことが無いんだw

2014/08/24 12:17:27
匿名回答2号 No.2

いろいろと欲張らずに、単純なところから少しずつ理解しながら進めていった方が良いと思いますよ。
どれくらいプログラミングの経験があるのかわかりませんが、質問に書いたサンプルで止まっているのであれば、次は動かすことです。
フォントのあたりを端折ってますが、1文字を動かすならこのような感じのソースになります。

char ch;
float x, y;

void setup() {
    x = -1;
    y = -1;
    ch = ' ';
}

void draw() {
    fill(0);
    stroke(0);
    rect(0,0,width,height);

    if (x >= 0) {   // x >= 0 はキーが押された目印になる
        fill(255);
        text(ch, x, y);
        y += 1;
        if (y > height) {   // 画面の範囲を超えたら止める
            x = -1;
        }
    }
}

void keyPressed() {
    ch = key;
    x = random(width);
    y = random(height / 2);     // あまり下に表示されるとつまらない
}

匿名1号がコメントの中で書いたURLのサイトであれば、こちらのページの方がやりたいことの参考になるでしょう。
http://www.d-improvement.jp/learning/processing/2011-b/01.html

1文字動かすコードが理解できたら、次は複数回入力されたキーの内容を覚えておく(配列の使い方)のが、次のステップになると思います。

Processing のプログラムが組めるようになりたいというわけではなく、理解なんかできなくても動くプログラムのソースが欲しいんだということであれば、ポイント付きの質問で出せば誰か書いてくれるんじゃないかと思いますww

他1件のコメントを見る
匿名回答2号

余計なお世話かもしれませんが、こういうのは匿名で質問しない方が良いと思いますよ。
ポイントをつける/つけないは別としても、質問の履歴や、ダイアリーを質問者が見られるということで、適切な回答がもらえる可能性が高くなります。
Processing の他に PHP の経験があるんだ、とか、他の言語も含めて Processing が初めて体験する言語なんだとか、そういった情報があると回答の書き方も変わってきますので。

2014/08/24 16:36:55
匿名質問者

了解しました。今回は人力検索はてながプログラミングの学習にどれくらい役立てるか実験的な意味合いもあったのでとりあえず匿名で投稿させていただきました。今回のやりとりを経て、やはり匿名だとうまくいかないことがわかりました。次回からはもうすこし工夫します。

2014/08/24 16:42:00

コメントはまだありません

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません