我正在编写一款2D闪存多人游戏和一个套接字服务器,客户端和服务器之间的移动算法原本是这样的:
- 当玩家改变移动模式(向前移动或不移动)和转向模式(不转向、向左转或向右转)时,客户端通知服务器。 - 服务器每隔几毫秒循环所有玩家,并根据时间差计算转弯角度和移动距离。客户端也做同样的计算。
我的当前客户端计算方式(服务器中使用相同的数学公式)==> 转向:
- 当玩家改变移动模式(向前移动或不移动)和转向模式(不转向、向左转或向右转)时,客户端通知服务器。 - 服务器每隔几毫秒循环所有玩家,并根据时间差计算转弯角度和移动距离。客户端也做同样的计算。
我的当前客户端计算方式(服务器中使用相同的数学公式)==> 转向:
var newTimeStamp:uint = UtilLib.getTimeStamp(); //set current timeStamp
var rot:uint = Math.round((newTimeStamp - turningTimeStamp) / 1000 * 90); //speed = x degrees turning every 1 second
turningTimeStamp = newTimeStamp; //update timeStamp
if (turningMode == 1) //left
{
movementAngle = fixAngle(movementAngle - rot);
}
else if (turningMode == 2) //right
{
movementAngle = fixAngle(movementAngle + rot);
}
private function fixAngle(angle:int):uint //fixes an angle in degrees (365 -> 5, -5 -> 355, etc.)
{
if (angle > 360)
{
angle -= (Math.round(angle / 360) * 360);
}
else if (angle < 0)
{
angle += (Math.round(Math.abs(angle) / 360) + 1) * 360;
}
return angle;
}
移动
var newTimeStamp:uint = UtilLib.getTimeStamp(); //set current timeStamp
var distance:uint = Math.round((newTimeStamp - movementTimeStamp) / 1000 * 300); //speed = x pixels forward every 1 second
movementTimeStamp = newTimeStamp; //update old timeStamp
var diagonalChange:Array = getDiagonalChange(movementAngle, distance); //with the current angle, howmuch is dX and dY?
x += diagonalChange[0];
y += diagonalChange[1];
private function getDiagonalChange(angle:uint, distance:uint):Array
{
var rAngle:Number = angle * Math.PI/180;
return [Math.round(Math.sin(rAngle) * distance), Math.round((Math.cos(rAngle) * distance) * -1)];
}
这似乎很有效。为了考虑延迟,服务器会定期通过发送数据来更正客户端的信息。
使用此系统处理移动所需的带宽非常少。但是,我的服务器和客户端的坐标和角度之间的差异太大了。我是否应该扩展我的“算法”,以考虑用户的延迟?或者有更好的方法来处理在客户端<>服务器多人游戏中的运动并保持高性能吗?