キャラクターをタイル間でスムーズに移動させるにはどうすればよいですか?彼はタイルごとに移動しますが、それは専門外に見えます。さらに、矢印キーを押したままにすると、画面を横切って動きます。どうすればそれを防ぐことができますか?
キャラクターをタイル間でスムーズに移動させるにはどうすればよいですか?彼はタイルごとに移動しますが、それは専門外に見えます。さらに、矢印キーを押したままにすると、画面を横切って動きます。どうすればそれを防ぐことができますか?
回答:
スムーズな動きは、さまざまな方法で実現できます。そしてそれは本当にあなたがどのような動きを許可したいかに依存します。
疑似コード:
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
され、値が満たされた場合にのみタイルの位置が更新されます。
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番目の問題は、キャラクターが画面外に飛んでいることに関連しています。これは、ゲームループの更新ごとに読み込まれる入力がタイル間の瞬時の動きと組み合わされた結果です。
理想的にはこれを解決するには、コードで決定する必要があります