「ふっとび加速演出」の編集履歴(バックアップ)一覧はこちら
「ふっとび加速演出」(2019/05/03 (金) 01:53:28) の最新版変更点
追加された行は緑色になります。
削除された行は赤色になります。
#contents(,fromhere=true,level=3)
----
**ふっとび加速演出
スマブラSPでは、強くふっとばされたときのふっとびの初速が非常に速く、かつ時間が経つと急激に減速するようになった。
その正体は&u(){ふっとびアニメーションの序盤を早送りする(コマをスキップする)}というものである。&footnote(forのFrameSpeedMultiplier, SetFrameDurationに近い)
この仕様を、ここでは''ふっとび加速演出''と呼ぶ。
海外では"balloon knockback effect"などと呼ばれている。
変わったのはアニメーションの早送りが行われるという点のみで、ふっとばし力、ふっとび速度、ふっとび硬直値の基本計算式はforと全く変わっていない。
&u(){ファイターがふっとぶ軌跡だけを見れば、forとSPは全く同じである。}
ただし加速演出のせいで、''見かけのふっとび速度および実際のふっとび硬直時間はforと大きく異なる。''
任意の攻撃で加速演出がどう発生するかを調べるには、&b(){[[Smash Ultimate Calculator>>https://rubendal.github.io/SSBU-Calculator/]]}を使うと良い。
Smash Ultimate Calculatorは、ふっとび加速演出を含めたふっとび硬直・ふっとびの軌道を計算できる高機能なWebツールである。
ただし、
-ファイター座標の計算が、仮想ふっとび時間を整数値に直したもので行われている
-壁や床に衝突したときにふっとび硬直が減少しない
-ふっとび専用重力値の実装が実機と異なる?
といったゲームとの細かい相違点がある(19/5/3現在)。
**用語
このページで使用する特殊用語。
****ふっとび硬直値
&u(){詳しくは[[ふっとび硬直]]を参照。}
「ふっとばし力*0.4」で計算される。''小数点以下の値も計算に用いる。''
****現在硬直値
初期値はふっとび硬直値。
ふっとび時間とともに減少していき、&u(){0以下になった時に硬直が解けて行動可能になる。}
後述する仮想ふっとび時間とは、
仮想ふっとび時間 = ふっとび硬直値 - 現在硬直値
の関係がある。
****仮想ふっとび
&u(){加速演出が無いと仮定した場合のふっとび。}スマブラforでふっとばされた時の挙動と同じ。
ふっとび硬直値と同じコマ数を持ち、ファイターの座標・速度は各コマについて計算される。
''仮想ふっとび時間''は、あるフレームにおいてファイターが仮想ふっとびの何コマ目に相当する状態にあるかを表す数値とする(小数も取りうるものとする)。
加速演出が発生した場合、仮想ふっとび時間は実際にふっとんだフレーム時間よりも大きい値を取る。
''仮想ふっとびフレーム''は、特に整数単位で座標・速度計算などを行うことを強調した仮想ふっとび時間のことを指す。
混同を避けるために、以降このページでは時間の単位を
-ゲーム内の時間:1フレーム、2フレーム
-仮想ふっとび時間:単位無し
と表記する。
**加速演出の詳細
***定性的な解説
ふっとび中は''早送り倍率''が計算され、&u(){ふっとびアニメーションがその倍率で早送りされる。}
実質的には、ある1フレームにおいてはそのフレームにおける倍率の数値分だけふっとびアニメーションのコマが進むことになる。
早送り倍率は''1フレームごとに更新される。''
早送り倍率の初期値は、ふっとび硬直値が30以上の時に1より大きい値を取り、硬直値に対して一次関数的に増加する。
各フレームの早送り倍率はふっとびの時間が経過するにつれて小さくなり、やがて1.0になる。
実際に加速演出が行われているのは(=早送り倍率が1.0超)、&u(){ふっとび硬直実時間のおよそ1/3の時間}である。
#image(ふっとび軌道.png,width=640)
↑ ふっとび軌道をふっとび加速演出の有無で比較。
計算条件は、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 ≦ 早送り倍率 ≦ 初期早送り倍率
#image(初期早送り倍率.png,width=480)
↑ 初期早送り倍率のグラフ。
横軸がふっとび硬直値、縦軸が倍率。
#image(早送り倍率.png,width=480)
↑ 早送り倍率のグラフ。ふっ飛び硬直値60, 初期早送り倍率4.0の場合でプロット。
横軸が仮想ふっとび時間(=ふっとび硬直値-現在硬直値)、縦軸が倍率。
''ゲーム中で早送り倍率に関係するのはふっとび硬直値だけ''だが、&u(){解析値上はふっとび角度も計算に使う用意がある。}
45°から90°の範囲で倍率が上がるような実装が考えられていたようだが、角度に関する最大倍率が1になってしまっているため、角度に関しては実質的に何も設定がないのと同じである。
***ファイターの速度・座標
ページ:[[ふっとび速度>>https://www65.atwiki.jp/smashsp_kensyou/pages/64.html#id_ef0c604a]]も参照。
&u(){加速演出中は仮想ふっとび時間が小数単位で推移する}が、''ファイター速度・座標の計算は基本的に整数単位''で行われている。
仮想ふっとび時間の小数部分については、「小数第2位以下を切り上げた数値を、本来の整数単位の処理に乗ずる」という処理になる。
例として、X初速が5.0, ふっとび角度が0°のふっとびを考える。
この時のファイターのX座標の推移は下表のようになる。
|仮想フレーム|X速度|X座標|h
|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|
#table_zebra(01, #f0f0f0, #fff, #bbb)
****例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
&b(){&color(black,Yellow){注意:}}
この節での"ファイター速度"は、&b(){加速演出を無視した仮想的・内部的な速度}である。
&u(){受け身可否判定などに使われるファイター速度に等しいが、実際に1Fにファイターが画面上を移動する距離とは異なることに注意。}
また、ファイター速度・座標の細かい処理は、リザルト画面の最高ふっとび速度表示からの推測である。
ゲーム中とリザルト速度で処理方法が異なる可能性がある。
***ソースコード的記述
ソースコードのような書式で1Fごとの加速演出処理を記述した(特定の言語を想定しないフォーマットで書いている)。
加速演出の計算はフレームごとの逐次処理であるため、全体像をとらえるにはソースコードの書式が適している。
#divclass(bggray){
&color(gray, white){###攻撃が当たったフレームにパラメータを初期化###}
経過フレーム = 0
現在アニメーションフレーム = 0
ふっとび硬直値' = ふっとばし力 * 0.4
現在硬直値 = ふっとび硬直値
初期早送り倍率 = MIN[1 + 5 * (ふっとび硬直値' - 30) / (80 - 30), 6.0]
&color(gray, white){###ふっとび中の処理###}
While (現在硬直値 > 0)
経過フレーム = 経過フレーム + 1
早送り倍率 = MAX(初期早送り倍率 * (現在硬直値 - ふっとび硬直値' * 0.3) / (ふっとび硬直値' * 0.7), 1.0)
現在硬直値 = 現在硬直値 - 早送り倍率
仮想ふっとび時間_01= ふっとび硬直値' - ROUNDDOWN(現在硬直値, 1) &footnote(仮想ふっとび時間_01は、仮想ふっとび時間の小数第二位を切り上げたもの) &footnote(ここのROUNDDOWNは、結果が小数第一位までになるように端数を切り捨てる処理である。これは仮想ふっとび時間の切り上げと同じ操作である。)
Display: 仮想ふっとび時間_01におけるファイターの状態(速度・座標など)
if (このフレームに壁・床・天井に衝突) then
現在硬直値 = 現在硬直値 * 0.8
endif
end While
}
***計算例
↓ 早送り倍率、仮想ふっとび時間などの推移。
#googlespreadsheets3(https://docs.google.com/spreadsheets/d/172szHBtIl8GArrMLW2YK1UBlzxQmqTLhH9-LIfrYEqI/edit?usp=sharing){640,480}
----
**コメント
#comment()
#contents(,fromhere=true,level=3)
----
**ふっとび加速演出
スマブラSPでは、強くふっとばされたときのふっとびの初速が非常に速く、かつ時間が経つと急激に減速するようになった。
その正体は&u(){ふっとびアニメーションの序盤を早送りする(コマをスキップする)}というものである。&footnote(forのFrameSpeedMultiplier, SetFrameDurationに近い)
この仕様を、ここでは''ふっとび加速演出''と呼ぶ。
海外では"balloon knockback effect"などと呼ばれている。
変わったのはアニメーションの早送りが行われるという点のみで、ふっとばし力、ふっとび速度、ふっとび硬直値の基本計算式はforと全く変わっていない。
&u(){ファイターがふっとぶ軌跡だけを見れば、forとSPは全く同じである。}
ただし加速演出のせいで、''見かけのふっとび速度および実際のふっとび硬直時間はforと大きく異なる。''
加速演出中に空中回避・攻撃などの行動を取ると、演出はその時点で終了する。
ただしパラメータの値の問題で、実戦ではほとんど起こりえない。
任意の攻撃で加速演出がどう発生するかを調べるには、&b(){[[Smash Ultimate Calculator>>https://rubendal.github.io/SSBU-Calculator/]]}を使うと良い。
ふっとび加速演出を含めたふっとび硬直・ふっとびの軌道が計算可能である。
ただし、
-ファイター座標の計算が、仮想ふっとび時間を整数値に直したもので行われている
-壁や床に衝突したときにふっとび硬直が減少しない
-ふっとび専用重力値の実装が実機と異なる?
といったゲームとの細かい相違点がある(19/5/3現在)。
**用語
このページで使用する特殊用語。
****ふっとび硬直値
&u(){詳しくは[[ふっとび硬直]]を参照。}
「ふっとばし力*0.4」で計算される。''小数点以下の値も計算に用いる。''
****現在硬直値
初期値はふっとび硬直値。
ふっとび時間とともに減少していき、&u(){0以下になった時に硬直が解けて行動可能になる。}
後述する仮想ふっとび時間とは、
仮想ふっとび時間 = ふっとび硬直値 - 現在硬直値
の関係がある。
****仮想ふっとび
&u(){加速演出が無いと仮定した場合のふっとび。}スマブラforでふっとばされた時の挙動と同じ。
ふっとび硬直値と同じコマ数を持ち、ファイターの座標・速度は各コマについて計算される。
''仮想ふっとび時間''は、あるフレームにおいてファイターが仮想ふっとびの何コマ目に相当する状態にあるかを表す数値とする(小数も取りうるものとする)。
加速演出が発生した場合、仮想ふっとび時間は実際にふっとんだフレーム時間よりも大きい値を取る。
''仮想ふっとびフレーム''は、特に整数単位で座標・速度計算などを行うことを強調した仮想ふっとび時間のことを指す。
混同を避けるために、以降このページでは時間の単位を
-ゲーム内の時間:1フレーム、2フレーム
-仮想ふっとび時間:単位無し
と表記する。
**加速演出の詳細
***おおまかな解説
ふっとび中、逐次的に''早送り倍率''が計算され、&u(){ふっとびアニメーションがその倍率で早送りされる。}
早送り倍率は''1フレームごとに更新される。''
早送り倍率の初期値は、ふっとび硬直値が30以上の時に1より大きい値を取り、硬直値に対して一次関数的に増加する。
各フレームの早送り倍率はふっとびの時間が経過するにつれて小さくなり、やがて1.0になる。
実際に加速演出が行われているのは(=早送り倍率が1.0超)、&u(){ふっとび硬直実時間のおよそ1/3の時間}である。
下の図は、ふっとび加速演出の有無でふっとび軌道を比較したものである。
#image(ふっとび軌道.png,width=640)
計算条件は、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 ≦ 早送り倍率 ≦ 初期早送り倍率
#image(初期早送り倍率.png,width=480)
&small(){↑ 初期早送り倍率のグラフ。}
&small(){横軸がふっとび硬直値、縦軸が倍率。}
#image(早送り倍率.png,width=480)
&small(){↑ 早送り倍率のグラフ。ふっ飛び硬直値60, 初期早送り倍率4.0の場合。}
&small(){横軸が仮想ふっとび時間(=ふっとび硬直値-現在硬直値)、縦軸が倍率。}
''ゲーム中で早送り倍率に関係するのはふっとび硬直値だけ''だが、&u(){解析値上はふっとび角度も計算に使う用意がある。}
45°から90°の範囲で倍率が上がるような実装が考えられていたようだが、角度に関する最大倍率が1になってしまっているため、角度に関しては実質的に何も設定がない状態である。
***ファイターの速度・座標
ページ:[[ふっとび速度>>https://www65.atwiki.jp/smashsp_kensyou/pages/64.html#id_ef0c604a]]も参照。
&u(){加速演出中の仮想ふっとび時間推移は小数点以下も含む}が、''ファイター速度・座標の計算は基本的に整数単位''で行われている。
仮想ふっとび時間の小数部分については、「小数第2位以下を切り上げ、本来の整数単位の処理に乗ずる」という処理になる。
例として、X初速が5.0, ふっとび角度が0°のふっとびを考える。
この時のファイターのX座標の推移は下表のようになる。
|仮想フレーム|X速度|X座標|h
|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|
#table_zebra(01, #f0f0f0, #fff, #bbb)
****例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
&b(){&color(black,Yellow){注意:}}
この節での"ファイター速度"は、&b(){加速演出を無視した仮想的・内部的な速度}である。
&u(){受け身可否判定などに使われるファイター速度に等しいが、実際に1Fにファイターが画面上を移動する距離とは異なることに注意。}
また、ファイター速度・座標の細かい処理は、リザルト画面の最高ふっとび速度表示からの推測である。
ゲーム中とリザルト速度で処理方法が異なる可能性がある。
***ソースコード的記述
ソースコードのような書式で1Fごとの加速演出処理を記述した(特定の言語を想定しないフォーマットで書いている)。
#divclass(bggray){
&color(gray, white){###攻撃が当たったフレームにパラメータを初期化###}
経過フレーム = 0
現在アニメーションフレーム = 0
ふっとび硬直値' = ふっとばし力 * 0.4
現在硬直値 = ふっとび硬直値
初期早送り倍率 = MIN[1 + 5 * (ふっとび硬直値' - 30) / (80 - 30), 6.0]
&color(gray, white){###ふっとび中の処理###}
While (現在硬直値 > 0)
経過フレーム = 経過フレーム + 1
早送り倍率 = MAX(初期早送り倍率 * (現在硬直値 - ふっとび硬直値' * 0.3) / (ふっとび硬直値' * 0.7), 1.0)
現在硬直値 = 現在硬直値 - 早送り倍率
仮想ふっとび時間_01= ふっとび硬直値' - ROUNDDOWN(現在硬直値, 1) &footnote(仮想ふっとび時間_01は、仮想ふっとび時間の小数第二位を切り上げたもの) &footnote(ここのROUNDDOWNは、結果が小数第一位までになるように端数を切り捨てる処理である。これは仮想ふっとび時間の切り上げと同じ操作である。)
Display: 仮想ふっとび時間_01におけるファイターの状態(速度・座標など)
if (このフレームに壁・床・天井に衝突) then
現在硬直値 = 現在硬直値 * 0.8
endif
end While
}
***計算例
↓ 早送り倍率、仮想ふっとび時間などの推移。
[[https://docs.google.com/spreadsheets/d/172szHBtIl8GArrMLW2YK1UBlzxQmqTLhH9-LIfrYEqI/edit?usp=sharing]]
----
**コメント
#comment()