Как вернуть эти данные в C?

62
5

Это проблема мысли, и я боролся около дня.


Я пишу движок для игры на C (с открытым исходным кодом, для удовольствия), и все элементы интерфейса (read GUI) имеют дело с вводом мыши в интерфейсе функцииMouse(). В принципе, я регулярно вызываю interfaceMouse(), чтобы узнать, действовал ли пользователь с интерфейсом.


Я бы хотел, чтобы эта функция занимала последний щелчок мышью, смотря, взаимодействует ли он с каким-либо элементом GUI, а затем возвращает, как этот щелчок мыши взаимодействует с элементом gui.


Учитывая два разных элемента gui:


    (кнопка нажата пользователем A)
    выберите меню (выбранная пользователем опция 1 меню A)

Я пытаюсь выяснить, как лучше вернуть событие интерфейса вызывающей функции. На мой взгляд, сейчас у вас есть соответствующие списки для каждого типа событий (buttonEvents, selectEvents) и такие функции, как getNextButtonEvent(), который возвращает значение, зависящее от события. interfaceMouse() возвращает значение, зависящее от типа события, вызванного событием мыши, а затем вызывающая функция должна будет извлечь это событие из соответствующего списка с помощью getNextTypeEvent().


Я не очень доволен этим подходом и задавался вопросом, есть ли у кого-то лучшая идея или может предоставить дополнительную предвидения?

спросил(а) 2009-11-08T03:28:00+03:00 10 лет назад
3
Решение
52

Из вашего описания я сделал несколько предположений, но вот как бы я справился с этим:


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 является одним из тех языков, где требуется гораздо больше думать о вашем моделировании данных, но может оказаться таким же изящным или запутанным, как вам хотелось бы.

ответил(а) 2009-11-08T06:29:00+03:00 10 лет назад
Еще 2 ответа
54

Используйте правильную модель программирования. например, ниже представлена ​​модель статического программирования:


     +-------------------------------+
| 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.

ответил(а) 2009-11-08T08:32:00+03:00 10 лет назад
44

Вы можете вернуть указатель на функцию, которая будет обрабатывать событие, а затем просто выполнить его, когда наступит подходящее время? У вас может даже быть FIFO указателей функций, ожидающих исполнения в порядке, с интерфейсом interfaceMouse(), и вы просто выполняете те, которые впереди, когда сможете. Я также вижу, что вы используете механизм опроса с помощью interfaceMouse(), это лучший вариант? Я предполагаю, что вы делаете это в игровом цикле или что-то в этом роде.

ответил(а) 2009-11-08T03:37:00+03:00 10 лет назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема