2D格闘ツクール2ndのバグ・よくあるミス

■ チュートリアル


■ コマンド解説


■ テクニック解説
 001 特殊なキャラクターセレクト
 002 画面レイアウト
 003 カラーセレクトの設定
 004 ヒットエフェクトの研究
 005 ヒットエフェクトの描き方
 006 スクリプト一覧のテキスト化
 007 通常立ちの設定
 008 VSで開始位置指定
 009 雛型キャラの作成
 010 INIファイルの内容
 011 変数の大小チェック
 012 当て身投げの作り方
 013 必殺技コマンドの設定
 014 アニメ作成_通常攻撃
 015 ゲームモードによる分岐
 016 変数の一覧を記録
 017 受け身入力の判定
 018 ダウン値による分岐処理
 019 飛び道具の作成
 020 ワープ技の作成
 021 ヒット硬直のコントロール
 022 ステージの地面表現
 023 ヒット数表示の固定
 024 横方向のホーミング攻撃
 025 1P/2Pの判別
 026 ライフ減少アニメ
 027 画面下部の表示内容
 028 ステータス表示の意味
 029 ガードクラッシュの表現
 030 押せないOBJ
 031 アイテムのあるゲーム
 032 復活する技の作成
 033 空ガードの作成
 034 ステージ選択付きキャラセレ
 035 ゲージMAXの表示
 036 固定ダメージを表現する
 037 ラン動作の作成
 038 投げ技によるKOの作成
 039 ボタン溜め押し技の作成
 040 中段攻撃の作り方
 041 製作に役立つツール
 042 カラーセレクトに適した画像
 043 相手によって動作変更
 044 横幅のあるキャラを表現
 045 ラウンド限定の動作
 046 影色の塗りを効率化
 047 モードを切り替えるキャラ
 048 当たり判定設定のコツ
 049 空中ジャンプを表現する
 050 キャラの向きを判別する
 051 途中でKOしない乱舞技
 052 カウンターヒットの作成
 053 OBJの動作を停止
 054 ハイジャンプの作成


■ バグ・よくあるミス


■ テスト時のチェック項目


■ 解説用データ ダウンロード


021

コマンドが左右反転する2

コマンドが左右反転する問題
以前、コマンドが左右反転する問題について
応急処置的にその対処法を説明しました。

当たり判定を利用して飛び越えを検知、
それを条件としてコマンド反転を矯正する
というものでしたが、
作成するゲームによっては悠長に当たり判定の結果が
出るのを待っていられない、という場面もあるかと思います。

 例えば、互いのキャラが頻繁に空中で移動を行う場合や
 相手キャラの真上位置(飛び越えの切り替えが発生する瞬間)にて
 空中移動を出す場面が多い…など。

そこで今回はコマンド左右反転対策「改」として
改良版の対処法を紹介したいと思います。
※今回の処理では変数を多めに使用します。また、処理の難易度も高めです。
 チャレンジされる場合はこれらの点に十分注意しておいてください。



現状の確認
前回の対策ページでも説明しましたが、
ここであらためて問題の発生状況を確認しておきたいと思います。

ゲーム開始、自キャラは画面左側に立っています。
画面左側に立つ自キャラ

空中で方向キーを → ・ → と入力すると
空中前ダッシュ
空中前ダッシュが出ます。

空中で方向キーを ← ・ ← と入力すると
空中後ダッシュ
空中後ダッシュが出ます。

ここまでは問題ありませんが、自キャラが空中で相手を飛び越えた時…
相手を飛び越えたところ

ここで → ・ → を押してみます。
→・→入力なのに空中後ダッシュ
本来なら空中前ダッシュが出るところですが
なぜか空中後ダッシュが出てしまいます。

逆に ← ・ ← を押すと前ダッシュが出ます。
←・←入力で前ダッシュ
空中で相手を飛び越えた瞬間、自身のコマンド入力が左右反転してしまっているのです。

MEMO

コマンドの左右反転とめくり
格闘ゲームにおいて、
飛び越えられた側でガード入力の方向が左右反転するのは
1つのルール・テクニックとして有名で
相手をその状態に陥れることを「めくり」と呼びます。

