ゲームを知る

デモ 005空中制御

デモを読み込んでいます
上の段は空中制御なし、下の段は操作パネルで決めた空中制御で同じ入力を自動で再生しています。点の列は足場を離れてからの軌跡で、色の付いた点は左右を押しているあいだ、三角は空中で左右を押し始めた位置です。3 つ目の試行で下の段が落ちるのは、既定の設定では空中で右を離すと減速するからです。下のボタンで自分でも試せます。ステージをクリックすると、キーボード(← → で移動、スペースか ↑ でジャンプ)でも操作できます。

第一章 操作感No.005

空中制御

Air Control別名 空中操作

概要

ジャンプや落下の途中で、左右の入力によって横の動きをどれだけ変えられるか。空中制御がないと跳んだ瞬間の勢いのまま飛ぶので、跳んだ後に着地点を直せない。強くするほど空中で思いどおりに動かせるが、強すぎると着地点が定まらず、キャラクターの重さも消える。

使われる場面

小さな足場に跳び移る場面
走って跳ぶと勢いがついて、足場を行き過ぎることがある。空中で反対に押して戻せれば、跳んだ後に着地点を足場に合わせられる。
跳んだ後に危険が見える場面
跳んだ先に敵や落ちてくる物が見えたとき、空中で向きを変えて避けられる。空中制御がないと、避けられるかどうかは跳んだ時点で決まる。
跳ぶ前の判断を遊びにするゲーム
空中制御を弱くするかなくして、助走の速さと踏み切りの位置で軌道が決まるようにする。跳ぶ前に距離を見て決める遊びになり、キャラクターの動きに重さが出る。
足場の端から落ちる場面
空中制御は跳んだときだけでなく、足場から落ちているあいだにも効かせる。落ちながら下の足場に位置を合わせられる。

判断基準

こういうときこうする
跳んだ後に向きを直せず、足場を行き過ぎて落ちる、という感想が出る空中制御を入れる。空中での加速を地上の加速の半分ほどから試し、跳んだ後に反対へ押して着地点を戻せるようにする。
空中で反対に押しても、着地までに向きが変わらない空中での加速が弱すぎる。最高速から反対向きの最高速まで切り返す時間は、地上の切り返しの時間を割合で割った長さになる。この時間が空中にいる時間より短くなるまで割合を上げる。
空中でも地上と同じように動けてしまい、着地点が定まらず重さもない空中での加速を下げる。割合を半分にすると、反対向きに押す時間が 1 フレーム違ったときの着地点のずれも半分になる。跳んだ後に足場へ戻せる強さが残る範囲で下げる。
ジャンプ中に方向キーを離すと、失速して届くはずの足場に届かない空中で左右を離したときは、横の速さを保つか地上よりずっと弱く減速する。地上と同じ処理で空中の横の速さを決めていると、離したときに地上と同じように止まろうとする。
止まった所から跳んでも、助走して跳んだのと同じくらい遠くへ届く空中で押して出せる横の最高速を地上より遅くする。地上で付けた速さは空中でも削らずに保つと、遠くへ跳ぶには助走が要るようになる。
空中制御を弱くしたら、小さな足場や遠い足場に跳び移れなくなった足場の手前に最高速まで走れる平らな床を置き、跳ぶ前に速さと踏み切りの位置を決められるようにする。踏み切りが端のぎりぎりになるので、「コヨーテタイム」もあわせて入れる。

遊んでこう感じたら

  • 跳んだ後に向きを直せず、思った所に着地できない操作
  • 反対に押しても、すぐに向きが変わらない操作
  • 空中でふらふら動きすぎて、着地の位置が定まらない操作
  • ジャンプ中に方向キーを離すと、前に進まずに落ちる操作
  • キャラクターの動きに重さや勢いを感じない手応え

