在图形化程序中,控件是进行人机交互的媒介。传统的GUI程序都会提供相应的控件,例如,按钮,文本框,单选框等等。游戏是一种特殊的图形化程序,一般不会使用特定的GUI框架来开发,没有现成的控件。游戏中的控件必须借助图形库由开发者实现。
在sgf-py中,控件被称为Element,Element类亦是所有控件类的父类,在自定义控件时,必须直接或间接继承Element类。
控件的用法:
直接在Scene中创建,在Scene的draw()方法中,调用控件的draw(surface)方法,即可在相应的surface上显示控件
游戏中的“控件”:
或者说是游戏UI,像是游戏标题页面的菜单,设置页面的各种选项,游戏中的对话框已经各种各样的按钮。这些都是与游戏风格相匹配的。
完全没有GUI界面游戏的交互方式:键盘按键(1,开始,2,结束)
秋之回忆的游戏界面,控件是简单的二维风格
超级强的全境封锁UI,已经脱离了对传统控件的理解,科幻的三维风格
游戏的控件类型,取决于游戏的风格,一般游戏引擎不会像某种GUI框架那样给出一套同样的控件,例如Wframe,Qt,python中的thinker等
Syclight GameFramework withPython也一样,控件是重新定义的,但必须继承Element类,这样框架才会识别。
Element的内置对象,属性,需要实现的方法:
area:控件位置的矩形区域
Events:控件中的事件处理对象类型是 IOEvent
EventsHadDo:处理过的事件标志
active:是否是活动的
zIndex:z-index,渲染时的前后位置0:最底层
visual:是否可见
draw(surface): 绘制控件
构造说明:
的最终成果是一个surface使用blit将这个最终的surface展示到屏幕上就是一个控件了。
控件不仅仅是一个surface,还必须处理各种事件,例如,鼠标点击事件,键盘按下事件,游戏手柄或其它输入设备的事件得到。但在sgf-py中,不需要考虑怎么处理,因为有了IOEvent这个事件处理类。
如何工作?:
这是我编写的一个控件的例子
通过在初始化控件时,调用IOEvent的appendEvent方法将事件的处理方法通过lambda表达式传入,即可完成绑定事件。跨控件的事件绑定在Scene中完成。
这个例子里self.focus指的是获取到焦点的控件
在Scene中的doXXXXEvent函数中直接调用控件的Events.doXXXXX()即可
IOEvent极大的简化了控件中事件处理机制。对应游戏“控件”而言,外表是不能千篇一律的,但事件的处理每个控件都是一样的。有关IOEvent的API会在后续介绍