同步官网文档8m_25d

This commit is contained in:
kwiilh
2025-08-25 18:36:29 +08:00
parent 4dc0ecf18d
commit 9e8855eeb4
5089 changed files with 8798 additions and 4799 deletions

View File

@@ -1,5 +1,5 @@
---
front:
front:
hard: 入门
time: 分钟
sidebarDepth: 4
@@ -57,8 +57,8 @@ sidebarDepth: 4
"titleArea":{
"offset": [-10,0],
"textSize1": 9,
"textSize2":8,
"padding": 1
"textSize2":8,
"padding": 1
},
"pageConfig": {
"subtitle":"默认的副标题"
@@ -100,20 +100,20 @@ sidebarDepth: 4
"titleArea":{
"offset": [-10,0],
"textSize1": 9,
"textSize2":8,
"padding": 1
"textSize2":8,
"padding": 1
},
"categoryConfig":{
"contentTextSize": 12
},
"pageConfig":{
"contentTextSize": 8
}
}
}
```
这些默认值我们称为配置默认值如果目录json文件章节json文件中均无对"**contentTextSize**"属性定义则取这里的默认值。而如果book.json中没有定义"categoryConfig""entryConfig""pageConfig",则它们的属性值取系统默认值。
2. 因为支持富文本,如果你想修改文字样式,可以通过[格式化代码](https://zh.minecraft.wiki/w/%E6%A0%BC%E5%BC%8F%E5%8C%96%E4%BB%A3%E7%A0%81)来修改。
3. 所有的文本都遵循UI控件中的Label控件规范具体见[UI说明文档-Label](../../../18-界面与交互/30-UI说明文档.md#label)。
@@ -197,7 +197,7 @@ sidebarDepth: 4
"content": "subtitle是内容页的标题image是图片的路径摆放到resource_pack的ui文件夹中即可",
"image": "textures/ui/myCustomBook/testImage_2",
"info": "图片说明对应info属性"
},
},
{
"type": "imagePage",
"subtitle": "内容页的标题3",
@@ -205,7 +205,7 @@ sidebarDepth: 4
"image": "textures/ui/myCustomBook/testImage_3",
"info": "图片说明对应info属性"
}
]
]
}
```

View File

@@ -1,5 +1,5 @@
---
front:
front:
hard: 入门
time: 分钟
sidebarDepth: 4
@@ -58,7 +58,7 @@ myNoTitlePage.json
"content1": "第一段文本",
"content2": "第二段文本"
}
]
]
}
```
@@ -73,7 +73,7 @@ myNoTitlePage.json
myNoTitlePage.py
```python
#-*- coding: UTF-8 -*-
#-*- coding: UTF-8 -*-
import mod.client.extraClientApi as clientApi
# 获取书本管理对象详细用法见“05-常见脚本对象”
@@ -100,12 +100,12 @@ class MyNoTitlePage(BasePage):
"""
# 调用父类__init__方法
BasePage.__init__(self, size, position)
# 实例化需要用到的组件
self.testTitle = TextComp(bcf.TextAlign.Fit_Center) # 使用文本组件存储显示自定义属性"testTitle""
self.content1 = TextComp(bcf.TextAlign.Left) # 使用文本组件存储显示自定义属性"content1""
self.image = ImageComp() # 使用图片组件存储显示自定义属性"image""
self.content2 = TextComp(bcf.TextAlign.Left) # 使用文本组件存储显示自定义属性"content2""
self.content1 = TextComp(bcf.TextAlign.Left) # 使用文本组件存储显示自定义属性"content1""
self.image = ImageComp() # 使用图片组件存储显示自定义属性"image""
self.content2 = TextComp(bcf.TextAlign.Left) # 使用文本组件存储显示自定义属性"content2""
# 调用AddComps接口添加所有定义了的组件
self.AddComps(self.testTitle, self.content1, self.image, self.content2)
@@ -130,7 +130,7 @@ class MyNoTitlePage(BasePage):
1. 向所有组件注入数据。
2. 调用父类的同名方法。
3. 重置所有组件相对于页面的位置。
4. 对组件进行排版通过调用组件的排版API每个API的解释见“03-组件API”
4. 对组件进行排版通过调用组件的排版API每个API的解释见“03-组件API”
"""
if self.data:
# 为每个组件注入数据data中的键值对应json文件中的页面属性值
@@ -142,11 +142,11 @@ class MyNoTitlePage(BasePage):
# 执行父类的Show方法该方法会依次调用会所有组件的Show方法
BasePage.Show(self)
# 重置所有组件相对页面的位置保证每次调用Show的时候组件的排版都是相对于页面的原点
self.ResetCompsPosition()
self.ResetCompsPosition()
# 获取该页面的中心坐标和大小,方便后面使用
pageCenter = self.Center()
pageSize = self.GetSize()
pageCenter = self.Center()
pageSize = self.GetSize()
# 布局自己的组件组件在调用Align以及Move方法前需要先调用SetSize方法因为这些方法都是基于GetSize来计算的。
# testTitle 是Fit类型文本会根据文本内容来调整自己的大小无需调用SetSize。将其中心对齐到页面的中心将其上边界与 页面 的上边界对齐然后往下移动4px
self.testTitle.AlignCenterToX(pageCenter[0]).AlignTopToY(self.Top()).MoveY(4)
@@ -156,7 +156,7 @@ class MyNoTitlePage(BasePage):
self.image.SetSize((80, 80)).AlignCenterToX(pageCenter[0]).AlignTopToY(self.content1.Bottom()).MoveY(5)
# 对 content2 设置大小后,将其左边界对齐到页面的左边界,将其上边界与 image 的下边界对齐然后往下移动5px
self.content2.SetSize((pageSize[0], 40)).AlignLeftToX(self.Left()).AlignTopToY(self.image.Bottom()).MoveY(5)
return self
else:
print "in MyNoTitlePage Show: no data present"
@@ -203,10 +203,10 @@ class TutorialClientSystem(ClientSystem):
bookManager.AddPageType("CustomMod:MyAddrPage", MyAddrPage)
bookManager.AddPageType("CustomMod:MyRecyclePage", MyRecyclePage)
print "============== add MyTestPage success =============="
# 函数名为Destroy才会被调用在这个System被引擎回收的时候会调这个函数来销毁一些内容
def Destroy(self):
def Destroy(self):
pass
```
@@ -313,7 +313,7 @@ main (名字固定,必须为"main")
customComp.py
```python
#-*- coding: UTF-8 -*-
#-*- coding: UTF-8 -*-
import mod.client.extraClientApi as clientApi
# 获取书本管理对象详细用法见“05-常见脚本对象”
@@ -326,12 +326,12 @@ BaseComp = bookManager.GetBaseCompCls()
class MyCustomComp(BaseComp):
"""
自定义的书本组件类
"""
"""
def __init__(self):
"""
编写该接口需按照如下编写。
1. 先调用父类的同名方法。
2. 定义自定义的属性
2. 定义自定义的属性
"""
# 调用父类__init__方法该方法会注册书本自定义组件名称因此该方法只能调用一次一个组件绑定一个控件节点
# 第1个参数为组件的注册名称为了防止重名建议名字格式为 'mod名称:任意名称'最好就是带“Comp”后缀。
@@ -351,13 +351,13 @@ class MyCustomComp(BaseComp):
"""
页面在调用组件的Show之前默认会先调用该方法进行数据的存储
建议是将数据存储下来然后在Show方法中进行读取。
"""
"""
# 存储页面传过来的数据
self.text = text
self.textSize = textSize
self.textColor = textColor
self.image = image
self.image = image
return self
@@ -366,8 +366,8 @@ class MyCustomComp(BaseComp):
页面向组件传递数据后调用该接口组件在这里对UIControl节点进行操作。
编写该接口需按照如下编写。
1. 调用父类的同名方法。
2. 按照特定逻辑处理你的UIControl节点
"""
2. 按照特定逻辑处理你的UIControl节点
"""
# 执行父类的Show方法执行该方法后组件才能得到对应的UI控件节点并用_node_属性指向它。
BaseComp.Show(self)
@@ -376,8 +376,8 @@ class MyCustomComp(BaseComp):
# 如果是LabelUIControl节点设置文本和字体大小时需要分别调用 SetNodeText 和 SetTextFontSize具体可见 "组件API" 章节。
self.SetNodeText(textNode, self.text).SetNodeTextFontSize(textNode, 10, self.textSize)
textNode.SetTextColor(self.textColor)
imageNode = self.GetRootUINode().GetChildByPath("/image").asImage()
imageNode.SetSprite(self.image)
imageNode = self.GetRootUINode().GetChildByPath("/image").asImage()
imageNode.SetSprite(self.image)
return self
```

View File

@@ -1,5 +1,5 @@
---
front:
front:
hard: 入门
time: 分钟
sidebarDepth: 4
@@ -76,7 +76,7 @@ sidebarDepth: 4
- 参数
- 返回值
| 数据类型 | 说明 |
@@ -99,9 +99,9 @@ sidebarDepth: 4
# 清空组件内的数据
self.clearData()
# 只需要在前面完成别的逻辑,最后调用父类方法即可。
return BaseComp.Hide(self)
return BaseComp.Hide(self)
```
#### Reset<span id="Reset"></span>
- 描述
@@ -111,7 +111,7 @@ sidebarDepth: 4
- 参数
- 返回值
| 数据类型 | 说明 |
@@ -127,15 +127,15 @@ sidebarDepth: 4
- 示例
为了说明Reset函数重写的必要性这里以一个错误例子为例该例子中UI控件节点的结构如下
```python
| RootUINode # 组件封装的控件节点(根节点)
| entity # 布娃娃控件
| background # 图片控件
```
我们希望在组件中提供一个偏移属性,让 entity 节点相对于自己的默认位置UI Json中布局往上移动3px。
```python
def Show(self):
# 获取 entity 节点
@@ -145,13 +145,13 @@ sidebarDepth: 4
newPos = (pos[0], pos[1] - 3)
entityNode.SetPosition(newPos)
```
Show方法偏移之前是需要获取该节点的位置的每次的Show就会导致该节点偏移叠加起来最终的结果看起来就会如下图所示组件逐渐上移
<img src="../picture/customBook/API/comps/Reset错误示例.gif" alt="Reset错误示例" style="zoom: 85%;" />
为了解决UI控件复用导致的问题可以使用Reset的方法对该类进行属性重置让每次读取得到的pos都是与UI json中定义的默认值一致。
```python
def Show(self):
# 获取 entity 节点
@@ -162,17 +162,17 @@ sidebarDepth: 4
entityNode.SetPosition(newPos)
# 记录下位置
self.originPos = pos
def Reset(self):
entityNode = self.GetRootUINode().GetChildByPath("/entity").asNeteasePaperDoll()
# 恢复位置属性
entityNode.SetPosition(self.originPos)
```
该方法为统一接口,主要是**提示开发者使用组件复用的时候需要留意的问题**开发者完全可以通过别的方式实现属性的重置比如第一次读取就将默认属性存储下来然后后面show的时候读取而**不重写Reset方法**。
比如我们的Demo中的一个自定义组件**MyRecyleToggle**,具体可见示例[CustomBookMod](../../13-模组SDK编程/60-Demo示例.md#CustomBookMod)中的“**behavior_pack/tutorialScripts/comps/recycleToggleComp.py”**以及包含它的自定义页面“**behavior_pack/tutorialScripts/pages/recyclePage.py”**和**json**数据“**behavior_pack/customBooks/RecycleBook”**中的用法(该书本对应的物品中文名称为:“**回收组件测试书本**”),这个组件的**Reset**方法并没有具体实现,而是自己组件记录下状态,只从**json**数据中读取第一次数据。
另外,为了方便开发者,一些常见的复用问题已经内置工具方法解决,比如关于节点的偏移导致的控件复用问题,可以使用**BaseComp**中提供工具的方法 **SetNodeOffset** 解决,更多的可见下面的方法。
### 2.排版UI控件的方法
@@ -190,7 +190,7 @@ BaseComp提供了一系列方法方便开发者在页面中进行排版这些
- 参数
- 返回值
| 数据类型 | 说明 |
@@ -603,7 +603,7 @@ BaseComp提供了一系列方法方便开发者在页面中进行排版这些
- 示例
仍然以**Reset**函数的示例说明组件中的UI控件节点结构如下所示
```python
| RootUINode # 组件封装的控件节点(根节点)
| entity # 布娃娃控件
@@ -611,7 +611,7 @@ BaseComp提供了一系列方法方便开发者在页面中进行排版这些
```
在显示的时候将 entity 节点相对于自己的默认位置UI Json中布局往上移动3px。
```python
def Show(self):
# 获取 entity 节点
@@ -619,7 +619,7 @@ BaseComp提供了一系列方法方便开发者在页面中进行排版这些
# 偏移 entity 节点
self.SetNodeOffset(entityNode, (0, -3))
```
并且无需再重写**Reset**函数。
#### SetNodeSize
@@ -744,7 +744,7 @@ BaseComp提供了一系列方法方便开发者在页面中进行排版这些
| 参数名 | 数据类型 | 说明 |
| ------ | ------------- | ---------------- |
| node | BaseUIControl | 指定的UI控件节点 |
- 返回值
| 数据类型 | 说明 |
@@ -819,7 +819,7 @@ BaseComp提供了一系列方法方便开发者在页面中进行排版这些
pass
def func_2(args1, args2):
pass
callbackDict_1 = {
"func": func_1 # func_1函数没有参数所以这里不传入参数列表
}
@@ -827,7 +827,7 @@ BaseComp提供了一系列方法方便开发者在页面中进行排版这些
"func": func_2,
"args": [1, 2] # func_2函数需要两个参数所以这里传入的是包含两个参数的参数列表
}
comp = BaseComp()
comp.Call(callbackDict_1)
comp.Call(callbackDict_2)
@@ -892,7 +892,7 @@ BaseComp提供了一系列方法方便开发者在页面中进行排版这些
# 创建TextComp实例
textComp = TextComp(bcf.TextAlign.Fit_Center)
```
#### SetDataBeforeShow
@@ -916,7 +916,7 @@ BaseComp提供了一系列方法方便开发者在页面中进行排版这些
- 备注
- 该函数应该在组件显示之前被调用(也就是在组件调用**Show**之前)
- 示例
```python
@@ -945,7 +945,7 @@ BaseComp提供了一系列方法方便开发者在页面中进行排版这些
- 备注
- 在使用该方法之前需保证组件处于显示状态(也就是调用**Show**之后),因为该方法本质是调用控件节点的**SetAlpha**。
- 示例
```python
@@ -974,7 +974,7 @@ BaseComp提供了一系列方法方便开发者在页面中进行排版这些
- 备注
- 在使用该方法之前需保证组件处于显示状态(也就是调用**Show**之后),因为该方法本质是调用控件节点的**SetColor**。
- 示例
```python
@@ -1071,7 +1071,7 @@ BaseComp提供了一系列方法方便开发者在页面中进行排版这些
- 备注
- 在使用该方法之前需保证组件处于显示状态(也就是调用**Show**之后),因为该方法本质是调用控件节点的**SetAlpha**。
- 示例
```python
@@ -1111,7 +1111,7 @@ BaseComp提供了一系列方法方便开发者在页面中进行排版这些
# 获取预设组件类 HighlightComp
HighlightComp = bookManager.GetHighlightCompCls()
# 创建HighlightComp实例
highlightComp = HighlightComp()
highlightComp = HighlightComp()
```
#### SetDataBeforeShow
@@ -1157,7 +1157,7 @@ BaseComp提供了一系列方法方便开发者在页面中进行排版这些
},
{
"item": "minecraft:iron_sword",
"data": 0
"data": 0
}
]
highlightComp.SetDataBeforeShow(itemData) # 设置了3个物品的轮播
@@ -1201,7 +1201,7 @@ BaseComp提供了一系列方法方便开发者在页面中进行排版这些
# 获取预设组件类 TableRecipeComp
TableRecipeComp = bookManager.GetTableRecipeCompCls()
# 创建TableRecipeComp实例
tableRecipeComp = TableRecipeComp()
tableRecipeComp = TableRecipeComp()
```
#### SetDataBeforeShow
@@ -1233,9 +1233,9 @@ BaseComp提供了一系列方法方便开发者在页面中进行排版这些
tableRecipeComp.SetDataBeforeShow("minecraft:honey_bottle", 0) # 设置蜂蜜的配方
tableRecipeComp.Show()
```
结果如下图所示:
<img src="../picture/customBook/API/comps/tableRecipe2.png" alt="tableRecipe2" style="zoom: 80%;" />
### 4.EntityComp
@@ -1271,7 +1271,7 @@ BaseComp提供了一系列方法方便开发者在页面中进行排版这些
# 获取预设组件类 EntityComp
EntityComp = bookManager.GetEntityCompCls()
# 创建EntityComp实例
entityComp = EntityComp()
entityComp = EntityComp()
```
#### SetDataBeforeShow
@@ -1308,9 +1308,9 @@ BaseComp提供了一系列方法方便开发者在页面中进行排版这些
entityComp.SetDataBeforeShow(entityName, molang_dict, entityOffset) # 设置牛
entityComp.Show()
```
结果如下图所示:
<img src="../picture/customBook/API/comps/entity2.gif" alt="entity2" style="zoom: 100%;" />
### 5.ProgressBarComp
@@ -1340,7 +1340,7 @@ BaseComp提供了一系列方法方便开发者在页面中进行排版这些
# 获取预设组件类 ProgressBarComp
ProgressBarComp = bookManager.GetProgressBarCompCls()
# 创建ProgressBarComp实例
progressBarComp = ProgressBarComp()
progressBarComp = ProgressBarComp()
```
#### SetDataBeforeShow
@@ -1405,7 +1405,7 @@ BaseComp提供了一系列方法方便开发者在页面中进行排版这些
# 获取预设组件类 ButtonComp
ButtonComp = bookManager.GetButtonCompCls()
# 创建ButtonComp实例
buttonComp = ButtonComp()
buttonComp = ButtonComp()
```
#### SetDataBeforeShow
@@ -1445,7 +1445,7 @@ BaseComp提供了一系列方法方便开发者在页面中进行排版这些
```python
def OnPress(arg):
print "on button press with arg '{0}'".format(arg)
pressCallBackDict = {
"func": OnPress,
"args": [1]

View File

@@ -1,5 +1,5 @@
---
front:
front:
hard: 入门
time: 分钟
sidebarDepth: 4
@@ -296,7 +296,7 @@ BasePage提供了一系列方法方便开发者在页面中进行排版这些
pass
def func_2(args1, args2):
pass
callbackDict_1 = {
"func": func_1
}
@@ -304,7 +304,7 @@ BasePage提供了一系列方法方便开发者在页面中进行排版这些
"func": func_2,
"args": [1, 2]
}
page = BasePage()
page.Call(callbackDict_1)
page.Call(callbackDict_2)
@@ -393,6 +393,6 @@ TitlePage提供了对标题的处理方法方便开发者具体的示例
- 备注
- 该函数是在你自定义页面重写**Show**方法的时候调用用于排版标题如何使用见Demo。

View File

@@ -1,5 +1,5 @@
---
front:
front:
hard: 入门
time: 分钟
sidebarDepth: 4
@@ -115,7 +115,7 @@ bookManager = clientApi.GetBookManager()
bookManager = clientApi.GetBookManager()
# 获取书本配置常量
bcf = bookManager.GetBookConfig()
print bcf.TextSize.content # 输出正常文本的字体大小值 10
print bcf.TextSize.content # 输出正常文本的字体大小值 10
```
### GetBookInstance
@@ -193,11 +193,11 @@ bookManager = clientApi.GetBookManager()
- 返回值
- 示例
可见[CustomBookMod](../../13-模组SDK编程/60-Demo示例.md#CustomBookMod)中的**behavior_pack/tutorialScripts/pages/buttonPage.py**这一自定义页面的这块代码,这里实现的功能就是点击按钮后在按钮的中心位置显示文本信息。
```python
def ShowMsg(self, msg):
# 获取所有书本得管理对象
@@ -337,11 +337,11 @@ bookManager = clientApi.GetBookManager()
```python
def GoToPage(self, addr):
# 获取所有书本得管理对象
bookManager = clientApi.GetBookManager()
bookManager = clientApi.GetBookManager()
# 跳转到地址
bookManager.To(addr)
```
备注
- 只能在打开的书本中进行跳转,无法从一本书中的页面跳转到另外一本书的页面,其他跳转均是允许的,比如同章节内跳转,章节跳转到目录等等。
@@ -381,15 +381,15 @@ bookManager = clientApi.GetBookManager()
TextComp = bookManager.GetTextCompCls()
# 获取预设组件类 ImageComp
ImageComp = bookManager.GetImageCompCls()
# 自定义的一个Page
class MyTitlePage(TitlePage):
def __init__(self, size = None, position = None):
# 调用父类同名方法TitlePage 会自动添加标题组件以及提供标题组件注入数据的方法,排版的方法。
TitlePage.__init__(self, size, position)
self.content1 = TextComp(bcf.TextAlign.Left)
self.image = ImageComp()
self.content2 = TextComp(bcf.TextAlign.Left)
self.content1 = TextComp(bcf.TextAlign.Left)
self.image = ImageComp()
self.content2 = TextComp(bcf.TextAlign.Left)
self.AddComps(self.content1, self.image, self.content2)
```
@@ -648,7 +648,7 @@ bookInstance = bookManager.GetBookInstance("customBook") # 获取书本名称为
- 返回值
- 示例
```python
@@ -872,9 +872,9 @@ bookInstance = bookManager.GetBookInstance("customBook") # 获取书本名称为
bookInstance = clientApi.GetBookManager().GetBookInstance("customBook") # 获取书本名称为"customBook"的书本管理对象
if bookInstance:
# 比如获取一个identifier为"pages"的目录对象,它的父页组为"customBook"这个Book对象
categoryObj_1 = bookInstance.GetCategory("pages")
categoryObj_1 = bookInstance.GetCategory("pages")
# 比如获取一个identifier为"subcategory1"的目录对象,它的父页组为"subcategoryTest"这个Category对象这就是一个嵌套的例子
categoryObj_2 = bookInstance.GetCategory("subcategory1")
categoryObj_2 = bookInstance.GetCategory("subcategory1")
if categoryObj_1:
print categoryObj_1.GetParent().name # 输出 "customBook"
if categoryObj_2:
@@ -982,7 +982,7 @@ bookInstance = bookManager.GetBookInstance("customBook") # 获取书本名称为
# 比如获取书本当前的解锁进度如果书本下有两个已经解锁的一级子目录那么其解锁进度为100%如果一个解锁一个未解锁则为50%
import mod.client.extraClientApi as clientApi
bookInstance = clientApi.GetBookManager().GetBookInstance("customBook") # 获取书本名称为"customBook"的书本管理对象
if bookInstance:
if bookInstance:
categoryObj = bookInstance.GetCategory("pages")
if categoryObj:
# 获取 identifier 为"pages"的目录的解锁进度
@@ -1099,7 +1099,7 @@ bookInstance = bookManager.GetBookInstance("customBook") # 获取书本名称为
bookInstance = clientApi.GetBookManager().GetBookInstance("customBook") # 获取书本名称为"customBook"的书本管理对象
if bookInstance:
entryObj = bookInstance.GetEntry("entityEntry")
if entryObj:
if entryObj:
# 给 identifier 为"entityEntry"的目录解锁
entryObj.Unlock()
```