GUI教程 原文:http://www.godotengine.org/wiki/doku.php?id=tutorial_gui 说明 如果有什么让大多数程序员非常痛恨的事情,那么应该是编写图形用户界面(GUIs)。它很令人厌烦,乏味并没有挑战性。几个方向会让事情变得更糟糕,比如: n 对齐UI的像素是困难的(看起来像设计人员想要的)。 n 在测试过程中出现的设计问题和可用性问题导致用户界面一直在变。 n 为不同的分辨率妥善处理屏幕大小的变化。 n 让一些屏幕组件动起来,使它看起来不那么呆板。 GUI编程是程序员消耗精力的主要原因之一。在Godot的开发期间,对于UI开发的多种技术和理念被付诸实践,比如即时模式,容器,锚,脚本等。这都都是为了减少程序员面对UI时的压力。 最后,最终的Godot中的UI子系统是能高效的解决这个问题,可以把几种不同的方法混合在一起工作。学习曲线比其他的工具包更陡一点(容易学),通过与设计师和动画师共享工具集,开发人员能够用很短的时间做复杂的UI。 控件 UI元素的基本节点是Control(在其他工具包里有时叫“Widget”或“Box”)。所有提供UI功能的节点都起源于它。 当控件以子节点的形式被添加到场景中的其他控件中时,它的坐标(position,size)就会依赖于父节点。这个设置为快速和可视化编辑复杂的UI提供了基础。 输入和绘制 控件依靠_input_event()回调来接收输入事件。只有一个在焦点内的控件接收键盘/手柄事件(参看set_focus_mode()和grab_focus())。 鼠标动作事件被在鼠标指针下面的控件直接接收。当一个控件接收到鼠标点击事件时,在按钮被释放之前,所有后来的动作事件都会伴随着点击控件而被接收到,即使鼠标指名移出控件边界。 像任何继承自CanvasItem(Control就是)的类,在每一次控件需要重绘时都会在开始接收到一个_draw()的回调(程序员需要为重绘调用update()来将CanvasItem加入队列)。如果控件不可见(这是CanvasItem的另外一个属性),则控件接收不到任何输入事件。 通常来说,程序员在组建UI时不需要直接去处理绘制和输入事件(当创建自定义控件时那更有用)。当一个动作发生时,控件会发射带有上下文信息的不同类型信号。例如,当点击一个Button时发射一个“pressed”信号,当拖动Slider时会发射一个“value_changed”信号等。 自定义控件迷你教程 在更深入之前,创建一个自定义控件是了解控件工作流程很好的方法,他们并不像看起来那么复杂。此外,虽然Godot为了不同的用途提供了多种控件,但是我们经常需要为获得特定的功能创建一个新的控件。 首先,创建一个单结点场景。节点类型是“Control”并且在2D编辑器中有一块确定的区域,像这样:
给节点添加脚本,并编写代码如下:[mw_shl_code=python,true]extends Control
var tapped=false
func _draw():
var r = Rect2( Vector2(), get_size() )
if (tapped):
draw_rect(r, Color(1,0,0) )
else:
draw_rect(r, Color(0,0,1) )
func _input_event(ev):
if (ev.type==InputEvent.MOUSE_BUTTON and ev.pressed):
tapped=true
update()
[/mw_shl_code]
运行,点击矩形块就会出现颜色变化。如下图:
UI复杂度 如前面提到的,Godot已经为UI提供了很多的控件。这些控件被分为两类。第一类是一小部分控件,可以有效的创建多数游戏的UI。第二种(大多数控件都是此类)是提供复杂的用户界面和统一的皮肤样式。正面的描述会帮助你理解什么情况下用哪一种控件。 简单的UI控件 这类控件能满足大多数的游戏,不需要复杂的交互或方式来呈现信息。用普通的材质可以很容易的设置皮肤。 n Label:显示文本的节点。 n TextureFrame:显示单个能被缩放或保持固定材质。 n TextureButton:显示一个有材质的简单按钮,可以有按下,悬停,不可用等能被设置的状态。 n TextureProgress:显示一个有材质的进度条。 此外,用锚可以高效的完成控件重定位(参考“Sizeand Anchors”教程:http://www.godotengine.org/wiki/doku.php?id=tutorial_gui_repositioning)。 总之,即使对于简单的游戏,也经常会有复杂的UI行为的需求。关于这点,例如一个滚动列表(比如排行榜),需要一个ScrollContainer和一个VBoxContainer。这些更高级的控件能和正规的那些无缝结合(反正他们都是控件)。 复杂的UI控件 剩余的控件(有很多!)使用场景通常是: n 需要复杂控件的游戏,比如PC端RPGs,MMOs,策略类,养成类等。 n 创建自定义工具,来加快内容创建。 n 创建Godot插件,来扩展引擎功能。
注意:转载必须注明出处及原帖链接!违者必究!
|