我现在也在写 TD 游戏,这个月我也开始使用 SFML。这也是我最后一天的问题,并提出了这个想法。我不知道这是否是执行此操作的标准方法,但这比我第一次尝试测试整个游戏对象要好。并希望提出更好的解决方案大声笑
我的游戏窗口有 3 个区域,它们是:
地图 - 地图、敌人所在的位置以及你建造塔的位置
商店 - 你在哪里买塔
INFORMATION - 如果你点击敌人或塔什么的,信息会出现在这个区域
然后我写了一个边界类来定义一个区域的边界。
示例:
Boundary shopBoundary;
Boundary mapBoundary;
Boundary infoBoundary;
如果我想添加另一个区域,我也可以添加另一个边界(也许我可以点击塔的特殊增益的区域?)然后我会这样做
Boundary buffsBoundary;
这就是我的诀窍
我创建了一个定义鼠标位置的枚举
enum AREAS { NONE, SHOP, MAP, INFO }
Areas mLoc = NONE;
我创建了一个结构,该结构存储了一个 AREAS,该 AREAS 将用于命名该区域和该区域边界的边界对象。
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
现在每次鼠标移动,我只需要检查鼠标在哪里使用 3 次迭代(地图、商店和信息)
if ( mouse moved )
{
for ( int a = 0; a < boundaries.size(); a++ )
{
if ( boundaries[a].isMouseInside(mousePos) )
{
mLoc = boundaries[a].area;
break;
}
}
}
通过该循环,我将能够通过检查mLoc 来跟踪鼠标的去向,通过在发生单击时必须知道位置,它会缩小您需要检查的游戏对象,(如果鼠标位置是在商店区域,然后当点击发生时,只检查该区域的游戏对象)
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
}
}
}