我开始考虑如何构建我的菜单系统,并且有一些问题,也许有经验的人可以为我提供见解。
我有几个问题,我会尽我所能将它们与我当前的代码联系起来,并在必要时提供我的代码。
我有一个班级系统:
KObect->KControl->(KMenu,KPanel,KButton) KControl 也继承自 KEvent
我创建了一个菜单,我可以通过单击并拖动菜单项来移动它们。当我制作了两个菜单时,我意识到有一些我没有想到的东西。
我希望这个菜单系统成为一个可以在其他代码中重用的库。如果我可以创建菜单对象并调用一个函数,例如KObject::Render()
并让它处理对象的所有内容,例如事件、循环更新和渲染顺序,那就太好了。目前,我设置它的方式是应用程序是这样的:
KMenu Menu1;
KMenu Menu2;
//Some code like size/hight/color set up if default is unwanted
while(Running) {
//SDL Poll events code
Menu1.Render();
Menu2.Render();
Menu1.Loop();
Menu2.Loop();
}
问题是如果我这样设置,Main1 也会在 Menu2 之前呈现。对此的解决方案可能会使如何根据实际可见的对象来处理事件变得更加明显(如果我的两个菜单重叠,当我单击顶部菜单时它们都会移动)。
下一个问题是关于函数行为。现在我正在做很多openGL原语来构建菜单。假设我有一个按钮,但我不确定库的用户是否想要放置纹理、字符串(我将在内部使用 SDL 处理字体)或 openGL 原语,我必须从根本上更改了按钮的渲染功能。我不确定处理这种事情的最佳方法。
最后,当我处理诸如点击按钮之类的事件时,我需要一种让用户定义函数行为的方法。一种考虑是在接受函数指针的按钮类中声明一个函数。然后,当单击按钮时,它只是调用该函数。当我研究这个时,我发现我无法弄清楚如何创建它以便用户可以为函数指定参数和值。(即,我必须声明一个函数指针void (*foo)(int)
或类似的东西来声明一个指向需要一个 int 输入并返回 void 的函数的指针。似乎只允许一个函数结构(返回类型/参数)用于通用按钮。
我在网上找到的唯一另一件事并没有解释太多,但它谈到了“回调函数”。我不知道如何声明这些,但我看到有人做了类似的事情
int FooFunc(int Foo);
int FooFunc(int Foo) {
Foo += Foo
return Foo;
}
//Magic they didn't explain
RegisterCallback( FooFunc );
我很困惑,因为他们不使用 & 符号,只是没有 () 的函数标识符。我也没有看到声明,所以我不知道他们是否将其声明为
无效注册回调(*);// 好名声 * 可以是什么?
我现在提出这两个问题是因为如果我能弄清楚这一点,那么我可能会解决另一个关于多个渲染函数定义几个然后有一个指针的问题,我只是根据用户的初始化来回切换。
如果你们想看任何代码,请告诉我。我有这些类(KApp、KButton、KControl、KEvent、KMenu、KMenuSystem、KObject、KPanel)
class KEvent
完全虚拟,捕获事件并将它们转发给继承类
class KApp : public KEvent
这将是使用我的菜单的用户定义程序
class KMenuSystem
一个包含文件,仅包含所有派生的菜单项。
class KObject
基类。极少
class KControl : public KObject
此类用于处理用户可能看到或与之交互的任何视觉内容。
class KMenu : public KControl
这是一个菜单项。这需要在其他任何事情之前声明(尽管我认为我还没有这样设置)我将在下面发布菜单项的图片。KMenu 现在包含 3 个 KButton 和 2 个 KPanel。
class KPanel : public KControl
面板将允许对项目进行分组,以便于隐藏、移动、排列、单选按钮等。
class KButton : public KControl
我认为这很明显
我的菜单,我正在移动后面的菜单 http://imageshack.us/a/img515/6958/a56.png
我在后面移动那个,它没有在顶部渲染,因为在我的渲染循环中它是第二个。我不确定如何处理。任何建议,我将不胜感激!