タイルベースのゲームでのスムーズな動き


8

キャラクターをタイル間でスムーズに移動させるにはどうすればよいですか?彼はタイルごとに移動しますが、それは専門外に見えます。さらに、矢印キーを押したままにすると、画面を横切って動きます。どうすればそれを防ぐことができますか?


プレーヤーの動きに整数を使用しています。代わりにフロートを使用してみてください。
Mokosha 2013年

1
コードを問題/デモンストレーション/コミュニケーションに必要な最小限に削減することが最善です。また、この質問に興味があるかもしれません。
kevintodisco 2013年

1
質問の不要な部分を削除しました。ポイントに到達し、追加のコードやその他の綿毛を追加しないことが最善です。
MichaelHouse

回答:


6

スムーズな動きは、さまざまな方法で実現できます。そしてそれは本当にあなたがどのような動きを許可したいかに依存します。

  • 動きはまだタイルに制限されています。このタイプは、衝突検出やその他の移動チェックなどを行うのに最も簡単です。このタイプの動きでは、タイル間を移動するときに、時間の経過に伴って位置を補間するだけです。次のようなものを更新ループに追加するのと同じくらい簡単です。

疑似コード:

 if(GetDistance(position, targetposition) > minDistance) {
     position = MoveTowards(position, targetposition, deltatime);
 }

どこにMoveTowardsちょうど現在位置を取り、それと目標位置との距離の部分を追加します。

  • 動きはタイルに限定されません。これは、実装がかなり難しくなります。基本的にこの方法では、位置を保存し、速度で更新するだけです。つまり、時間の経過に伴う位置の変化です。

矢印キーを押しながら文字を移動する方法もいくつかあります。おそらくあなたがやっていることは次のようなものです:

if(keydown(left))
   tilePosition.X--;

これは確かにキャラクターが画面を横切ってジップする原因になります。あなたは毎秒何回も位置を更新しているでしょうから。これを実装するもう少し良い方法は、遅延を追加することです。何かのようなもの

if(keydown(left)) {
    if(leftKeyHeldTimer > movementDelay) {
        tilePosition.X--;
        leftKeyHeldTimer = 0;
    } else {
        leftKeyHeldTimer+= deltaTime;
    }
}

これにより、遅延タイマーが追加movementDelayされ、値が満たされた場合にのみタイルの位置が更新されます。


0

2つの問題を特定できます。1つ目はスムーズな動きに関連し、2つ目はキャラクターが画面をジップオフすることに関連しています。

滑らかな動きを作成するには、線形補間(LERP)と呼ばれる手法を使用して動きを滑らかにします。基本的にそれがどのように機能するかは、開始点と終了点の間であり、一連の漸減する短い距離を計算して滑らかな動きをエミュレートし、終点に近づくにつれて遅くなります。

この関数の最も単純な例は次のとおりです。

//point1 is the current position, will be starting position on first call
//point2 is the target position
//epsilon is the % of the distance between current and target you want
//to cover per game physics loop (a fixed realworld time based loop).
//The smaller the % the "smoother" the motion.

float lerp(float point1, float point2, float epsilon)
{
    return point1 + epsilon * (point2 - point1);
}

キャラクターがポイント2に近づくと、徐々に減速します。ただし、実際にはポイント2に触れることはありませんが、無限に接近します。これを修正する必要があります。プレーヤーがポイント2からの無限の距離よりも短い場合は、プレーヤーがポイント2にいると見なすことができます。

あなたが言及した2番目の問題は、キャラクターが画面外に飛んでいることに関連しています。これは、ゲームループの更新ごとに読み込まれる入力がタイル間の瞬時の動きと組み合わされた結果です。

理想的にはこれを解決するには、コードで決定する必要があります

  1. キャラクターがポイント1からポイント2に移動するのにかかる実際の時間。
  2. この期間で、Lerpをポイント1と2の間で実行するように設定します
  3. ポイント2に到達したら、入力を再度読み取り、どこへ行くかを決定します
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.