ボールが左側に帰ってきた時点で音を止めるか若しくはボールが枠外から出ずに永遠と跳ね返り続けるように修正したいです。
どちらにするにしても、初期位置が枠外なところが扱いにくい原因だと思います。
初期位置が枠内に収まるように調整すれば、音を止めるのは簡単ですよね?(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}
注)各数値に特に根拠はありません。元コードに似るように現物合わせしただけです。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。