C ++, SFML - Кнопки: как сделать кнопку, которая хранит указатель на метод другого класса? - PullRequest
0 голосов
/ 01 марта 2020

Я пытаюсь сделать небольшую игру в понг с меню. Итак, я создал класс Button, который хранит функцию, которую я запускаю при нажатии кнопки. Вот как я пытаюсь установить функцию, которая должна вызываться при нажатии кнопки. (setOnClickFunction)

void MenuState::initializeButtons()
{
    Button* startButton = new Button({ 200.f, 200.f }, { 100.f, 100.f },
        "startButton");
    startButton->setOnClickFunction(startButtonOnClick);
}

void MenuState::startGameButtonOnClick()
{
    std::cout << "startButton\n";
}

... и вот как выглядит мой класс Button:

class Button : public Drawable, public Transformable
{
protected:
    void  (*onClick)();
public:
    void isClicked(Vector2i mousePos);
    void setOnClickFunction(void (*function)());
};

после этого я получаю ошибку:

"error C3867: 'MenuState::startGameButtonOnClick': non-standard syntax; use '&' to create a pointer to member"

/ / РЕДАКТИРОВАТЬ

Это код, который решил мою проблему: // MenuState:

void MenuState::initializeButtons()
{
    Button* startButton = new Button({ 200.f, 200.f }, { 100.f, 100.f },
        "startButton");
    startButton->setOnClickFunction(std::bind(&MenuState::startGameButtonOnClick, this));
}

// Класс кнопки:

class Button : public Drawable, public Transformable
{
protected:
    std::function<void()> onClick;
public:
    void isClicked(Vector2i mousePos);
    void setOnClickFunction(std::function<void()> function);
};

1 Ответ

1 голос
/ 01 марта 2020

Просто используйте std::function, чтобы сохранить функцию щелчка. Здесь множество примеров

Кроме того, посмотрите на std::unique_ptr, чтобы сохранить вашу кнопку в пределах MenuState

...