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))
这里是非常新的开发人员。
在我的程序中,我有一个使用单纯形噪声库随机生成的世界地图。除此之外,我正在尝试绘制一个透明 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))