В общем, понадобилось извратиться и написать на C++ движок для 2D-игрушки. В движке надобно обрабатывать нажатия мыши, определяя, в хитбокс какого виджета попало нажатие (виджет - что угодно, что можно нарисовать: кнопка, юнит на экране, етц.), и каким-либо образом вызывая обработчик. Сейчас загвоздка в том, чтобы придумать, как и в каком виде правильнее присобачить обработчики, чтобы это выглядело гламурно и не приводило к лишней писанине или рефакторингу, когда написал много кода и увидел, что всё фигня и надо по новой.
В данный момент у меня в голове крутится два варианта:
- Сделать в базовом классе чистые виртуальные методы onClick, onMouseIn, етц. и реализовывать их в производных классах. Недостаток: для кнопок, например, придётся на каждое поведение наследовать отдельный класс. Это точно нормально? Я так делал, когда в лихой юности писал двухкнопочные приложения на Delphi, но не уверен, что это не приведёт к печальным последствиям в виде кода-спагетти ближе к сроку сдачи.
- Передавать в виджет обработчик при его создании. Недостаток: непонятно, как это реализовать, т.к. нужно будет либо передать какой-то метод класса, что не особо осуществимо, либо аналогичную функцию, принимающую указатель на обрабатываемый виджет, что, кажется, не совсем ООП-шно.
Я больше склоняюсь к первому варианту, но почему-то не уверен, что когда я приступлю к реализации основной игровой логики (т.е. всяких там человечков, бегающих по карте), он на них безболезненно расширится, т.к. там, кажется, количество различных реакций на клики куда обширнее, чем на кнопки в главном меню, и на каждую реакцию наследовать класс... брр.
Короче, нужен волшебный в своей простоте паттерн или просто похлопывание по плечу от человека с опытом, объясняющего, почему я неправ и написать один из этих двух вариантов будет хорошо. Ещё раз, пишу на C++.