很抱歉,几何学从来不是我在学校最喜欢的科目,所以...
目前我正在编写2D MMORPG服务器仿真器,并希望改进我的当前坐标检测算法。
客户端向服务器发送带有起点坐标
和终点坐标
的数据包。
服务器接收并将运动开始
变量分配给DateTime.Now
。
服务器知道角色每秒可以行进的距离(即速度
)。
如何计算角色自开始运动一些
秒后的位置?
由于我不擅长几何学,我根据已行驶路程的百分比编写了这个...垃圾...代码。 虽然它能工作,但需要进行太多计算。
public ushort X;
public ushort Y;
public ushort TargetX;
public ushort TargetY;
public DateTime MovementStartTime;
public ushort CalculatedX
{
get
{
if (this.X == this.TargetX && this.Y == this.TargetY)
return this.X;
float total_dst = CF.GetEuclideanDistanceBetween(this.X, this.Y, this.TargetX, this.TargetY);
float seconds_since_movement_start = (float)(DateTime.Now - this.MovementStartTime).TotalSeconds;
float passed_dst = Limits.CharacterSpeed * seconds_since_movement_start;
if (passed_dst > total_dst)
return this.TargetX;
float passed_dst_in_normalized_percents = (passed_dst * 100 / total_dst) / 100;
return (ushort)(this.X - ((this.X - this.TargetX) * passed_dst_in_normalized_percents));
}
}
public ushort CalculatedY
{
get
{
if (this.X == this.TargetX && this.Y == this.TargetY)
return this.Y;
float total_dst = CF.GetEuclideanDistanceBetween(this.X, this.Y, this.TargetX, this.TargetY);
float seconds_since_movement_start = (float)(DateTime.Now - this.MovementStartTime).TotalSeconds;
float passed_dst = Limits.CharacterSpeed * seconds_since_movement_start;
if (passed_dst > total_dst)
return this.TargetY;
float passed_dst_in_normalized_percents = (passed_dst * 100 / total_dst) / 100;
return (ushort)(this.Y - ((this.Y - this.TargetY) * passed_dst_in_normalized_percents));
}
}
该想法是根据速度确定已经通过的行字符的百分比,然后将其与 start X
和 end X
之间的平面距离相结合。