(C ++) Выполнение инструкции внутри игры l oop один раз (SFML) - PullRequest
0 голосов
/ 07 августа 2020

Ответ на этот вопрос пришел ко мне на полпути к его написанию, и, честно говоря, я чувствую, что должен 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 каждый кадр, поэтому звуковой эффект проигрывается каждый кадр, но я не был уверен почему и где / когда это происходило, или как это обойти.

1 Ответ

0 голосов
/ 07 августа 2020

Как выясняется, причина collision сбрасывается до false каждый кадр, потому что я забыл, что весь этот набор инструкций содержится в for l oop, который проверяет каждую кнопку, поэтому столкновение тест выполняется для каждой кнопки в каждом кадре, и каждый раз, когда возвращаемое значение сохраняется внутри collision, это означает, что collision сбрасывает его значение на 'y' количество раз в каждом кадре ('y' - это количество кнопок на экране в этот момент), и поскольку значение столкновения для всех других кнопок, над которыми не наведен курсор, будет false, имеет смысл сбрасывать значение столкновения на false каждый кадр .

Теперь решение этой проблемы было ясным, все, что мне нужно было сделать, это заменить логическое значение collision2 на массив логических значений, причем каждый элемент этого массива соответствует значению столкновения одного из кнопки, то есть размер этого массива будет равен общему количеству кнопок, с которыми я работаю ...

Теперь код должен выглядеть так:

for (int j = init; j < limit; j++) {
        collision = buttons[j].button_collision();

        if (collision == true) {

            if (collision2[j] == false) {// 'collision2' is an array that stores the collision values for each button.

                m_hover.play();
                collision2[j] = true;
            }

        }
        
        else { collision2[j] = false; }

//Other instructions go here...
}

И теперь он работает! Я испытываю такое же облегчение, сколь и разочарование из-за всего этого ...

...