ゲーム開発、特にシミュレーションゲームやサンドボックスゲームでは、マップの無限のループ効果を実現する必要があることがよくあります。そうすることで、プレイヤーはマップ上で移動して「境界のない」仮想世界を作成するときに無意識のうちに出発点に戻ることができます。このマップループの実装は、通常、座標系の連続的な更新と制限に依存します。 PHPはゲームロジックでは比較的まれですが、Web側のゲームやサーバー側のロジックに関しては、強力なスクリプト言語としてのPHPは、一部のデータ操作と機能モジュールを効果的に処理できます。
この記事では、PHPのfmod()関数を使用して、マップループ機能の実装を支援する方法に焦点を当てます。具体的には、プレーヤーの現在の位置とマップサイズを計算することにより、 fmod()関数を使用して、マップの端に到達するときにプレーヤーが反対の開始位置に自動的に戻ることができることを確認します。
FMOD()関数は、浮動小数点数の分割を計算するPHPの残りの関数です。その基本的な構文は次のとおりです。
fmod(float $x, float $y): float
$ x :分割。
$ y :除数。
この関数は、残りをxで割ってyで割って返します。たとえば、 FMOD(10、3)を持っている場合、 10の残りの10を3で割ると1が戻ります。
シミュレーションゲームでは、マップの境界は通常事前に定義されており、変数を使用して、 MAP_WIDTHやMAP_Heightなどのマップの幅と高さを表すことができます。プレーヤーの位置は、座標系でも表されます。プレーヤーが移動するとき、プレイヤーの現在の位置がマップの境界を超えるかどうかを判断する必要があります。それを超えると、プレーヤーの位置はFMOD()関数を介して再計算され、反対側に戻ります。
プレーヤーの現在の位置が(player_x、player_y) 、 map_width 、 map_heightがそれぞれマップの幅と高さで表されるとします。プレイヤーがマップの端に到達したときに「ループ」できるようにするために、 FMOD()を使用して処理できます。
// マップのサイズを定義します
$map_width = 1000; // マップ幅
$map_height = 1000; // 地図の高さ
// プレーヤーの現在の位置を定義します
$player_x = 1100; // プレイヤーx座標
$player_y = 1200; // プレイヤーy座標
// 使用 fmod() 来循环プレイヤー的位置
$player_x = fmod($player_x, $map_width);
$player_y = fmod($player_y, $map_height);
// もし fmod() 負の数を返します,マップの幅または高さを追加して修正します
if ($player_x < 0) {
$player_x += $map_width;
}
if ($player_y < 0) {
$player_y += $map_height;
}
// 输出プレイヤー的最终座標
echo "プレイヤー的座標是:($player_x, $player_y)";
上記のコードでは、 fmod($ player_x、$ map_width)は、マップ幅内のプレーヤーの水平座標の残りを計算するため、プレイヤーのx座標がマップの境界(たとえば、1100)を超えても、 [0、1000)の範囲に調整されます。座標が負の場合、マップの幅を追加することにより、座標は有効な範囲内にあります。
FMOD()の利点は、Floatingポイント数の残りの部分を処理したときに精度の問題により予期しないエラーを引き起こさないことです。対照的に、通常の残りの計算では、いくつかのフローティングポイントエラーが発生する場合があります。 FMOD()を使用すると、特にゲームの世界で継続的な動きや境界の問題に対処する場合、正確なループ効果が保証されます。精度は非常に重要です。
座標系に加えて、ゲームにはプレイヤーの視点の回転またはオブジェクトの動きも含まれる場合があります。この場合、 fmod()を介して角度と方向を処理して、オブジェクトが端でスムーズに出発点に戻るようにすることができます。たとえば、 fmod()を使用して回転角度を処理することは、プレーヤーがマップの境界を移動する場合にも非常に効果的です。
// 定义プレイヤー的旋转角度
$player_angle = 450; // プレイヤー旋转角度,学位のユニット
// 角度を制限します 0 到着 360 学位の間
$player_angle = fmod($player_angle, 360);
// もし角度为负数,正の数から正しい
if ($player_angle < 0) {
$player_angle += 360;
}
echo "プレイヤー的旋转角度是:$player_angle 度";
このロジックは、マップの翻訳だけでなく、オブジェクトの回転やキャラクターの視点制御など、「囲まれる」必要があるゲーム内の他のアクションにも適用されます。
シミュレーションゲーム開発では、PHPのFMOD()関数を使用すると、マップループの問題を非常に簡単に処理できます。 FMOD() Sensibleを使用することにより、プレーヤーの位置とゲーム要素が境界を越えてスムーズに反対側に戻り、シームレスなゲームの世界を作成できるようにします。座標計算、オブジェクトの動き、または角度制御であろうと、 FMOD()は、より自然なループ効果を実現するのに役立つ非常に便利なツールです。