3

これを扱ったいくつかの記事を読みましたが、いくつかの実装を試みた後、常に同じ問題が発生し、

簡単なメモ:これは在宅勤務です

XNA を使用して、ゲーム デザインのクラスで大乱闘スマッシュブラザーズ (N64 スタイル) を再作成しています。今、私には密接に関連する2つの問題があります.SSBに精通している人なら誰でもコンボ攻撃を知っているでしょう.つまり、「Forward A」、「Up B」などを押してください.私は現在働いているヨッシーを持っています。私が見つけた主な問題は、キーがまったく同時に押されない限り、別の動き、つまりUp Aの場合、ジャンプがオフになることです

現在、私のifステートメントは....

if (state.IsKeyDown(Keys.Up) && state.IsKeyDown(Keys.B))
{
  actionComponent.curAction.secondaryAction = SecondaryAction.Stand;
  actionComponent.curAction.primaryAction = PrimaryAction.Up_B; 
}
else if (state.IsKeyDown(Keys.Up) && state.IsKeyDown(Keys.A))
{
  //Console.WriteLine("This is C#");
  actionComponent.curAction.primaryAction = PrimaryAction.Up_A;
  actionComponent.curAction.secondaryAction = SecondaryAction.Smash;
  spriteComponent.curColumn = 0;
}
else if (state.IsKeyDown(Keys.Up))
{
  actionComponent.curAction.secondaryAction = SecondaryAction.Jump;
  actionComponent.curAction.primaryAction = PrimaryAction.None;
} 

私は明らかに、可能なアクションごとにさらに多くのアクションを持っていますが、それらはすべて、1回のキープレスが最後のキープレスになるように配置されているため、他のキーを登録することができますが、同時にそれらを押さない限り、キープレスを登録しません-a私が試したいくつかのアイデア、ifステートメントで矢印キーを処理し、スレッドを少しの間スリープさせてから、矢印キーとボタン、つまりAが押されたらひよこ)

私の2番目の問題、私は実装について議論していますが、実装する場合、SSBプレーヤーはジョイスティックを少し前に押すことを認識し、Aを押すとクイックキック/ジャブが得られますが、キーを強く押します(ジョイスティックは遠くに/多分速く/ e)スマッシュムーブを作成し、軽いキープレスと重いキープレスを認識するシステムを実装する方法を考えていますか?

4

1 に答える 1

3

あなたの問題は、XNA がデフォルトで 60Hz ループになることです。そのため、ゲームのクロックが十分に速い場合は、16 ミリ秒ごとにキープレスをチェックしています。これにより、両方のキーを押すための非常に小さなウィンドウが得られます.2つのキーが約10ミリ秒以上離れて下がると、おそらく2つの別々の更新ループになり、コンボの移動ではなく単一のキー押下としてカウントされます. . 人間の反応時間は約 150 ~ 300 ミリ秒なので、人間の入力で得られる不正確さの範囲内に収まっています。

おそらく、入力バッファーの使用を検討します。のようなListものKeyValuePair。ループを一周するたびに、現在押されているボタンを現在の時間とともにバッファに追加し、時間が特定のタイムスパンよりも古いものをすべて削除してから、バッファの内容がコンボの動きと一致するかどうかを確認します。これにより、瞬間的なコンボと連続したコンボが可能になります (たとえば、動作しA, A, Left+Bます)。その間、単一のキープレスによってトリガーされた動きをキャンセルする何らかの方法を検討する必要があるかもしれませんleft, jump&punch. .

軽い/重いキープレスに関しては、あなたが考えている方法ではこれが可能だとは思いません-コンピューターのキーボードは非常に単純なデバイスです。ボタンは単純なオン/オフ ユニットで、圧力や速度に関する情報はありません。キープレスがどれだけ離れているかを見ることができます-説明されているバッファアプローチを使用する場合、キープレスで保存された時間を使用して、プレス間の時間を取得できます。その時間が特定の間隔よりも長い場合は、弱いまたは遅い動きを使用します。

于 2013-03-13T12:16:21.517 に答える