我正在使用SDL2制作游戏。我正在测试菜单,但一个bug让我觉得我必须改变我的方法。我曾经为每个菜单设置一个单独的while循环,但现在我尝试着为整个游戏设置一个单独的循环,根据变量的值来处理不同的菜单(嵌套循环变得难以处理)。我想了一会儿,但菜单上各种各样的需求给我带来了很多麻烦。如果有人能给我一些好的建议,下面是它所需要的:
-
有区别的事件处理(一个菜单应该处理玩家的移动键,另一些处理其他事情…);
-
一种在菜单停止运行时释放用malloc()声明的所有变量的方法;
-
每次菜单循环开始前只运行一次的初始化。
我希望有人能给我一个很好的方法与伪代码或只是正常的解释,提前感谢那些谁会帮助!
你可以考虑这样做:
每个菜单定义自己的struct menu
对象,该对象至少包含以下三个函数指针:
- 一个指向函数的指针,该函数在菜单打开时被调用,因此可以为菜单的数据分配内存,并且可以初始化数据。
- 指向一个函数的指针,该函数在菜单关闭时被调用,以便释放菜单分配的所有内存。
- 指向菜单输入函数的指针,该函数在程序接收到输入时被调用。如果菜单处理输入,这个函数将返回
true
,如果它不处理输入,则返回false
,因为它与菜单无关(例如,如果输入是玩家移动的键)。
你的程序应该有一个指向struct menu
的指针,它总是指定当前活动的菜单,如果没有活动的菜单,则指向NULL
。每当程序的主循环接收到输入时,它就调用当前活动菜单的输入函数的函数指针。如果菜单的输入函数返回true
,那么游戏的主循环将忽略输入,但如果菜单的输入函数返回false
(例如,如果输入是玩家移动的键),那么游戏的主循环将处理输入本身。