t = 1になったときにF が変わらないです。
println(t);
としているのですから、1になっていないことはわかってると思うのですが...
例えば0.1を10回足しても、(正確に)1にはなりません。
Processing
1float a = 0.1 + 0.1 + 0.1 + 0.1 + 0.1 + 0.1 + 0.1 + 0.1 + 0.1 + 0.1;
2println(a); // 1.0000001
3println(a == 1); // false
何故かはggってください^^;
float 誤差 - Google 検索
で、どうするかですが↓あたりがありがちな対策でしょうか。
==
で比較しない
if (t >= 1)
に変えてもいいなら話が早いです。
- 同じと言っていいほど差が小さいかを判断する
if (abs(t - 1) < 0.001)
のようにする(もっと小さい数字でいいけど)
abs() / Reference / Processing.org
- (その変数は)
float
を使わない
t
は整数(int
)にして1ずつ足していき、使うところでt / 100.0
する。
数学苦手だけどこういうことでいいんかな??
Processing
1final float g = 9.8; // 重力
2final float v0 = 4.9; // 初速
3float y1 = 200; // オリジナルy座標
4float y2 = 200; // 改良y座標
5float t; // 時間
6boolean F; // ジャンプ中フラグ
7
8void setup() {
9 size(700, 300);
10 frameRate(100);
11 background(255);
12}
13
14void draw() {
15 //background(255); // 残像残す
16
17 float y3 = 200; // 高さ初期位置
18
19 if (F) {
20 t += 0.01;
21
22 // 時刻tにおける高さを減算していったらおかしなことに
23 y1 -= v0 * t - g / 2 * t * t;
24
25 // 減算していくなら速度のほう(ただしm/sなわけだから本来/100すべき?
26 y2 -= v0 - g * t;
27
28 // 公式で今の高さを計算する(が、mだと小さすぎるのと↑と合わせるために100倍
29 y3 -= (v0 * t - g / 2 * t * t) * 100;
30 }
31
32 //if (t >= 1) {
33 // F = false;
34 //}
35 if (abs(t - 1) < 0.001) {
36 F = false;
37 }
38
39 translate(t * 100, 0); // わかりやすくするため全体を右に移動
40 circle(100, y1, 50); // オリジナル
41
42 translate(200, 0); //
43 circle(100, y2, 50); // 改良
44
45 translate(200, 0);
46 circle(100, y3, 50); // 高さ計算
47}
48
49void mousePressed() {
50 background(255);
51 F = true;
52 t = 0;
53 y1 = 200;
54 y2 = 200;
55}
![アプリ動画](https://ddjkaamml8q8x.cloudfront.net/questions/2024-06-03/46e32f63-5849-42a1-bd6e-ac45bd2ae1fc.gif)