Как вернуть эти данные в C?
Это проблема мысли, и я боролся около дня.
Я пишу движок для игры на C (с открытым исходным кодом, для удовольствия), и все элементы интерфейса (read GUI) имеют дело с вводом мыши в интерфейсе функцииMouse(). В принципе, я регулярно вызываю interfaceMouse(), чтобы узнать, действовал ли пользователь с интерфейсом.
Я бы хотел, чтобы эта функция занимала последний щелчок мышью, смотря, взаимодействует ли он с каким-либо элементом GUI, а затем возвращает, как этот щелчок мыши взаимодействует с элементом gui.
Учитывая два разных элемента gui:
- (кнопка нажата пользователем A)
выберите меню (выбранная пользователем опция 1 меню A)
Я пытаюсь выяснить, как лучше вернуть событие интерфейса вызывающей функции. На мой взгляд, сейчас у вас есть соответствующие списки для каждого типа событий (buttonEvents, selectEvents) и такие функции, как getNextButtonEvent(), который возвращает значение, зависящее от события. interfaceMouse() возвращает значение, зависящее от типа события, вызванного событием мыши, а затем вызывающая функция должна будет извлечь это событие из соответствующего списка с помощью getNextTypeEvent().
Я не очень доволен этим подходом и задавался вопросом, есть ли у кого-то лучшая идея или может предоставить дополнительную предвидения?
Из вашего описания я сделал несколько предположений, но вот как бы я справился с этим:
interfaceMouse() определяет, что должно произойти от взаимодействия с мышью, но не обрабатывает это фактическое взаимодействие (или обрабатывает взаимодействие, но хочет явно вернуть то, что было сделано). Я бы сделал так: interfaceMouse() возвращает структуру, определенную аналогично:
struct
{
int event_type; /* Enumerated type */
void* element; /* Pointer to the element, however it defined in the code */
void* event_data; /* Pointer to the data about the event */
} event_result;
Вы можете определить вызовы, обратившись к элементу, основанному на типе (скажем, другой структуре с указателями функций, или иметь event_data, чтобы удержать указатель на функцию и элемент и т.д.).
C является одним из тех языков, где требуется гораздо больше думать о вашем моделировании данных, но может оказаться таким же изящным или запутанным, как вам хотелось бы.
Используйте правильную модель программирования. например, ниже представлена модель статического программирования:
+-------------------------------+
| Stage(): |
| +-OnButtonAClick(Event) |
| +-OnMenuSelect(Event) |
| +-... |
+------+-------------+----------+
| Pop() |
| |
+-V-+ +-V-+
| Q | | Q | ... Logic-Half
-------| 0 | | 1 |-----------------------------
| | | | I/O-Half
+-^-+ +-^-+
| Push() |
+----+---+ +---+----+
|Event of| |Event of| ...
| Mouse | | Menu |
+--------+ +--------+
Все OnXXX() будут последовательно выполняться в Stage(); и ваши данные были привязаны к каждому событию соответственно снизу и идут вверх. Каждое событие управлялось и обрабатывалось асинхронно.
Смотрите мои комментарии в другом потоке: Просмотр данных в круговом буфере в режиме реального времени для получения подробной информации о Staged.
Вы можете вернуть указатель на функцию, которая будет обрабатывать событие, а затем просто выполнить его, когда наступит подходящее время? У вас может даже быть FIFO указателей функций, ожидающих исполнения в порядке, с интерфейсом interfaceMouse(), и вы просто выполняете те, которые впереди, когда сможете. Я также вижу, что вы используете механизм опроса с помощью interfaceMouse(), это лучший вариант? Я предполагаю, что вы делаете это в игровом цикле или что-то в этом роде.