Skip to content

旧版 UI 模块

文档内容已过时

旧版UI模块仅作向下兼容保留,推荐使用新版UI界面类(1.3.8+)

EasyScreenNodeCls 界面

简易界面类EasyScreenNodeCls, 可继承并开发

Binding 绑定Json文件

使用装饰器绑定界面到指定Json文件画布 自动完成注册

python
# Client.py
from QuModLibs.Client import *
from QuModLibs.UI import *

# 绑定一个Json文件画布, 其中ParamDict参数默认为{ "isHud": 1 } (不遮挡屏幕操作)
@EasyScreenNodeCls.Binding("myUI.main")
class MyUICls(EasyScreenNodeCls):
	def __init__(self):
		print("界面已创建")

注意事项

EasyScreenNodeCls 大量采用反射,相关页面类不推荐使用静态属性/方法 可以单独定义个类存放静态数据

创建UI界面

创建类实例即可创建UI, 界面的方法同原版ScreenNode一致 (Qu开头的为特有方法)

python
# Client.py
from QuModLibs.Client import *
from QuModLibs.UI import *

@EasyScreenNodeCls.Binding("myUI.main")
class MyUICls(EasyScreenNodeCls):
	def __init__(self):
		print("界面已创建")

# EasyScreenNodeCls会自动判断界面是否创建,如果已经创建则会直接返回node实例
@Listen(Events.UiInitFinished)
def UiInitFinished(args={}):
	MyUICls() # EasyScreenNodeCls为 <单例模式每个class只存在一份实例

获取uiNode实例

获取ui节点实例

python
# Client.py
from QuModLibs.Client import *
from QuModLibs.UI import *

@EasyScreenNodeCls.Binding("myUI.main")
class MyUICls(EasyScreenNodeCls):
	def __init__(self):
		print("界面已创建")
    def fun():
        print("执行功能")

@Listen(Events.UiInitFinished)
def UiInitFinished(args={}):
    uiNode = MyUICls() # 创建界面 返回uiNode
    uiNode.fun()
    
    # EasyScreenNodeCls 提供了多种GetUI方法
    # 最为简单和常用的: 使用你的界面类的类方法
    uiNode = MyUICls.GetUi()
    uiNode.fun()

    # 亦或者直接使用 EasyScreenNodeCls 类方法
    uiNode = EasyScreenNodeCls.GetUi(MyUICls)
    uiNode.fun()

销毁UI节点

原版界面方法销毁UI节点

python
# Client.py
from QuModLibs.Client import *
from QuModLibs.UI import *

@EasyScreenNodeCls.Binding("myUI.main")
class MyUICls(EasyScreenNodeCls):
	def __init__(self):
		print("界面已创建")
  		self.SetRemove()			# 调用方法销毁界面

@Listen(Events.UiInitFinished)
def UiInitFinished(args={}):
	MyUICls()

EasyScreenNodeCls 类方法 销毁UI节点

python
# Client.py
from QuModLibs.Client import *
from QuModLibs.UI import *

@EasyScreenNodeCls.Binding("myUI.main")
class MyUICls(EasyScreenNodeCls):
	def __init__(self):
		print("界面已创建")

@Listen(Events.UiInitFinished)
def UiInitFinished(args={}):
	MyUICls() # 创建界面
	# 类方法 RemoveUi 会自动判断界面是否存在 如果不存在则会自动pass
	MyUICls.RemoveUi()

EasyScreenNodeCls 注解功能

@EasyScreenNodeCls.Listen

注册UI界面的事件监听,并在UI销毁时自动结束监听

python
# Client.py
from QuModLibs.Client import *
from QuModLibs.UI import *

@EasyScreenNodeCls.Binding("myUI.main")
class MyUICls(EasyScreenNodeCls):
	def __init__(self):
		print("界面已创建")
        self._tick = 0

   	# 注册监听 应使用EasyScreenNodeCls.Listen而不是QuMod客户端的Listen
	@EasyScreenNodeCls.Listen(Events.OnScriptTickClient)
	def OnScriptTickClient(self):
        self._tick += 1
        if self._tick == 60:
            # 2秒后删除UI
            self.SetRemove()

