Ответ на этот вопрос пришел ко мне на полпути к его написанию, и, честно говоря, я чувствую, что должен sh закончить то, что я начал, и задокументировать это, поскольку я застрял с этой ошибкой весь день, и это может пригодится позже.
Я использую SFML, и у меня есть несколько кнопок, и я хочу воспроизвести звуковой эффект, когда курсор мыши наводится на одну из них ...
Это метод внутри класса кнопки, который проверяет наличие столкновения между курсором мыши и кнопкой:
bool menu_button::button_collision() {
if ((cursor.getPosition().x <= (text_box.getPosition().x)+text_box.getSize().x/2)
&& (cursor.getPosition().x >= (text_box.getPosition().x) - text_box.getSize().x / 2)
&&(cursor.getPosition().y <= (text_box.getPosition().y) + text_box.getSize().y / 2)
&& (cursor.getPosition().y >= (text_box.getPosition().y) - text_box.getSize().y / 2)) {
text.setFillColor(sf::Color(sf::Color::Yellow));
coll = true;
}
else { text.setFillColor(sf::Color(sf::Color::White)); coll = false; }
return coll;
}
И это код, который воспроизводит звуковой эффект при наведении курсора на button:
for (int j = init; j < limit; j++) { //This is a loop that tests every button.
collision = buttons[j].button_collision();// 'collision' is a boolean that stores the value returned by the collision function.
if (collision == true) {
m_hover.play();
}
//Other instructions go here...
}
Теперь этот код работает нормально, но поскольку он находится внутри игры l oop, которая повторяет каждый кадр, звук будет воспроизводиться 'x' раз в секунду ( 'x' - количество кадров в секунду), что не то, что я хотел, поэтому я изменил код, чтобы он выглядел так:
for (int j = init; j < limit; j++) {
collision = buttons[j].button_collision();
if (collision == true) {
if (collision2 == false) { // 'collision2' is another boolean, that becomes true AFTER the sound-effect have already played.
m_hover.play();
collision2 = true;
}
}
//Other instructions go here...
}
Теперь звуковой эффект воспроизводится при первом наведении курсора над задницей n, но ТОЛЬКО в первый раз, а затем он полностью переходит в тишину, поэтому очевидно, что у нас есть еще одна проблема ...
Итак, я добавил эту строку в родительское условие (та, которая проверяет collision
):
else { collision2 = false; }
Я думал, что это сработает, но теперь я вернулся к первой проблеме, когда звуковой эффект постоянно проигрывался для каждого кадра, в котором курсор наведен на кнопку. ..
Немного поработав, я понял, что collision
сбрасывается на false
каждый кадр, поэтому звуковой эффект проигрывается каждый кадр, но я не был уверен почему и где / когда это происходило, или как это обойти.