【3D技术宅公社】XR数字艺术论坛  XR技术讨论 XR互动电影 定格动画

 找回密码
 立即注册

QQ登录

只需一步,快速开始

调查问卷
论坛即将给大家带来全新的技术服务,面向三围图形学、游戏、动画的全新服务论坛升级为UTF8版本后,中文用户名和用户密码中有中文的都无法登陆,请发邮件到324007255(at)QQ.com联系手动修改密码

3D技术论坛将以计算机图形学为核心,面向教育 推出国内的三维教育引擎该项目在持续研发当中,感谢大家的关注。

查看: 2091|回复: 0

[Godot基础知识] Godot基础教程_【5】_GUI介绍【转自9秒首发】

[复制链接]
发表于 2014-3-10 22:49:45 | 显示全部楼层 |阅读模式
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插件,来扩展引擎功能。

重定位这类控件更多的用容器来完成(参考“Sizeand Anchors”教程:http://www.godotengine.org/wiki/doku.php?id=tutorial_gui_repositioning)。


注意:转载必须注明出处及原帖链接!违者必究!
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|3D数字艺术论坛 ( 沪ICP备14023054号 )

GMT+8, 2024-11-23 15:33

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表