@Listen(Events.UiInitFinished)
def UiInitFinished(args={}):
    MyUICls() # 创建界面 此时会每Tick输出文本内容 2秒后销毁界面
    
# PS: 基于动态语言特性 已有装饰器静态方法如 Listen 请勿再次声明相关命名的方法 否则会产生覆盖导致功能失效

@EasyScreenNodeCls.OnClick

注册按钮点击回调

python
# Client.py
from QuModLibs.Client import *
from QuModLibs.UI import *

@EasyScreenNodeCls.Binding("myUI.main")
class MyUICls(EasyScreenNodeCls):
	def __init__(self):
		print("界面已创建")
    
    @EasyScreenNodeCls.OnClick("/panel1/button1")
    def fun1(self): 		# 为 /panel1/button1 按钮添加点击回调 无参数
        print("执行功能")

@Listen(Events.UiInitFinished)
def UiInitFinished(args={}):
    MyUICls() # 创建界面

# PS: 基于动态语言特性 已有装饰器静态方法如 OnClick 请勿再次声明相关命名的方法 否则会产生覆盖导致功能失效

@EasyScreenNodeCls.OnTouch

注册按钮Touch回调 回调参数具体数据可查阅网易文档

python
# Client.py
from QuModLibs.Client import *
from QuModLibs.UI import *

@EasyScreenNodeCls.Binding("myUI.main")
class MyUICls(EasyScreenNodeCls):
	def __init__(self):
		print("界面已创建")
    
    @EasyScreenNodeCls.OnTouch("/panel2/button2")
    def fun2(self, args): # 为 /panel2/button2 按钮添加触摸回调 有详细参数
        if args["TouchEvent"] == 0: # 当对按钮执行的操作为"松开"时
        	print("执行功能")

@Listen(Events.UiInitFinished)
def UiInitFinished(args={}):
	MyUICls() # 创建界面
    
# PS: 基于动态语言特性 已有装饰器静态方法如 OnTouch 请勿再次声明相关命名的方法 否则会产生覆盖导致功能失效

Destroy 生命周期

UI生命周期方法,当UI销毁时自动调用

python
# Client.py
from QuModLibs.Client import *
from QuModLibs.UI import *

@EasyScreenNodeCls.Binding("myUI.main")
class MyUICls(EasyScreenNodeCls):
	def __init__(self):
		print("界面已创建")
    
    def Destroy(self):
        print("界面已销毁")
        
@Listen(Events.UiInitFinished)
def UiInitFinished(args={}):
    MyUICls() # 创建界面
    MyUICls.RemoveUi() # 销毁界面

UI界面自定义携参

EasyScreenNodeCls可以像常规的实例构建一样携带参数

python
# Client.py
from QuModLibs.Client import *
from QuModLibs.UI import *

@EasyScreenNodeCls.Binding("myUI.main")
class MyUICls(EasyScreenNodeCls):
	def __init__(self, entityId):
        self.entityId = entityId
		print("界面已创建")
    
    def Destroy(self):
        print("界面已销毁")
        
@Listen(Events.UiInitFinished)
def UiInitFinished(args={}):
    MyUICls(playerId) # 创建界面 并传递参数 playerId

UI界面绑定到生物

python
# Client.py
from QuModLibs.Client import *
from QuModLibs.UI import *

@EasyScreenNodeCls.Binding("myUI.main")
class MyUICls(EasyScreenNodeCls):
	def __init__(self):
		pass

# 为特定生物创建并绑定UI autoScale=True 启用自适应缩放(根据实体与摄像机的距离)
MyUICls.CreatUIBindEntity(entityId, bindOffset=(0, 0, 0), autoScale=True)

MORE

更多功能请查阅UI扩展模块

Released under the BSD3 License