如何在C中返回此数据?

时间:2009-11-08 00:28:00

标签: c

这是一个思想问题,而且我一直在挣扎一天。

我正在为C中的游戏编写引擎(开源,为了好玩),并且所有接口(读取GUI)元素都在函数interfaceMouse()中处理鼠标输入。基本上,我定期调用interfaceMouse()来查看用户是否已经使用该界面。

我希望此函数能够进行最新的鼠标单击,查看它是否与任何GUI元素交互,然后返回鼠标单击与gui元素交互的方式。

给出两个不同的gui元素:

  • 按钮(用户点击按钮A)
  • 选择菜单(用户选择菜单A的选项1)

我正在试图弄清楚如何最好地将接口事件返回给调用函数。我现在最好的猜测是每种事件类型的链表(buttonEvents,selectEvents),以及getNextButtonEvent()等函数,它返回特定于事件的值。 interfaceMouse()返回一个值,该值取决于鼠标事件触发的事件类型,然后调用函数必须使用getNextTypeEvent()从相应的列表中检索该事件。

我对这种方法不是很满意,并且想知道是否有人有更好的想法或者可以提供一些额外的远见?

3 个答案:

答案 0 :(得分:2)

根据你的描述,我做了几个假设,但这是我将如何处理它:

interfaceMouse()确定鼠标交互需要发生什么,但不处理实际交互(或者,处理交互但想要显式返回已完成的内容)。我要做的是让interfaceMouse()返回一个类似于:

的结构
struct 
{
    int event_type; /* Enumerated type */
    void* element; /* Pointer to the element, however it's defined in the code */
    void* event_data; /* Pointer to the data about the event */
 } event_result;

您可以通过访问基于类型的元素来定义调用(例如,带有函数指针的另一个结构,或者让event_data保存函数指针并将元素传递给它等)。

C是其中一种语言,它需要更多地考虑您的数据建模,但最终可能会像您希望的那样优雅或复杂。

答案 1 :(得分:2)

使用正确的编程模型应该有效。例如,下面是分阶段编程模型:

     +-------------------------------+
     | 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()中执行;并且您的数据相应地从底部附加到每个事件并向上发送。每个事件都是异步驱动和处理的。

在另一个帖子中查看我的评论:Viewing data in a circular buffer in real-time了解有关Staged的详细信息。

答案 2 :(得分:1)

你可以返回一个指向要处理事件的函数的指针,然后在适当的时候执行它吗?你甚至可以拥有一个等待按顺序执行的函数指针FIFO,其中interfaceMouse()为它提供,你只需执行前面的函数指针即可。我也看到你使用了一个带有interfaceMouse()的轮询机制,这是最好的选择吗?我假设你在游戏循环或类似的东西中这样做。