しかし、今回の問題では飛び越えられた側だけでなく
飛び越えた側もコマンドが左右反転しています。
実際に動かしていてひどく違和感を感じる部分なので
なんとしてもこれを修正したいところです。


考え方
相手を飛び越えた状態では、自身のコマンドが左右反転してしまいます。
例えば、 → ・ →← ・ ← に、 ← ・ ←→ ・ → に逆転してしまいます。

この流れ自体は変えられないので、
間違って呼び出された技動作から本来の技動作へ処理を飛ばすようにします。
( 今回の場合、丁度逆方向の技コマンドがあるのでこれを1つの対として考えます )
コマンド反転対策のイメージ

------------------------------------------------------------
動作の矯正例としては以下のようなパターンが考えられます。
相手飛び越え状態において…
空中前ダッシュが出た ⇒ 本来は空中後ダッシュなので空中後ダッシュに処理を飛ばす。
空中後ダッシュが出た ⇒ 本来は空中前ダッシュなので空中前ダッシュに処理を飛ばす。


空中前ダッシュ、空中後ダッシュ双方のスクリプト先頭にて
もう一方の技動作への分岐処理を組めば良いわけです。
ここで重要となるのが「相手を飛び越えている」という判定。
前回の説明では攻撃判定を利用しましたが、
ここではより精度の高い判定処理を組みたいと思います。


仕組み
相手を飛び越えているかどうか。
頭の中でキャラの状態をイメージしてください。
相手飛び越えのパターン
右を向いた自キャラが右側にいる相手キャラをジャンプで飛び越えた時。
左を向いた自キャラが左側にいる相手キャラをジャンプで飛び越えた時。


これを判定するには以下の要素を把握する必要があります。
A.自キャラの向き
B.1PのX座標
C.2PのX座標
D.自キャラは1Pか2Pか


ここから先の説明では
A 〜 Dを組み合わせた飛び越え判定を作って行きたいと思います。


スクリプトの作成
飛び越え判定を組んでいきます。

使用する変数を決める
上で説明したA 〜 Dの要素を把握するにはそれを記憶しておく変数が必要です。

例では以下のような変数を用意しました。
※自分の環境に合わせて読み替えてください。
A.自キャラの向き    キャラ変数H
B.1PのX座標      システム変数K
C.2PのX座標      システム変数L
D.自キャラは1Pか2Pか キャラ変数F

------------------------------------------------------------
処理の大本となる部品を組む
飛び越えの判定はやや複雑な処理となっていますが
複数のテクニックを組み合わせもの、と考えれば理解しやすいです。
D.自キャラは1Pか2Pかについては、以下のページで。
⇒ テクニック025 1P/2Pの判別

A.自キャラの向きについては、以下のページで説明しています。
⇒ テクニック050 キャラの向きを判別する

まずは以上の処理が上手く動くことを確認してください。


キャラのX座標を取得
B.1PのX座標C.2PのX座標を把握するための処理を組みます。
なお、この処理を組む前に
D.自キャラは1Pか2Pかの処理が正しく動くことを確認しておいてください。

------------------------------------------------------------
考え方
変数命令を使えば自身のX座標を取得することが出来ます。
しかし、スクリプト内のどこで( どのタイミングで )座標を取得するか
はよく考える必要があります。

格闘ゲームのキャラは色々な動作を行い、そして画面内を縦横無尽に動き回ります。
そのことを考えると、キャラ本体のスクリプトで座標取得を行うのは現実的ではありません。
座標取得のタイミングについて
そこで、自キャラに同期するオブジェクトを用意して
その中でX座標を取得することにします。

 取得するのはオブジェクトのX座標ですが、
 同期によって オブジェクトのX座標 = キャラのX座標 となるため
 間接的にキャラのX座標を取得していることになります。


------------------------------------------------------------
スクリプト編集
まずは座標取得用OBJという行を用意、そこに以下のような処理をセットしてください。
座標取得用OBJのスクリプト
番号 命令 設定内容
1 I WAIT = 5
2 V 数値計算無し、条件分岐 キャラ変数F = 1 なら 6
3 V システム変数K に データ:X座標 を代入、条件分岐無し
4 I WAIT = 2
5 SG 2
6 V システム変数L に データ:X座標 を代入、条件分岐無し
7 I WAIT = 2
8 SG 2

