【发布时间】:2021-04-26 23:23:00
【问题描述】:
我正在尝试制作一款在线游戏,我想在其中模拟一个全方位连接的世界,就像“PAC-MAN”一样。当玩家越过地图的边界时,他将在网格的另一边。
到目前为止一切顺利,我设法构建了一个包含 10x10 矩阵的服务器(我附上了一些 images 作为参考),并使用一些模块化算法计算并将相应的图块发送给客户端给定玩家位置的地图。
所以以“view_distance = 2”为例,服务器会根据玩家的位置发送相应的图块:
我想我的观点是正确的,现在让我们面对我的问题。
当客户端从服务器获取要渲染的图块列表时,它需要计算每个图块到玩家的距离(单位向量),以便它可以在正确的位置实例化它。每个实例图块都有一个脚本,每次玩家移动时都会重新计算与玩家的距离,因此当它比“view_distance”更远时它会自行销毁。
例如,如果我的客户端位于 (9,5) 位置,则图块 (7,7) 的单位向量将为 (-2,2)
客户有以下信息:
- 他所在的瓷砖:
Globals.PlayerInfo.PlayerPosition - 地图的长度:
Globals.MAP_LENGHT(在本例中为 10) - 视距:
Globals.DATA_DISTANCE(本例为 2)
如何计算单位向量?我做了以下功能,但它似乎不起作用。我错过了什么吗?
public static Position GetPlayerDistance(Position position)
{
var unitVector = new Position() { X = position.X, Y = position.Y };
if (position.Y > Math.Truncate(Globals.PlayerInfo.PlayerPosition.Y) + Globals.DATA_DISTANCE)
{
unitVector.Y = position.Y - Globals.MAP_LENGHT;
}
if (position.X > Math.Truncate(Globals.PlayerInfo.PlayerPosition.X) + Globals.DATA_DISTANCE)
{
unitVector.X = position.X - Globals.MAP_LENGHT;
}
unitVector.X -= (float)Math.Truncate(Globals.PlayerInfo.PlayerPosition.X);
unitVector.Y -= (float)Math.Truncate(Globals.PlayerInfo.PlayerPosition.Y);
return unitVector;
}
【问题讨论】:
标签: c# unity3d matrix modular-arithmetic