tiles 和 MouseState MonoGame 更新时间慢

Slow update time with tiles and MouseState MonoGame

这里是非常新的开发人员。

在我的程序中,我有一个使用单纯形噪声库随机生成的世界地图。除此之外,我正在尝试绘制一个透明 4x4 瓷砖的瓷砖地图,当鼠标悬停在一个瓷砖上时,这些瓷砖看起来略微半透明。

我已经开始工作了,但是突出显示的图块需要大约整整 3 秒才能更新到鼠标的当前位置。我能做些什么来解决这个问题吗?

这是我在磁贴中检查 MouseState 的代码 class:

public override void Update(GameTime gameTime)
{
    _previousMouse = _currentMouse;
    _currentMouse = Mouse.GetState();

    var mouseRectangle = new Rectangle(_currentMouse.X, _currentMouse.Y, 1, 1);

    _isHovering = false;

    if (mouseRectangle.Intersects(Rectangle))
    {
        _isHovering = true;

        if (_currentMouse.LeftButton == ButtonState.Released && _previousMouse.LeftButton == ButtonState.Pressed)
        {
            Click?.Invoke(this, new EventArgs());
        }
    }
}

抱歉,如果格式错误或问题严重,首先 post 所以仍然要掌握所有内容:)

反转逻辑:

不要用鼠标检查数千个图块对象,而是将鼠标应用于单个对象。

假设您有一个图块对象列表或数组:

添加一个新对象来检查鼠标悬停并单击:

public class MouseDetect(Tile[] tiles) // replace with List<> as needed
{
    int PrevHover = -1; // used to unHover

    // if (Area == Screen) make the next two lines `const`, so the compiler will remove all uses...
    int AreaX = 0; //Area x offset
    int AreaY = 0; //Area y offset

    int AreaW = 800; //Area width
    int AreaH = 480; //Area height
    const int Grid = 4; // assumes square
    const int GridW = AreaW / Grid;


// I Will assume the `Delegate Click` in `Tile` is  public
    public void Update(MouseState ms, MouseState oms), //_currentMouse = ms and _previousMouse = oms;
    {
        int mouseIndex = (ms.X - AreaX) % Gridw + (ms.Y - AreaY) / GridW;
        tiles[PrevHover].Hover = false;
        PrevHover = mouseIndex;
        tiles[PrevHover].Hover = true;

        //Check Release
        if(tiles[PrevHover].Hover && ms.LeftButton == ms.ButtonState.Released && oms.LeftButton == ButtonState.Pressed)
         tiles[PrevHover].Click(tiles[PrevHover], new EventArgs());
    }
}

从磁贴中删除更新 class。


以后阅读本文的人注意事项:

永远不要在每个步骤中多次调用 Mouse.GetState();

诸如Rectangle之类的预定义或框架名称绝不能用作标识符。

即重命名并更正为 CollRectangle

if (CollRectangle.Contains(ms.Position))