【スマブラSP】スティーブ参戦でプログラマは何を頑張ったのか?

スマブラSPにスティーブが参戦するにあたって、プログラマはやプランナーは何が大変だったのか、ツイッターでバズってたネタとかも含めて考察してみたいと思います。 ※公式とは無関係!つかいかた動画からの考察です。
104
AiNI @aini_bellwood

スマブラSPにスティーブが参戦するにあたって、プログラマはやプランナーは何が大変だったのか、ツイッターでバズってたネタとかも含めて考察してみたいと思います。 ※公式とは無関係!つかいかた動画からの考察です。 pic.twitter.com/mD0J3Y0rsh

2020-10-11 21:50:42
拡大
AiNI @aini_bellwood

スティーブのアクションはプログラム的にはシンプルなものが多く、どれも既存実装の組み合わせで実現できそうです。火打ち石での着火とかまんまPKファイヤーだし。 ただし、桜井さんも言ってたとおり、2つの要素に関しては既存実装では対応できません。 すなわち、「採掘」と「ブロック生成」です。

2020-10-11 21:52:45

採掘について

AiNI @aini_bellwood

採掘は「地面や壁の素材によって出現するアイテムが変化する」という仕様です。 これを実現するには、地面や壁といった「採掘の対象」に、木や土や鉄といった「属性」を設定する必要があります。

2020-10-11 21:53:02
AiNI @aini_bellwood

属性ごとに採掘のアイテム出現テーブルを変更することで、採掘対象ごとに出現するアイテムを変更する、ということが可能になります。 問題は、どうやって採掘対象に属性を設定するか。

2020-10-11 21:54:44
AiNI @aini_bellwood

これに関してはパッと思いつく方法が2つあります。ひとつは、空間に属性を設定する方法。 空間をいくつかに区切って、その空間内で採掘した場合、対応する属性での採掘を行う、という形。

2020-10-11 21:54:56
AiNI @aini_bellwood

非常にシンプルな実装ですが、問題が多くあります。 まず、移動する足場に対応できない。足場が移動すれば当然ながら採掘する空間も移動することになるんですが、じゃあ移動先の属性はどうするの?ってなっちゃう。

2020-10-11 21:55:35
AiNI @aini_bellwood

属性も移動させればいいじゃんってことになりますが、それって二度手間なんですよね。 足場が移動するルートに沿って属性も移動させなきゃいけない。足場の移動ルートと同じようなデータ・制御を、属性でも実装しなきゃいけない。 じゃあもう足場に属性つければいいじゃん。

2020-10-11 21:55:47
AiNI @aini_bellwood

これが2つ目の方法、オブジェクトに属性を付ける方法です。足場や地形といったオブジェクトそのものに属性を設定します。これなら、足場が移動しても属性は足場に追従します。 しかもこの方法はある程度手抜きができます。そもそも「オブジェクトに対する属性」は、既に設定されているのです。

2020-10-11 21:56:15
AiNI @aini_bellwood

足場や地形は、種類ごとに足音や着地音が変化します。それぞれのサウンドはオブジェクトの種類によってざっくり分類して指定されています。 この分類を、採掘テーブルに使用する属性として使用することができます。既に地形には属性がついているのです。

2020-10-11 21:58:05
AiNI @aini_bellwood

もちろん、サウンド用の設定をそのまま流用すると、どこか別の所で問題が起きるかもしれないため、そういった点の確認は必要です。 しかし、全くのゼロから設定するのよりはだいぶ楽にできるはず。

2020-10-11 21:58:13
AiNI @aini_bellwood

さて、これで「採掘」はできるようになりそうです。次は「ブロック生成」。 ブロック生成は、ぱっと考えただけでもかなり大変そうです。ひとつずつ検討していきます。

2020-10-11 21:58:25

ブロック生成について

AiNI @aini_bellwood

まず、ブロック生成では衝突判定を持つブロックを生成します。この時点で大変厳しい。 たとえば、既にファイターなどの衝突判定を持つものと重なるようにブロックを生成する場合。 ブロックと重なったファイターをどう逃がすのか?逃げる先にもブロックがあったらどうするのか?などなど。

2020-10-11 21:58:38
AiNI @aini_bellwood

「どの座標を基準にしてブロックを生成するか?」も大切です。 平地でのブロック生成は比較的簡単ですが、たとえば坂道でブロック生成を行った場合、どんなふうにブロックが生成されるのか? pic.twitter.com/BdTTkGICok

2020-10-11 22:00:56
拡大
AiNI @aini_bellwood

スティーブのジャンプの高さはちょうど1ブロック分ですから、ジャンプ地点がブロックの底にちょうど接するように生成する必要があります。 そうすると、位置によっては微妙に高さの異なる場所にブロックが生成されることになります。 pic.twitter.com/5r5Mtox9Kb

2020-10-11 22:01:32
拡大
AiNI @aini_bellwood

以降のブロックは全てその微妙にずれた位置準拠で生成されることになります。 難しく言うと、ブロックの座標系が最初に生成されたブロック準拠となる、ということですね。

2020-10-11 22:02:34
AiNI @aini_bellwood

そうすると、たとえば自分が生成したブロックと、他のプレイヤーが生成したブロックは、生成した場所によって微妙に位置がずれることになります。 自分のブロックと他人のブロックはうまく接続できない、ということになりますね。どうしたものか。 pic.twitter.com/377J9Q6Xko

2020-10-11 22:02:41
拡大
AiNI @aini_bellwood

この問題を解消する手法がひとつあります。 それは、マップに方眼紙のようなグリッドを規定し、そのグリッドに沿ってブロックを生成させる、という手法です。 pic.twitter.com/kxCnmB0nVr

2020-10-11 22:02:56
拡大
AiNI @aini_bellwood

スティーブの位置に沿ってブロックを生成するのではなく、スティーブが今いる位置に一番近いグリッドにブロックを生成する、という手法ですね。 こうすれば、他人のブロックともうまくつながるようになる。

2020-10-11 22:03:12
AiNI @aini_bellwood

しかしこの方法だと、スティーブの足元から微妙にずれた位置にブロックが生成されることになります。 また、場所によっては最初から半分ブロックが埋まった場所に生成される、なんてことにも。なんとも厄介です。 pic.twitter.com/V5eWJKC1RV

2020-10-11 22:03:31
拡大
AiNI @aini_bellwood

果たしてスマブラチームのプログラマがどんな手法でブロック生成を可能にしたのか、興味は尽きないところです。 配信日が待ち遠しい。

2020-10-11 22:03:39
AiNI @aini_bellwood

あ、動画で桜井さんが言ってたブロックの連続生成、あれは意外とかんたんです。 スティーブの足元に当たり判定を生成し、これがブロックに触れてなければこの位置にブロックを生成すればいい。

2020-10-11 22:03:53
AiNI @aini_bellwood

スティーブにおける特殊実装は概ねこんなところでしょうか。 マイクラステージの破壊ブロックとか、他にも考察の種はありますが、今回はこのへんで。

2020-10-11 22:04:04