指示の例

  • 跳んだ後に向きを変えられず、小さな足場を行き過ぎて落ちる。空中制御を入れて、ジャンプ中も地上の半分くらいの加速で左右に動けるようにして

  • ジャンプ中も地上と同じように左右へ動けて、ふわふわして重さがない。空中制御を弱めて、空中での加速を地上の 3 割くらいに下げて

  • ジャンプ中に方向キーを離すと失速して、向こうの足場に届かない。空中制御の強さはそのままで、空中で左右を離したときは横の速さを保つようにして

  • 止まった所から跳んでも、助走したときと同じくらい遠くへ届いてしまう。空中で押して出せる横の最高速を地上の半分にして、遠くへ跳ぶには助走が要るようにして

  • 空中で反対に押しても、着地までに向きが変わらない。空中制御を強めて、ジャンプ中でも 0.5 秒くらいで反対向きの最高速まで切り返せるようにして

詳細

跳んだ後に軌道を変えられるか

ジャンプの軌道のうち、縦の動きは跳ぶ速さと重力で決まる。横の動きは跳んだ瞬間の横の速さから始まり、その後は空中で左右の入力をどう扱うかで決まる。跳んだ瞬間の横の速さを空中で変えなければ、軌道は跳んだ時点で一つの放物線に決まる。空中でも左右の入力で横の速さを変えられるようにすると、跳んだ後に向きや距離を直せる。ジャンプや落下の途中で、左右の入力によって横の動きをどれだけ変えられるかを空中制御と呼ぶ。

空中制御は次の三つの値で決まる。

  • 空中での加速:空中で押している向きへ横の速さを変える量。反対向きに押して切り返すときも、この加速で速さが変わる。
  • 空中での減速:空中で左右を離したときに横の速さを 0 に近づける量。0 にすると、離しても速さを保つ。
  • 空中の最高速:空中で押して出せる横の速さの上限。

デモの地上の動きは「加速と減速」と同じ作りで、最高速に達するまでも止まるまでも 0.1 秒かかる。下の段の空中での加速と減速は、地上の値に操作パネルの割合を掛けて決めている。

なしにした場合と強くした場合

空中制御がないと、跳ぶ前に助走の速さと踏み切りの位置を決めなければならない。デモの最高速で走って跳ぶと、空中にいる 0.72 秒のあいだに体の幅 6 個分進んで着地する。止まった所から跳ぶと、その場に落ちてくる。跳んだ後は勢いのまま飛ぶので、動きに重さが出る。跳ぶ前の判断が問われる遊びにもなる。その代わり、跳び方を間違えても空中では直せない。デモの 1 つ目の試行では上の段が小さな足場を行き過ぎて落ちる。

空中制御を強くすると、跳んだ後に着地点を直せるので易しくなる。空中での加速が地上と同じ(割合 100%)なら、空中でも 0.2 秒で反対向きの最高速まで切り返せる。空中にいる 0.72 秒のあいだに何度も向きを変えられる。軌道は途中で折れ曲がり、空中を蹴って向きを変えたように見える。勢いに逆らって自由に動けるぶん、重さは消える。

強くするほど入力のわずかな違いで着地点が大きく動く。離しても速さを保つ設定では、頂点で反対向きに押す時間が 1 フレーム延びるだけで着地点がずれる。ずれは 1 フレームで変わる横の速さと、着地までの残りの時間の積になる。デモでは割合 100% で体の幅のほぼ半分、50% でほぼ 4 分の 1 である。デモの 1 つ目の試行で割合を 80% 以上にすると、左を押す長さは同じでも戻りすぎて手前の穴に落ちる。

値の決め方

空中での加速と減速は、地上の値に割合を掛けて決めると調整しやすい。地上の手触りを先に決めておけば、空中の動きは割合を変えるだけで強めたり弱めたりできる。

切り返しにかかる時間は割合に反比例する。デモの地上では最高速から反対向きの最高速まで 0.2 秒で切り返すので、割合を r にすると空中では 0.2 ÷ r 秒かかる。割合が 50% なら 0.4 秒、20% なら 1 秒である。20% では空中にいる 0.72 秒のうちに切り返しきれない。跳んだ直後から反対に押し続けても、踏み切った位置より前に着地する。

