C++ 一种检测SFML中鼠标溢出的有效方法
我最近开始在SFML中开发一个2D塔防游戏,我打算在鼠标悬停在某些对象(菜单项、敌人等)上时使用一些视觉技巧和其他功能。为此,我必须不断检查鼠标是否悬停在这样一个物体上,其中许多物体可能在移动,大小和形状各异。有人知道一种快速有效的方法来实现这一点吗 解决这个问题的蛮力方法是简单地检查游戏世界中的每一个对象的鼠标位置是否与它们的边界矩形相交。我的游戏非常简单,所以通常在这里进行优化会有些过分,但我也打算在其他地方实现更复杂的组件,我希望确保程序在图形上浪费尽可能少的资源 除此之外,我还阅读了许多可能有效的解决方案,例如在网格/四叉树中跟踪对象,只检查鼠标所在的区域。还有一个通过光线投射的解决方案,但据我所知,SFML本身并没有内置它。因为我认为我不是唯一一个必须解决这个问题的人,我希望有某种解决方案,我错过了。有什么想法吗C++ 一种检测SFML中鼠标溢出的有效方法,c++,2d,mouseover,sfml,C++,2d,Mouseover,Sfml,我最近开始在SFML中开发一个2D塔防游戏,我打算在鼠标悬停在某些对象(菜单项、敌人等)上时使用一些视觉技巧和其他功能。为此,我必须不断检查鼠标是否悬停在这样一个物体上,其中许多物体可能在移动,大小和形状各异。有人知道一种快速有效的方法来实现这一点吗 解决这个问题的蛮力方法是简单地检查游戏世界中的每一个对象的鼠标位置是否与它们的边界矩形相交。我的游戏非常简单,所以通常在这里进行优化会有些过分,但我也打算在其他地方实现更复杂的组件,我希望确保程序在图形上浪费尽可能少的资源 除此之外,我还阅读了许多
提前感谢您的帮助 我现在也在写TD游戏,这个月我也用SFML开始了。这也是我上一天遇到的问题,我想出了这个主意。我不知道这是否是标准的方法,但这比我第一次尝试测试整个游戏对象要好。希望能想出更好的解决办法哈哈 我的游戏窗口有3个区域,即:
地图-地图、敌人所在的地方以及你建造塔楼的地方
购物-在哪里购买塔楼
信息-如果单击敌人、塔或其他东西,信息将显示在此区域 然后我编写了一个边界类,它定义了一个区域的边界 示例:
Boundary shopBoundary;
Boundary mapBoundary;
Boundary infoBoundary;
我也可以添加另一个边界,如果我想添加另一个区域(可能是我可以单击塔的特殊增益的区域?),那么我就这样做
Boundary buffsBoundary;
所以我就是这样做的
我创建了一个定义鼠标位置的枚举
enum AREAS { NONE, SHOP, MAP, INFO }
Areas mLoc = NONE;
我创建了一个存储区域的结构,该区域将用于命名该区域以及该区域边界的边界对象
struct _Boundary
{
Areas area;
Boundary boundary;
bool isMouseInside(const sf::Vector2i v) const
{
return boundary.isMouseInside(v);
}
}
std::vector<_Boundary> boundaries; // now put all your boundary to a container
@初级程序员我希望能够将提出的方法用于其他事情,比如碰撞检测。鼠标悬停功能只是一个特例。感谢您的回复。这无疑是一个开始,但这是一个非常高级别的解决方案,因为它只会在更大的区域缩小范围。但是,如果游戏区域(“代码中的地图”)包含数百个对象,排除几十个菜单项不会节省那么多时间。也许最好的方法是以某种方式分析像素数据,以防它“知道”任何绘制的多边形是否包含它,然后将其追溯到相关对象的绘制函数。这样,我只需查看鼠标当前悬停在哪个像素上。@ID\u 13即使您知道该像素上是否绘制了某些内容,是否仍需要检查所有游戏对象?
if ( mouse moved )
{
for ( int a = 0; a < boundaries.size(); a++ )
{
if ( boundaries[a].isMouseInside(mousePos) )
{
mLoc = boundaries[a].area;
break;
}
}
}
if ( mouse button pressed )
{
if ( click mouse left )
{
if ( mLoc == SHOP )
{
// the click has been occured in shop
// check the game objects relative to shop
}
else if ( mLoc == MAP )
{
// the click has been occured in map
// check the game objects relative to map
}
else if ( mLoc == INFO )
{
// the click has been occured in information
// check game objects relative to that area
}
}
}