ループを繰り返す中で座標を取得する、という処理です。

2ブロック目では1P/2Pの分岐を行っている点に注目してください。
1Pの場合は3〜5の処理を、2Pの場合は6〜9の処理を実行します。
変数命令のオプション項目「変数使用」をONにすれば
対象の座標を取得することが出来ます。
※似たような名前の選択肢が多いので注意してください。

セットする画像は何でも構いませんが、テスト時は
その存在がわかるよう多少目立つグラフィックを表示しておくと処理がわかりやすいです。

座標取得用OBJの行が完成したら、次はそれを呼び出す処理を用意します。
「開始時」行に以下の処理をセットしてください。
開始時のスクリプト
番号 命令 設定内容
1 I キャラの開始ポーズ、WAIT = 5
2 O X:0, Y:-190 に 「座標取得用OBJ」を発生、親と同期・無条件をON
3 I キャラの開始ポーズ、WAIT = 5

オブジェクト呼出の手前、1ブロック目で画像を表示していますが、
これは1P/2P判別の処理を待つためのものです。
( 判別自体は一瞬で済むとは思いますが念のため )

これで座標取得の処理は完成です。

最後の飛び越え判定作成の前に、
ここまでで用意したスクリプトを一覧表で確認しておきます。
用意したスクリプトの一覧
用意できていないものがある場合は
関連ページを参照してスクリプトを作成してください。


飛び越えの判定処理
先に、処理追加の元となるスクリプトを確認しておきます。
空中前ダッシュ
ベースとなる空中ダッシュスクリプト
番号 命令 設定内容
1 M 移動X = +5.00, 移動Y = -1.00, 重力X = 0, 重力 Y = 無視  代入
2 FD 通常の当たり判定( 後述する特殊判定をリセットするためのもの )
3 I 空中ダッシュを行うキャラグラフィック
4 E  

話を簡単にするためにスクリプトは最小の構成にしてあります。
※空中後ダッシュも移動方向が違うだけで基本は同じ構成にしています。

ここの先頭に飛び越え判定を追加するのですが、
処理の流れを大まかに説明すると、以下のような感じになります。
1.座標比較用に変数を初期設定
2.変数の大小比較処理を呼ぶ
3.比較結果の変数を保持しておく
4.1Pか2Pか、の分岐
5.右向きか左向きか、の分岐
6.座標比較の結果による分岐
7.判定した結果、飛び越えている場合の分岐
8〜空中前ダッシュの処理


------------------------------------------------------------
スクリプト解説
実際のスクリプトを以下に載せておきます。
空中ダッシュのスクリプト
番号 命令 設定内容
1 FD キャラ下方に伸びる幅の小さいぶつかり判定
2 O テスト用表示:「1P/2P表示」を発生、親と同期・無条件をON、奥行き = 手前
3 O テスト用表示:「キャラの向き表示」を発生、親と同期・無条件をON、奥行き = 手前
4 V タスク変数Aに 0 を代入、条件分岐無し
5 V タスク変数Bに システム変数K を代入、条件分岐無し
6 V タスク変数Cに システム変数L を代入、条件分岐無し
7 SC 「変数の大小チェック」をスクリプト呼出
8 I キャラグラフィック、空中ダッシュ発動直前のポーズ、WAIT = 2
9 V キャラ変数O = タスク変数A、条件分岐無し
10 O テスト用表示:「大小チェックの結果表示」を発生、親と同期・無条件をON、奥行き = 手前
11 V 数値計算無し、キャラ変数F = 1 なら 19
12 V 数値計算無し、キャラ変数H = 0以下 なら 16
13 V 数値計算無し、キャラ変数O = 1 なら 「空中後ダッシュ」 27
14 I キャラグラフィック、空中ダッシュ発動直前のポーズ、WAIT = 12
15 SG 27
16 V 数値計算無し、キャラ変数O = 2 なら 「空中後ダッシュ」 27
17 I キャラグラフィック、空中ダッシュ発動直前のポーズ、WAIT = 12
18 SG 27
19 V 数値計算無し、キャラ変数H = 0以下 なら 23
20 V 数値計算無し、キャラ変数O = 2 なら 「空中後ダッシュ」 27
21 I キャラグラフィック、空中ダッシュ発動直前のポーズ、WAIT = 12
22 SG 27
23 V 数値計算無し、キャラ変数O = 1 なら 「空中後ダッシュ」 27
24 I キャラグラフィック、空中ダッシュ発動直前のポーズ、WAIT = 12
25 SG 27
26 E 処理の区切り用に終了命令
27 M 移動X = +5.00, 移動Y = -1.00, 重力X = 0, 重力 Y = 無視  代入
28 FD 通常の当たり判定(後述する特殊判定をリセットするためのもの)
29 I 空中ダッシュを行うキャラグラフィック
30 E  

