C ++で、ゲームメーカーの重力を再現しようとしてきましたが、これまでのところ、次のとおりです。
double script::lengthdir_y(double len,double dir){
return -sin(dir* M_PI/180) * len;//Create equivalent GM lengthdir_y code.
}
double script::scr_findhsy(player* plr){
if(plr->jumping==true)
{
int rpt, vspeed, y;//Make variables.
rpt=(clock()-plr->LastMovingYUpdate)/(1000/30);
//Check the current time, and take away the time when the player started jumping to find the time inbetween, then divide it by 1000/30 to find the ammount of GM steps.
vspeed=plr->vspeed;//Players vspeed.
y=plr->y;//players y.
for(int i=0; i<rpt; i++)//Plus the lengthdir_y code to the vspeed, and plus the vspeed to the y the correct ammount of times.
{
vspeed+=lengthdir_y(0.5, 270);
y+=vspeed;
}
return y;//return the new value.
}
else
return plr->y;//If the player isnt falling, send the original Y value, because nothing needs to be updated.
}
プレーヤーの y 値は、ラグを減らすためにすべてのステップ (または C++ では 33.33 ミリ秒) で更新されるわけではないため、このスクリプトを作成して、すべてのステップではなく、必要なときに正しい Y 値を取得します。
しかし、それは決して適切に出ないようですOO
クライアントでのデバッグのテスト結果を次に示します。これらのテストでは、クライアントは適切な Y 値を送信し、サーバーはプレイヤーの Y 値と思われる値を送信します。
テスト 1
- サーバー: 384
- クライアント: 384
- 説明: 完全に静止して、完全に動作します。
テスト 2
- サーバー: 373
- クライアント: 349.50
- 説明: 完全に静止して、完全に動作します。
テスト 3
- サーバー: 318
- クライアント: 279.50
- 説明: 完全に静止して、完全に動作します。
したがって、プレーヤーがジャンプすると、Y が小さくなるため、値が減少することを意味します。これは、クライアントとサーバーの両方で機能し、値がかなりずれています。プレイヤーが重力のために落下し始めた後、サーバーはプレイヤーが地面にぶつかって値が更新されるまで「318」を読み取り続けます。