【发布时间】:2015-08-03 01:07:56
【问题描述】:
我正在使用 SFML 库编写游戏。 我有一些按钮,当我点击时,我想做点什么。
但是我有一个问题,我不知道如何检测简单的点击,而不是按键释放或按键,只是点击。
我写了这段代码:
游戏循环:
void GameEngine::gameLoop()
{
Menu menu(_win);
while (_win.isOpen() && gl_quit == false)
{
sf::Event event;
while (_win.pollEvent(event))
{
if (event.type == sf::Event::Closed)
_win.close();
}
menu.mouseEvent(event);
menu.keyboardEvent();
menu.calcul();
menu.reDraw();
_win.display();
_win.clear();
}
}
菜单.cpp
bool Menu::mouseEvent(sf::Event &event)
{
if (event.type == sf::Event::MouseButtonReleased)
{
if (event.mouseButton.button == sf::Mouse::Left)
{
for (std::map<std::string, Button *>::iterator it = _buttons.begin();
it != _buttons.end(); ++it)
{
if (it->second->collide(sf::Mouse::getPosition(_win)))
(this->*(it->second->getAction()))();
}
}
}
}
例如,当我点击“播放”按钮时,就会调用这个方法:
void Menu::on_Jouer_clicked()
{
std::cout << "fct jouer" << std::endl;
}
这是 consol 中的结果:
~/Projet/gametest :./game
fct jouer
fct jouer
fct jouer
fct jouer
fct jouer
fct jouer
fct jouer
fct jouer
fct jouer
fct jouer
fct jouer
fct jouer
fct jouer
fct jouer
fct jouer
fct jouer
函数调用次数过多。
【问题讨论】:
-
您可能应该从一个更简单的示例/代码开始,例如一个带有精灵的简单主代码,没有什么花哨的。
-
我的示例代码太复杂了?
-
您似乎在显示屏幕后立即清除屏幕。通常我认为您会清除屏幕,绘制然后显示。
-
是的,我已经改变了,因为它更符合逻辑。但这不是我的问题^^"
-
当然。 FWIW 在窗口系统中它们通常在鼠标释放 时执行action。这意味着如果您不小心点击了错误的按钮,您可以在释放之前将鼠标移开。看来您必须通过记录鼠标按下的时间并测试鼠标释放时经过了多长时间来手动计算鼠标单击 .
标签: c++ events click mouse sfml