※色分けがゴチャゴチャして見づらいですが、上記スクリプト画像と比較しながら理解してください。
今回の処理では基本的にキャラの防御枠設定を省略していますが、
1ブロック目ではぶつかり判定を置いています。
これは通常のぶつかり判定とは別物で
1PのX座標 = 2PのX座標 となるのを防ぐための処置となっています。

 X座標が必ず不一致になるよう強引に位置をずらす
 空中移動を発動した瞬間に 1PのX座標 = 2PのX座標 となるのは
 両者が上下に重なる位置にある場合。
 なので、飛び越える側のキャラからぶつかり判定を出すことで
 キャラの現在座標を左右どちらかにずらすわけです。
 (判定のルール上、ぶつかり判定を重ねたままにすることは出来ないという性質を利用)

飛び越えの判定が済んだ後、実際に座標移動を始める前に
ブロック28でぶつかり判定をリセットしている点に注意してください。
※これをやっておかないと相手を飛び越えられなくなる可能性があるので注意。

2〜3ブロック目、およびブロック10は動作確認用のオブジェクト呼出になります。
詳しくは後述しますが、テスト用に変数の状態を画面上に出すことで
スクリプトの動きを目に見やすくしています。
( 簡単に言えば、デバッグ用のテスト表示です )

4〜6ブロック目では3つのタスク変数に初期値をセットしています。
タスク変数A 判定結果用、初期値は0をセットしておく
タスク変数B 判定対象1、初期値は1PのX座標をセットしておく
タスク変数C 判定対象2、初期値は2PのX座標をセットしておく

ここでセットした内容はスクリプト呼出先でもそのまま維持されます。
※スクリプト「移動」だと値が消えるので注意。

7ブロック目では「変数の大小チェック」を呼出しています。
処理の結果はタスク変数に入るのですが、数値の意味を以下に載せておきます。
タスク変数A = 0の場合、 B = Cである
タスク変数A = 1の場合、 B > Cである
タスク変数A = 2の場合、 B < Cである


 上の条件文は「変数の大小チェック」側で決めたルールです。
 詳しくは以下の関連ページを参照してください。
 ⇒ テクニック011 変数の大小チェック

9ブロック目では得られたタスク変数Aの内容をキャラ変数Oにコピー、保持していますが、
これは先述した通りタスク変数が不安定でちょっとした処理移動で消えやすいためです。

11行目以降は処理の中心となるの飛び越え判定処理です。
( ここまでの処理は判定を行うための下準備です )

パッと見た感じでは変数分岐がずらずらと並んでいてわかりにくいですが、
分岐の流れをフローチャート図にすると以下のような感じになります。
飛び越え判定のフローチャート図
判定の結果「飛び越えていた」場合は対となる空中移動( 空中後ダッシュ )へ移動、
「飛び越えていなかった」場合はそのまま通常通りに空中前ダッシュを行います。

以上で飛び越え判定の処理が完成です。
同様にして対となる「空中後ダッシュ」の処理も組みましょう。
※処理の飛び先が変わるだけで、基本的な流れは全く同じです。

一連のスクリプト編集が済んだらテストプレーを実行、処理の動作を確認してください。


テストプレーで処理を確認
テストプレーを実行して処理を確認してください。
当然のことですが、飛び越えの判定は1Pと2P両方で処理しないと成立しません。
そのため、必ず同キャラでテストするようにしてください。
2P側でも飛び越えの判定をチェック
1P側、2P側で判定を確認します。

