hinekure.net が http://hspdev-wiki.net/ から自動クローリングした結果を表示しています。画像やリソースなどのリンクが切れています。予めご了承ください。 |
えーっと、ここでは「地面でバウンドするボール」の場合に限定しておきます。
ボールが地面にぶつかるとバウンドしますね。跳ねるたびに跳ね上がる高さが小さくなっていきます。
<法則>
2つの関係はこんな感じになっています。
(バウンド後の速度)/(バウンド前の速度)=(跳ね返り係数)
この「跳ね返り係数(反発係数)」というヤツは大きさが変化しない一定の値と考えてokです。
普通はこの跳ね返り係数は普通は
-1 < (跳ね返り係数) < 0
の範囲の値です。ボールが進む方向が逆になるので値はマイナスになります。
この範囲外にしてもいいのですが、値によって次のような動きをします。
0 | 跳ねない。粘土を地面に落としたような状態。 |
-1より大0より小 | 跳ねるたびに跳ね返る高さが小さくなっていく。 |
-1 | 常に同じ高さまでボールが跳ねる。スーパーボール。 |
-1より小 | 跳ねるたびに高さを増していく。 |
というわけで、バウンド後の速度を出すには次のような式になります。
(バウンド後の速度)=(跳ね返り係数)×(バウンド前の速度)
地面にぶつかったら速度にこの計算を当てはめてやればいいわけです。
ではサンプルをどぞ。
|
|
こうするのもよいのやもしれません。
計算は全て実数で行なう。またsqrtはマイナス値を計算できないので、マイナスが入るのを回避する。(これは計算を適度に切り上げる意味もある。)
+ | バウンドサンプル for HSP3 |
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
| - | | - | - | ! | ! |
|
今回のポイント
if py>400{ ;地面衝突 vy = stat * -4/5 ;跳ね返り係数 -4/5 if (-g<vy)&(vy<0) : vy = 0 ay = 0 py = 400 }
if (-g<vy)&(vy<0) : vy = 0
サンプルが動いたら、自分で改造していろいろと確かめてみてください。
速度を4/5倍し続けるわけですが、これでは実際は速度が0にたどり着くことはありません。
実数を使用する場合はある程度の大きさより小さくなったら0とみなす(v=0にしてしまう)処理をする必要があります。
今回は整数でのみ扱うので、加速度が1の場合は自動的に小数点以下が丸められて速度は0に集束しています。