在 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
-Server:373
-Client:349.50 -Description
:完全静止,完美运行。
测试 3 -
服务器:318 -
客户端:279.50 -描述
:完全静止,完美运行。
因此,当玩家跳跃时,该值意味着减少,因为 Y 越来越小,这在客户端和服务器上都有效,除了值距离之外。在玩家因重力而开始下落后,服务器会一直读取“318”,直到玩家撞到地面并更新数值。