ActiinScript2.0 ボールアクション 重力、摩擦、跳ね返り係数
2011.11.04
この記事は最終更新日から1年以上が経過しています。
前回のActiinScript2.0 縦横移動 ボールを掴んで投げるの続きとなります。
最後によりボールの感じを出すために、重力、摩擦、跳ね返り係数について考えたいとおもいます。
跳ね返り係数
跳ね返り係数とはボールが壁に当たったとき、どのくらいの力で跳ね返すか?という値になります。
スーパーボールなどのボールの跳ね返り係数は100に近い数値になりますが、
ボーリング玉等の重く、跳ね返りが悪いボールの跳ね返り係数は0に近い数値となります。
ではどう設定するのかといいますと、今まで、壁に当たった時の計算は
speedX = speedX*-1;
と、符号を反転させるのみでしたが、これに跳ね返り係数を付け加えます。
壁にぶつかった時は80%の力で跳ね返すとすると、
speedX = speedX*-1*0.8;
このように0.8をかけると、壁にぶつかった時は80%の力で跳ね返します。
この設定を上下左右に設定すれば完成です。
空気抵抗
続いて空気抵抗について考えます。
現状、縦横と移動する計算式は
this._x += speedX; this._y += speedY;
この2行で求められていると思います。この式に少し付け加えます。
この2行の上に以下のスクリプトを追加します。
speedX = speedX*0.99; speedY = speedY*0.99;
このスクリプトを追加することによって、1%ずつスピードを減少させること、
つまり空気抵抗を付ける事ができます。
重力
最後に重力を付けます。難しいことは何もありません。
重力は常に下方向にかかっています。
座標で考えると、常にy座標にプラスの値が増加すればいいとなります。
speedY = speedY*0.99+0.98;
と先ほど空気抵抗を付けるための式に+0.98足せば完成です。
常に下方向へ行くようになります。
完成したscriptは以下の通りになります。
onClipEvent(load){ speedX = 10; speedY = 8; ballHold = 0; } onClipEvent(enterFrame){ if(ballHold == 1){ x1 = x2; y1 = y2; x2 = this._x; y2 = this._y; speedX = (x2-x1); speedY = (y2-y1); }else{ if (this._x>500-this._width/2){ this._x = 500-this._width/2; speedX = speedX*-1*0.8; } if (this._x<0+this._width/2) { this._x = 0+this._width/2; speedX = speedX*-1*0.8; } if (this._y>400-this._width/2) { this._y = 400-this._width/2; speedY = speedY*-1*0.8; } if (this._y<0+this._width/2) { this._y = 0+this._width/2; speedY = speedY*-1*0.8; } speedX = speedX*0.99; speedY = speedY*0.99+0.98; this._x += speedX; this._y += speedY; } } on (press) { ballHold = 1; startDrag(this, true); } on (release) { ballHold = 0; stopDrag(); }
2011年11月現在、HTML5,css3に注目が行き、まったくFlashにはフューチャーされてなく
死語となりつつありますが(笑) 、
あえてFlashの記事を書いてみました。
値を変えて頂き使って頂ければと思ってます。
デモページ
デモページはこちらから