まず地上の半分ほどから試し、跳んだ後に足場へ戻せるか、空中で地上と同じ動きに見えないかを遊びながら確かめる。デモの 1 つ目の試行の入力で小さな足場に乗れるのは、割合が 30〜70% のときである。20% 以下では戻りきれずに行き過ぎる。合う割合はゲームの速さや足場の大きさで変わるので、この幅は目安にとどめる。

// 空中にいるあいだ、1 ステップごとに。inputDir は入力の向き(-1、0、1)、dt は 1 ステップの秒数
// approach は「加速と減速」と同じく、current を target に向けて最大 maxDelta だけ近づける
const airAccel = (maxSpeed / groundAccelTime) * airControl; // 地上の加速に割合を掛ける
const airDecel = (maxSpeed / groundDecelTime) * airControl;
if (inputDir !== 0) {
  const top = airMaxSpeed;
  // 空中の最高速より速く、押している向きへ動いているときは、地上で付けた速さを削らない
  if (velocity * inputDir < top) velocity = approach(velocity, inputDir * top, airAccel * dt);
} else if (!keepSpeedInAir) {
  velocity = approach(velocity, 0, airDecel * dt);
}
x += velocity * dt;

離したときの減速

空中でも離したら減速する作りにすると、跳んだ後に方向キーを離すだけで失速する。デモの下の段の既定の設定では、離してから 0.2 秒で横の動きが止まる。3 つ目の試行のように跳んだ後 4 フレームだけ右を押して離すと、空中で進む距離は速さを保つ場合の体の幅 6 個分から 1.5 個分に縮む。地上と同じ処理で空中の横の速さを決めると、離したときの減速も地上と同じになる。地上で離すとすぐ止まる作りなら、空中でも離した瞬間に横の動きが止まって真下に落ちる。

遠くへ跳ぶ場面があるゲームでは、空中で離しても速さを保つか地上よりずっと弱く減速する。空中で止まりたいときは反対向きに押せば止まれるので、離したときの減速を弱くしても止まる手段は残る。

空中の最高速と助走

空中の最高速を地上と同じにすると、止まった所から跳んでも空中で加速して遠くまで届く。デモで止まった所から跳んで右を押し続けると、割合 50% で体の幅 5.1 個分進む。走って跳んだときの 6 個分と大差がなく、助走して跳ぶ意味が薄れる。空中の最高速を地上の半分にすると、同じ跳び方で進むのは 2.7 個分にとどまる。遠くへ跳ぶには地上で速さを付けてから跳ぶ必要が出る。

このとき地上で付けた速さは空中でも削らず、空中で押して出せる速さだけを抑える。跳んだ瞬間に空中の最高速まで下げると、走って跳んでも遠くへ届かなくなる。デモの 2 つ目の試行で空中の最高速を地上の半分にすると、割合をいくつにしても向こうの足場に届かない。

面の作りとほかの用語との関係

空中制御が弱いほど、跳ぶ前の助走の距離と踏み切りの位置が着地点を決める。小さな足場や遠い足場の手前には、最高速まで走れる平らな床を置く。踏み切りが足場の端のぎりぎりになるので、足場を離れた直後のジャンプを受け付ける「コヨーテタイム」もあわせて入れる。

地上の加速(「加速と減速」)に時間をかけると、止まった所から跳んだときの横の速さは遅くなる。デモの 2 つ目の試行では跳んだ瞬間の横の速さが最高速の 3 分の 1 しかなく、空中制御のない上の段はその速さのまま穴に落ちる。

「可変ジャンプ」が跳んだ後の縦の動きを変える仕組みなのに対し、空中制御は横の動きを変える。二つがそろうと、跳んだ後に着地点を縦にも横にも選べる。

関連項目