🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Processing

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

Q&A

1回答

661閲覧

音声の停止若しくはアニメーションを無限リピートする方法を教えていただきたいです。

hacohacohaco

総合スコア0

Processing

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

0グッド

0クリップ

投稿2021/02/26 10:35

音付きの簡単なアニメーションをprocessingで作成しています。
ボールが跳ねるのに合わせて音をつけているのですがボールが左側に帰ってきた時点で音を止めるか若しくはボールが枠外から出ずに永遠と跳ね返り続けるように修正したいです。現時点でエラーは出ていません。
何かいい方法がありましたら教えていただきたいです。修正版のコードを載せていただけたら嬉しいです。面倒だと思いますがどなたかお願いします!

コード (初心者なのでかなりつたないコードになってます、ご容赦ください。)
import processing.sound.*;

SoundFile sound;

float g = 0.15;
float x;
float y;
float spd_x;
float spd_y;

void setup(){
size( 1000, 400 );
x = -200;
y = height;
spd_x = 3;
spd_y = -10;
sound = new SoundFile(this, "sound.mp3");
}

void draw(){
background(255);

spd_y += g;

x += spd_x;
y += spd_y;
fill(0);
ellipse(x, y, 60, 60);

if( y > height ){
spd_y = -spd_y;
sound.play();
}

else if( x > width) {
spd_x = -spd_x;

}

}

作業環境
Windows10
processing-3.5.4

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

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

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

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

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

guest

回答1

0

ボールが左側に帰ってきた時点で音を止めるか若しくはボールが枠外から出ずに永遠と跳ね返り続けるように修正したいです。

どちらにするにしても、初期位置が枠外なところが扱いにくい原因だと思います。
初期位置が枠内に収まるように調整すれば、音を止めるのは簡単ですよね?(xがマイナスであれば止めるだけ)
跳ね返り続けるのもx < 0という条件を付け足すだけです。

Processing

1import processing.sound.*; 2 3SoundFile sound; 4 5float g = 0.15; 6float x = 0; 7float y = 60; 8float spd_x = 3; 9float spd_y= 0; 10 11void setup() { 12 size(1000, 400); 13 sound = new SoundFile(this, "sound.mp3"); 14} 15 16void draw() { 17 background(255); 18 19 spd_y += g; 20 x += spd_x; 21 y += spd_y; 22 23 fill(0); 24 ellipse(x, y, 60, 60); 25 26 if (height < y) { 27 spd_y = -spd_y; 28 //sound.stop(); 29 sound.play(); 30 } 31 if (x < 0 || width < x) { 32 spd_x = -spd_x; 33 } 34}

とは言えこのままですと、跳ね返りが小さくなった時に枠外に沈みます。
このあたりの調整は難しいうえ、例えばボールを増やそうとした途端破綻します。

個人的にはこういった処理は便利なライブラリがあるので、任せられるところはどんどん任せたらいいと思っています(が、なぜか質問者受けが悪いです^^;

fisicaを使用しました。
導入法はProcessing - processingで図形を選択して動かす方法|teratailを参照。

Processing

1import processing.sound.*; 2import fisica.*; 3 4SoundFile sound; 5FWorld world; 6 7void setup() { 8 size(1000, 400); 9 10 sound = new SoundFile(this, "sound.mp3"); 11 12 Fisica.init(this); 13 world = new FWorld(); 14 world.setEdges(); // 壁 15 world.setGravity(0, 500); // 重力 16 17 FCircle ball = new FCircle(60); 18 ball.setDamping(0); // 減衰 19 ball.setFill(0); // 色 20 ball.setFriction(0); // 摩擦 21 ball.setNoStroke(); // 線無し 22 ball.setPosition(60, 60); // 位置 23 ball.setRestitution(0.99); // 反発 24 ball.setVelocity(200, 0); // 速度 25 world.add(ball); 26} 27 28void draw() { 29 background(255); 30 31 world.step(); // 物理演算 32 world.draw(); // 描画 33} 34 35void contactStarted(FContact c) { // 接触 36 //sound.stop(); 37 sound.play(); 38} 39 40void mouseClicked() { // マウスクリックで増殖 41 FCircle ball = new FCircle(60); 42 ball.setDamping(0); 43 ball.setFill(random(256), random(256), random(256)); 44 ball.setFriction(0); 45 ball.setNoStroke(); 46 ball.setPosition(mouseX, mouseY); 47 ball.setRestitution(0.99); 48 ball.setVelocity(random(400) - 200, 0); 49 world.add(ball); 50}

注)各数値に特に根拠はありません。元コードに似るように現物合わせしただけです。

投稿2021/02/28 07:32

TN8001

総合スコア9855

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問