C# WinForms中高效检测鼠标悬停六边形网格对象的最优方案
六边形地图鼠标悬停检测的优化方案探讨
我并非专业程序员,只是业余涉猎。我正在开发一款简易六边形地图程序,希望高效检测鼠标何时悬停在六边形元素上。我知道可以为窗体对象创建Region,但这似乎效率不高。于是我选择在每个元素内定义方形碰撞盒(Hit-box),通过取模和整数除法计算行列号,避免浮点运算。或许是受早年286处理器看重CPU周期的思维影响,我希望代码尽可能高效。
下图展示了X维度数值的大致来源,Y维度类似但未展示。红色框仅为碰撞盒尺寸示意,不会在程序中显示(图中Xodd应为xOffsetOdd)
我编写的代码如下,运行效果良好,但想了解是否有更优方法,既能检测整个六边形区域又不会过多消耗CPU。该程序仅用于个人制作地图素材,无需完美但求最优。
private void checkMapElementMouseOver(MouseEventArgs e, bool overElement, int column, int row) { /* * Tile offests: * Column X increment 152 * Column X-odd-offset 76 * Row Y increment 68 * Row Y-odd-offset 34 */ const int xPad = 10; // Map tiles are inset const int yPad = 10; // Map tiles are inset const int xStep = 152; // Spacing between tile bounding boxes on a row const int xOffsetOdd = 76; // Offset for tile bounding boxes on odd rows const int yStep = 68; // Spacing between tile bounding boxes on a column const int yOffsetOdd = 34; // Offset for tile bounding boxes on odd columns const int boxWidth = 56; // Hit-box width const int boxHeight = 52; // Hit-box height int xEven = e.X - xPad; int xOdd = e.X - xOffsetOdd - xPad; int yEven = e.Y - yPad; int yOdd = e.Y - yOffsetOdd - yPad; int modXEven = (xEven % xStep); int modXOdd = (xOdd % xStep); int modYEven = (yEven % yStep); int modYOdd = (yOdd % yStep); if ((modXEven >= 0) && (modXEven <= boxWidth) && (modYEven >= 0) && (modYEven <= boxHeight)) { overElement = true; column = 2 * (xEven / xStep); row = yEven / yStep; } else if ((modXOdd >= 0) && (modXOdd <= boxWidth) && (modYOdd >= 0) && (modYOdd <= boxHeight)) { overElement = true; column = 1 + (2 * (xOdd / xStep)); row = yOdd / yStep; } else { overElement = false; column = -1; row = -1; } }
返回行或列值-1表示未悬停在碰撞盒上,这些值用于在列表/数组中查找对应元素。现寻求更优的检测方案。
内容的提问来源于stack exchange,提问作者John
相关产品推荐
相关产品推荐

