Готовый перевод CEGUI In Practice / CEGUI на практике: 4. A push button
Привет, привет. Хочу сообщить, что вы делаете хорошие успехи.
Хорошо, в последней главе мы ознакомились с вводом в CEGUI.
Нам это понадобится, так как сегодня мы будем делать кнопку.
И не просто какую-нибудь кнопку, а кнопку, которая делает что-то. Я знаю, интригующе.
Немного основ
Для начала нужно взглянуть на то, как CEGUI управляет событиями.
CEGUI использует способ событий и подписчиков.
Это означает, что, когда с чем-нибудь (кнопкой, полем для ввода/вывода) происходит событие (щелчок мыши, ввод текста, наведение мыши), чему-то другому (классу приложения, другому объекту CEGUI, чему-угодно) сообщают об этом.
На примере это выглядит так:
Первый аргумент - это событие, которое вы хотите обработать.
События - константные строки.
Вы найдете их в соответствующих заголовочных файлах объектов CEGUI (к примеру CEGUIPushButton содержит CEGUI::PushButton::EventClicked).
Второй параметр - подписчик, который будет вызываться всегда, когда будет происходить событие.
Давайте приведем пример того, как заставить нашего персонажа прыгать всякий раз, когда будет нажиматься кнопка.
Для начала, создадим саму кнопку.
Хотя это и плохой стиль кодинга, но для простоты понимания мы создадим нашу кнопку в главном цикле программы.
Код, приведенный выше, создает кнопку типа "TaharezLook/Button", которая есть в соответствующей схеме.
Потом ей дается имя "JumpPushButton", устанавливается размер и задается позиция, и далее она привязывается к корневому окну GUI.
Это все было в двух предыдущих туториалах.
Однако, функция setText - новая.
Я думаю и так понятно, но все же объясню. Она устанавливает текст окна.
Кнопки, поля ввода и т.д., у всех есть место, где можно отобразить текст, эта функция его и устанавливает.
Теперь, когда мы создали нашу кнопку, давайте создадим класс, который будет получать события кнопки JumpPushButton.
Помните, что это только пример.
В вашем приложении это не будет выглядеть так просто.
Хорошо, довольно маленький класс, да? ;)
Я не знаю, как вы будете заставлять кого-то прыгать, это уже ваша забота.
Я здесь просто, чтобы показать как взаимодействовать с GUI.
Действительно интересная строчка здесь, это функция RegisterForEvents().
Возможно вы встречались с подписчиками событий, возможно нет, так или иначе я очень коротко объясню их суть.
По существу, они работают, создавая структуру, которая знает какую функцию вызывать и где взять объект класса, у которого есть эта функция.
Первый параметр, &OurPlayer::Jump, сообщает, что мы хотим использовать функцию Jump, которая принадлежит классу OurPlayer.
Проблема в том, что подписчик не знает, который объект класса OurPlayer мы хотим использовать.
Что если мы играем на раздвоенном экране, и у нас два игрока?
Один для левого игрока, другой для правого. Нам следовало бы указать конкретного игрока.
За это отвечает второй аргумент.
В C++, this возвращает указатель на класс, в котором происходит выполнение.
Так что, когда мы зарегистрировали событие внутри класса, мы использовали this, который указывает на класс, в котором была вызвана функция RegisterForEvents().
Если бы мы сделали как ниже:
Тогда нужно было бы вызывать функцию так:
Как вы можете видеть, события открывают много возможностей.
Есть такие события как: щелчок мыши, наведение мыши, отведение мыши, изменение текста, изменение размера.
Просто некоторые из них.
Это большой список событий для всех типов окон в CEGUIWindow.h.
Заключение
Надеюсь вы поняли, как устроены события в CEGUI.
Они - тот механизм, который отвечает за все происходящие вещи.
Как только вы поняли, как использовать события, остальная часть GUI станет легкой для освоения, так как большая часть взаимодействия пользователя с GUI, это события.
Пока вы не используете их все. Есть даже события для вращения окон и перетаскивания их друг на друга.
Просто подумайте о возможностях.
До следующего раза. Веселого кликанья!
Внимание! Этот перевод, возможно, ещё не готов.
Его статус: перевод редактируется
Переведено на Нотабеноиде
http://notabenoid.org/book/29927/102294
Переводчики: proVIDec
Настройки
Готово:
