ふっとび加速演出


ふっとび加速演出

スマブラSPでは、強くふっとばされたときのふっとびの初速が非常に速く、かつ時間が経つと急激に減速するようになった。
その正体はふっとびアニメーションの序盤を早送りする(コマをスキップする)というものである。*1
この仕様を、ここでは ふっとび加速演出 と呼ぶ。
海外では"balloon knockback effect"などと呼ばれている。

変わったのはアニメーションの早送りが行われるという点のみで、ふっとばし力、ふっとび速度、ふっとび硬直値の基本計算式はforと全く変わっていない。
ファイターがふっとぶ軌跡だけを見れば、forとSPは全く同じである。
ただし加速演出のせいで、 見かけのふっとび速度および実際のふっとび硬直時間はforと大きく異なる。

加速演出中に空中回避・攻撃などの行動を取ると、演出はその時点で終了する。
ただしパラメータの値の問題で、実戦ではほとんど起こりえない。

任意の攻撃で加速演出がどう発生するかを調べるには、 Smash Ultimate Calculator を使うと良い。
ふっとび加速演出を含めたふっとび硬直・ふっとびの軌道が計算可能である。
ただし、
  • ファイター座標の計算が、仮想ふっとび時間を整数値に直したもので行われている
  • 壁や床に衝突したときにふっとび硬直が減少しない
  • ふっとび専用重力値の実装が実機と異なる?
といったゲームとの細かい相違点がある(19/5/3現在)。


用語

このページで使用する特殊用語。

ふっとび硬直値
詳しくはふっとび硬直を参照。
「ふっとばし力*0.4」で計算される。 小数点以下の値も計算に用いる。

現在硬直値
初期値はふっとび硬直値。
ふっとび時間とともに減少していき、0以下になった時に硬直が解けて行動可能になる。
後述する仮想ふっとび時間とは、
仮想ふっとび時間 = ふっとび硬直値 - 現在硬直値
の関係がある。

仮想ふっとび
加速演出が無いと仮定した場合のふっとび。スマブラforでふっとばされた時の挙動と同じ。
ふっとび硬直値と同じコマ数を持ち、ファイターの座標・速度は各コマについて計算される。
仮想ふっとび時間 は、あるフレームにおいてファイターが仮想ふっとびの何コマ目に相当する状態にあるかを表す数値とする(小数も取りうるものとする)。
加速演出が発生した場合、仮想ふっとび時間は実際にふっとんだフレーム時間よりも大きい値を取る。
仮想ふっとびフレーム は、特に整数単位で座標・速度計算などを行うことを強調した仮想ふっとび時間のことを指す。

混同を避けるために、以降このページでは時間の単位を
  • ゲーム内の時間:1フレーム、2フレーム
  • 仮想ふっとび時間:単位無し
と表記する。


加速演出の詳細

おおまかな解説

ふっとび中、逐次的に 早送り倍率 が計算され、ふっとびアニメーションがその倍率で早送りされる。
早送り倍率は 1フレームごとに更新される。

早送り倍率の初期値は、ふっとび硬直値が30以上の時に1より大きい値を取り、硬直値に対して一次関数的に増加する。
各フレームの早送り倍率はふっとびの時間が経過するにつれて小さくなり、やがて1.0になる。
実際に加速演出が行われているのは(=早送り倍率が1.0超)、ふっとび硬直実時間のおよそ1/3の時間である。

下の図は、ふっとび加速演出の有無でふっとび軌道を比較したものである。
計算条件は、KB=190, ふっとび角度=40°, 重力値=0.1, 落下速度=1.5。
水色が仮想ふっとび(forと同じ軌道)、ピンクが加速演出込みの軌道(SPの軌道)を示す。
マーカーは、ふっとび始めの座標を(0,0)とし、ファイターが存在する座標を1Fごとに打ったもの。
加速演出の無い水色マーカーは、およそ等間隔に並んでいる。
加速演出のあるピンクマーカーを見ると、ふっとびの序盤ほどアニメーションが高速でスキップされているのが分かる。


計算式

早送り倍率は以下の式で計算される。
初期早送り倍率 =  6 * (ふっとび硬直値 - 30) / (80 - 30)
早送り倍率 = 初期早送り倍率 * (現在硬直値 - ふっとび硬直値*0.3) / (ふっとび硬直値*0.7)
ただし、
1.0 ≦ 初期早送り倍率 ≦ 6.0
1.0 ≦ 早送り倍率 ≦ 初期早送り倍率