問題無いことが確認できたら、他のキャラについても必要な処理を追加しておきましょう。
コマンド反転の起きないキャラでも、相手側のために
1P/2Pの判別やキャラX座標の取得は最低限行っておく必要があります。


テスト用表示処理
上の方で軽く説明しましたが、
ここではデバッグ用に3つのテスト表示オブジェクトを用意しています。
飛び越え判定が上手く行かない場合は、
これらテスト表示の内容に誤りがないかを確認すると良いです。

以下に各テスト項目のスクリプトを載せておきます。
なお、テスト表示用のグラフィックもこちらで用意しておきましたのでご自由にお使いください。
テスト項目表示用のグラフィック
※上記画像はPNG形式となっております。
 エディタに読み込む際はBMP形式に変換してお使いください。


処理内容としては非常にシンプルです。
変数分岐の処理自体に慣れていない場合は
このテスト表示で動き方を研究してみると理解が早いと思います。
※各行を呼び出すタイミングについては上のスクリプト表を参考にしてください。

1P/2P表示
1P/2P表示用スクリプト
番号 命令 設定内容
1 V 数値計算無し、キャラ変数F = 1 なら 4
2 I 1Pの表示、WAIT = 50
3 E  
4 I 2Pの表示、WAIT = 50
5 E  


キャラの向き表示
キャラの向き表示用スクリプト
番号 命令 設定内容
1 V 数値計算無し、キャラ変数H = 0以下 なら 4
2 I 「右」の表示、WAIT = 50
3 E  
4 I 「左」の表示、WAIT = 50
5 E  


大小チェックの結果表示
大小チェックの結果表示用スクリプト
番号 命令 設定内容
1 V 数値計算無し、キャラ変数O = 2 なら 7
2 V 数値計算無し、キャラ変数O = 1 なら 5
3 I 「B = C」の表示、WAIT = 50
4 E  
5 I 「B > C」の表示、WAIT = 50
6 E  
7 I 「B < C」の表示、WAIT = 50
8 E  


実際にこれらテスト表示を画面に出すと次のような感じになります。
テスト用表示項目を画面に出したところ
繰り返しになりますが、
キャラの動作が上手く行かない時はテスト表示の内容を良く見ると良いです。
表示内容に間違いがあった場合は変数の取得または表示処理に問題有り
そうでなかった場合は、
取得値に対する飛び越え判定の条件文が間違っている と考えられます。


最初の方でも述べた通り、
空中でのコマンド左右反転は非常に違和感の大きい要素と言えます。
ここではより精度の高い飛び越え判定を行うために
X座標の比較を行っていますが、それでも両者が上下に重なる位置では
確実な飛び越え判定を保証できるわけではありません。

この場合は前後ジャンプの左右移動力を見直して
両者のX座標が重なる時間を出来るだけ短くするなど、
小手先ではありますが問題の起きにくい状態を作るよう心がけると良いです。

 空中での前後ダッシュがあるから
 通常の前後ジャンプは左右移動量小さめでいいや、
 みたいに考えるとこの問題に陥りやすいので注意してください。


今回の処理では複数のテクニックを組み合わせた「合わせ技」として説明していますが、
この 「部品」を組み合わせて別の「処理」を作り出す
という考え方はスクリプト編集を行う上で非常に大切です。

例えば処理が上手く動かなかった時にどこをチェックすべきか?
一連の判定処理を1まとまりで作ってしまうと、どこに問題があるか分かりづらいです。
一方で今回のように複数のスクリプトの組み合わせとして組んでおくと
部品単体での問題か、それらの計算結果を扱う部分の問題か
問題の発生箇所が非常に把握しやすくなります。

 また、「変数の大小チェック」などは別の処理から呼び出すなど
 処理の再利用・使い回しがしやすいという効果もあります。
 余裕があればこのあたりを考えながらスクリプトを組んでみると良いでしょう。


以上、大変長くなりましたが
空中でコマンドが左右反転する問題に関する対処法の説明を終えます。
なお、今回説明した内容について気になる点や疑問点などがあれば
掲示板 にて質問を受け付けておりますので気軽にお尋ねください。



ページ先頭へもどる

トップページへもどる

inserted by FC2 system