実現したいこと
超簡易的なロボットをつくったのですが、このロボットを左上端から右上端までまっすぐ移動し、そのまま右下端まで下がるというのをしてみたいのですがどのようにすればいいのでしょうか。
複数の図形を動かす方法が、調べても難しくてわからないです。
よろしくお願いいたします。
ロボット
size(500,500);
rect(1,1,10,8);
rect(3,9,5,5);
rect(1,14,10,15);
rect(1,29,3,10);
rect(8,29,3,10);
発生している問題・分からないこと
上記の通りです。宜しくお願い致します。
該当のソースコード
特になし
試したこと・調べたこと
- teratailやGoogle等で検索した
- ソースコードを自分なりに変更した
- 知人に聞いた
- その他
上記の詳細・結果
上記の通りです。宜しくお願い致します。
補足
特になし
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答1件
0
ベストアンサー
複数の図形を同時に動かす方法が知りたいです
まず動きのあるスケッチ(コード)は、setup
とdraw
が必要です。
setup
は初回に1回だけ、draw
は毎フレーム(1秒間に60回)実行されます。
Processing Overview / Processing.org
こういう形になります。
Processing
1void setup() { 2 size(500, 500); 3} 4 5void draw() { 6 background(255); // パラパラまんがのようにぜんぶけす 7 8 rect(1, 1, 10, 8); 9 rect(3, 9, 5, 5); 10 rect(1, 14, 10, 15); 11 rect(1, 29, 3, 10); 12 rect(8, 29, 3, 10); 13}
このロボットを左上端から右上端までまっすぐ移動
動くということは変化する値を覚えておく変数が必要です。
変数の値を徐々に増やしていき、図形のX座標に足していけば右に移動しているように見えます。
Processing
1int x; // へんすう(はじめはゼロ) 2 3void setup() { 4 size(500, 500); 5} 6 7void draw() { 8 background(255); 9 10 rect(1 + x, 1, 10, 8); // しかくをかくXざひょうにへんすうをたす 11 rect(3 + x, 9, 5, 5); 12 rect(1 + x, 14, 10, 15); 13 rect(1 + x, 29, 3, 10); 14 rect(8 + x, 29, 3, 10); 15 16 x++; // xを1ふやす 17}
そのまま右下端まで下がるというのをしてみたいのですがどのようにすればいいのでしょうか。
↑ではそのまま行き過ぎてしまうので、どこかで止めなくてはなりません。
x
を増やすのをやめた時、今度はy
を増やしていきます。
Processing
1int x, y; 2 3void setup() { 4 size(500, 500); 5} 6 7void draw() { 8 background(255); 9 10 rect(1 + x, 1 + y, 10, 8); 11 rect(3 + x, 9 + y, 5, 5); 12 rect(1 + x, 14 + y, 10, 15); 13 rect(1 + x, 29 + y, 3, 10); 14 rect(8 + x, 29 + y, 3, 10); 15 16 if (x < 488) // xが488いかなら... 17 x++; 18 else // そう(xが488いか)でなければ... 19 y++; 20}
今度は下に行き過ぎてしまいました。
y
もどこかで止めるように条件を追加します。
Processing
1int x, y; // へんすう 2 3void setup() { 4 size(500, 500); 5} 6 7void draw() { 8 background(255); 9 10 rect(1 + x, 1 + y, 10, 8); 11 rect(3 + x, 9 + y, 5, 5); 12 rect(1 + x, 14 + y, 10, 15); 13 rect(1 + x, 29 + y, 3, 10); 14 rect(8 + x, 29 + y, 3, 10); 15 16 if (x < 488) 17 x++; 18 else if (y < 460) // そう(xが488いか)でなく yも460いかなら... 19 y++; // yを1ふやす 20}
複数の図形を動かす方法が、調べても難しくてわからないです。
すべての四角にx
・y
を足すのは面倒なので、translate
を使うと1回で済みます。
translate() / Reference / Processing.org
2D Transformations / Processing.org
図形がぐるぐる回るようにするにはどうしたらいいでしょうか?
ヒントは2つの条件を満たしたときに、上下左右どこに動かすか決めることです。
&& (logical AND) / Reference / Processing.org
?
にどんな数字を入れればいいか考えてみてください^^
Processing
1int x, y; 2 3void setup() { 4 size(500, 500); 5} 6 7void draw() { 8 background(255); 9 10 translate(x, y); 11 12 rect(1, 1, 10, 8); 13 rect(3, 9, 5, 5); 14 rect(1, 14, 10, 15); 15 rect(1, 29, 3, 10); 16 rect(8, 29, 3, 10); 17 18 if (x < 488 && y == ?) 19 x++; 20 else if (y < 460 && x == ?) 21 y++; 22 else if (0 < x && y == ?) 23 x--; 24 else if (0 < y && x == ?) 25 y--; 26}
もっと複雑な動きや直感的な記述をしたい場合は、ライブラリの使用も検討してください(使い方を調べる等別の難しさはありますが^^;
- メニューの「スケッチ」ー「ライブラリをインポート...」ー「Manage Libraries…」を選択
- Contribution Managerで「Ani | A lightweight library」を選択
- Installボタンを押す
Ani - An animation library for Processing
Processing
1import de.looksgood.ani.*; // Aniライブラリを使う 2 3int x, y; 4AniSequence seq; // 一連のアニメーション 5 6void setup() { 7 size(500, 500); 8 9 Ani.init(this); // Aniライブラリの初期化 10 Ani.setDefaultEasing(Ani.LINEAR); // 等速運動 11 Ani.setDefaultTimeMode(Ani.FRAMES); // 基準をフレーム単位に 12 13 seq = new AniSequence(this); // 一連のアニメーション作成 14 15 seq.beginSequence(); // 一連のアニメーション設定開始 16 seq.add(Ani.to(this, 488, "x", 488)); // 488フレームかけてxを488に近づける 17 seq.add(Ani.to(this, 460, "y", 460)); // ↑が終わったら次の動作 18 seq.add(Ani.to(this, 488, "x", 0)); 19 seq.add(Ani.to(this, 460, "y", 0)); 20 21 // 斜めに動かしたいようなときはこう書いてもok 22 //seq.add(Ani.to(this, 488, "x:488,y:0")); 23 //seq.add(Ani.to(this, 460, "x:488,y:460")); 24 //seq.add(Ani.to(this, 488, "x:0,y:460")); 25 //seq.add(Ani.to(this, 460, "x:0,y:0")); 26 seq.endSequence(); // 一連のアニメーション設定終了 27 28 seq.start(); // 一連のアニメーション動作開始 29} 30 31void draw() { 32 if (seq.isEnded()) // 一連のアニメーションが動作終了していたら... 33 seq.start(); // 再スタート 34 35 background(255); 36 translate(x, y); 37 rect(1, 1, 10, 8); 38 rect(3, 9, 5, 5); 39 rect(1, 14, 10, 15); 40 rect(1, 29, 3, 10); 41 rect(8, 29, 3, 10); 42}
投稿2025/01/02 00:08
編集2025/01/02 04:03総合スコア9903
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2025/01/02 08:11