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

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

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

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

Q&A

解決済

1回答

173閲覧

※初心者 複数の図形を同時に動かす方法が知りたいです

1203kana

総合スコア2

Processing

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

1グッド

0クリップ

投稿2025/01/01 15:32

実現したいこと

超簡易的なロボットをつくったのですが、このロボットを左上端から右上端までまっすぐ移動し、そのまま右下端まで下がるというのをしてみたいのですがどのようにすればいいのでしょうか。
複数の図形を動かす方法が、調べても難しくてわからないです。
よろしくお願いいたします。

ロボット
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等で検索した
  • ソースコードを自分なりに変更した
  • 知人に聞いた
  • その他
上記の詳細・結果

上記の通りです。宜しくお願い致します。

補足

特になし

TN8001👍を押しています

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

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

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

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

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

guest

回答1

0

ベストアンサー

複数の図形を同時に動かす方法が知りたいです

まず動きのあるスケッチ(コード)は、setupdrawが必要です。
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}

複数の図形を動かす方法が、調べても難しくてわからないです。

すべての四角にxyを足すのは面倒なので、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}

もっと複雑な動きや直感的な記述をしたい場合は、ライブラリの使用も検討してください(使い方を調べる等別の難しさはありますが^^;

  1. メニューの「スケッチ」ー「ライブラリをインポート...」ー「Manage Libraries…」を選択
  2. Contribution Managerで「Ani | A lightweight library」を選択
  3. Installボタンを押す

Contribution Manager
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
TN8001

総合スコア9903

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

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

1203kana

2025/01/02 08:11

こんなにわかりやすく解説してくださりありがとうございます! 他のことにも繋がりそうな基礎をしっかり学べて嬉しい限りです。 ありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.34%

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

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

質問する

関連した質問