↑ 初期早送り倍率のグラフ。
横軸がふっとび硬直値、縦軸が倍率。

↑ 早送り倍率のグラフ。ふっ飛び硬直値60, 初期早送り倍率4.0の場合。
横軸が仮想ふっとび時間(=ふっとび硬直値-現在硬直値)、縦軸が倍率。

ゲーム中で早送り倍率に関係するのはふっとび硬直値だけ だが、解析値上はふっとび角度も計算に使う用意がある。
45°から90°の範囲で倍率が上がるような実装が考えられていたようだが、角度に関する最大倍率が1になってしまっているため、角度に関しては実質的に何も設定がない状態である。


ファイターの速度・座標

ページ: ふっとび速度 も参照。

加速演出中の仮想ふっとび時間推移は小数点以下も含むが、 ファイター速度・座標の計算は基本的に整数単位 で行われている。
仮想ふっとび時間の小数部分については、「小数第2位以下を切り上げ、本来の整数単位の処理に乗ずる」という処理になる。

例として、X初速が5.0, ふっとび角度が0°のふっとびを考える。
この時のファイターのX座標の推移は下表のようになる。
仮想フレーム X速度 X座標
0 5.0 0.0
1 4.949 4.949
2 4.898 9.847
3 4.847 14.694
4 4.796 19.49

例1:仮想ふっとび時間3.0のとき:
仮想フレーム3における値がそのままファイターのX速度・X座標となる。

例2:仮想ふっとび時間3.22のとき
小数第二位を切り上げ、仮想フレーム3.3のX速度・X座標を計算する。
X速度は、3F目の速度から 0.051 * 0.3 だけ減衰した値となる。
X速度 = 4.847 - 0.051 * 0.3 = 4.8317
X座標は、3F目の座標に "4F目の速度 * 0.3" を加えたものとなる。
X座標 = 14.694 + 4.796 * 0.3 = 16.1328


注意:
この節での"ファイター速度"は、加速演出を無視した仮想的・内部的な速度である。
受け身可否判定などに使われるファイター速度に等しいが、実際に1Fにファイターが画面上を移動する距離とは異なることに注意。
また、ファイター速度・座標の細かい処理は、リザルト画面の最高ふっとび速度表示からの推測である。
ゲーム中とリザルト速度で処理方法が異なる可能性がある。



ソースコード的記述

ソースコードのような書式で1Fごとの加速演出処理を記述した(特定の言語を想定しないフォーマットで書いている)。

###攻撃が当たったフレームにパラメータを初期化###
経過フレーム = 0
現在アニメーションフレーム = 0
ふっとび硬直値' = ふっとばし力 * 0.4
現在硬直値 = ふっとび硬直値
初期早送り倍率 = MIN[1 + 5 * (ふっとび硬直値' - 30) / (80 - 30), 6.0]

###ふっとび中の処理###
While (現在硬直値 > 0)

 経過フレーム = 経過フレーム + 1
 早送り倍率 = MAX(初期早送り倍率 * (現在硬直値 - ふっとび硬直値' * 0.3) / (ふっとび硬直値' * 0.7), 1.0)
 現在硬直値 = 現在硬直値 - 早送り倍率
 仮想ふっとび時間_01= ふっとび硬直値' - ROUNDDOWN(現在硬直値, 1) *2*3

 Display: 仮想ふっとび時間_01におけるファイターの状態(速度・座標など)

 if (このフレームに壁・床・天井に衝突) then
  現在硬直値 = 現在硬直値 * 0.8
 endif

end While



計算例

↓ 早送り倍率、仮想ふっとび時間などの推移。
https://docs.google.com/spreadsheets/d/172szHBtIl8GArrMLW2YK1UBlzxQmqTLhH9-LIfrYEqI/edit?usp=sharing



コメント

名前:
コメント:
最終更新:2019年05月03日 01:53

*1 forのFrameSpeedMultiplier, SetFrameDurationに近い

*2 仮想ふっとび時間_01は、仮想ふっとび時間の小数第二位を切り上げたもの

*3 ここのROUNDDOWNは、結果が小数第一位までになるように端数を切り捨てる処理である。これは仮想ふっとび時間の切り上げと同じ操作である。