C#Monogame / XNA:处理基于2D图块的游戏中的位置

问题描述

最近,我开始研究一个基于MMORPG 2D瓦片的简单世界(仅供学习)。

我开始在服务器上工作(网络,消息编码/解码和ect'),并假设2个整数足以满足精灵位置。

我使用整数的优点:

  • 轻松映射精灵磁贴。
  • 减少用于客户端更新的带宽(带宽):在邻居精灵移动时,我只能发送前一个位置的增量偏移量-每个偏移量(X和Y)一个字节。

另一方面,当我到达客户端实现时,我不知道如何实现平滑的滚动和移动速度,因为每次更新的位置都是两个整数,它们绑定到tile内的特定位置(使用Camera2D转换)。

我希望能够根据精灵速度(和瓦片类型)查看瓦片之间的精灵运动。

我的相机代码

.startAfter()

我的图块数据结构如下:

public class Camera2D
{
    private Vector2 _pos;
    private int _viewportWidth;
    private int _viewportHeight;
    private float _textureWidth;
    private float _textureHeight;

    public Matrix Transformation
    {
        get
        {
            return Matrix.CreateTranslation(new Vector3(-this._pos.X-this._textureWidth/2,-this._pos.Y-this._textureHeight/2,0)) *
                   Matrix.CreateTranslation(new Vector3(this._viewportWidth * 0.5f,this._viewportHeight * 0.5f,0));
        }
    }

    public Camera2D(int viewportWidth,int viewportHeight,float tlieWidth,float tileHeight)
    {
        this._viewportHeight = viewportHeight;
        this._viewportWidth = viewportWidth;
        this._tileHeight = tileHeight;
        this._tileWidth = tlieWidth;
        this._pos = new Vector2(0,0);
    }

    public void Follow(Sprite sprite)
    {
        this._pos.X = sprite.Position.X;
        this._pos.Y = sprite.Position.Y;
        this._textureWidth = sprite.Texture.Width;
        this._textureHeight = sprite.Texture.Height;
    }
}

位置:

Tile[,] _mapTiles;

我想向客户发送精灵的速度并在客户端中进行所有模拟,但是由于客户端网络的不同,我认为这是不可行的,这会导致大量的同步问题。

到目前为止,我的moto:服务器应仅依靠自身并负责模拟,而客户端将获得更新并基于更新进行呈现(以及内部客户端预测)。

您认为我应该如何解决所描述的问题?

谢谢!

编辑:

我有一个想法,我想听听您的反馈意见:

除了2个整数(X,Y)外,我还可以管理两个字节(对于X和Y轴)大小的附加块内偏移:

Position(X,Y,inTileOffsetX,inTileOffsetY)=(X + inTileOffsetX / 128,Y + inTileOffsetY / 128)

可以通过inTileOffset更新值来控制速度,这意味着我将拥有最大128种可能的速度。

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)