Table & Layout - 表格与表格布局
目前,我们的 UI元素(Element) 还只能在一行摆放,如果希望实现换行,调整元素大小、间距,我们就必须引入一些专门用于 布局(Layout) 的元素。
在 Mindustry 的UI引擎里,最常用的布局元素就是 表格(Table),相对应的布局方式就是 表格布局(Table Layout)。
Table - 初识表格
- 我们先修改一下代码,给页面添加一个表格,再把图片元素放到表格内:
js
Events.on(ClientLoadEvent, (e) => {
const dialog = new BaseDialog("My First Page")
dialog.cont.add("Welcome to my first page!")
dialog.cont.add("Mono is mining")
dialog.cont.image(Items.copper.uiIcon)
dialog.cont.image(UnitTypes.flare.uiIcon)
dialog.cont.image(Blocks.duo.uiIcon)
dialog.cont.image(Liquids.water.uiIcon)
dialog.cont.image(Icon.upload)
dialog.cont.image(Icon.cancel)
dialog.cont.table(null, (table) => {
table.image(UnitTypes.flare.uiIcon)
table.image(Blocks.duo.uiIcon)
table.image(Liquids.water.uiIcon)
table.image(Icon.upload)
table.image(Icon.cancel)
})
dialog.addCloseButton()
dialog.show()
})页面上的图标 间距(Padding) 变紧凑了,而且似乎没有其他变化。


- 那么继续修改代码,把间距加回来:
js
Events.on(ClientLoadEvent, (e) => {
const dialog = new BaseDialog("My First Page")
dialog.cont.add("Welcome to my first page!")
dialog.cont.add("Mono is mining")
dialog.cont.image(Items.copper.uiIcon)
dialog.cont.table(null, (table) => {
table.image(UnitTypes.flare.uiIcon).pad(4)
table.image(Blocks.duo.uiIcon).pad(4)
table.image(Liquids.water.uiIcon).pad(4)
table.image(Icon.upload).pad(4)
table.image(Icon.cancel).pad(4)
})
dialog.addCloseButton()
dialog.show()
})现在,页面上图标间的间距就回来了。


- 继续修改代码,让表格在水的图标的前面换行:
js
Events.on(ClientLoadEvent, (e) => {
const dialog = new BaseDialog("My First Page")
dialog.cont.add("Welcome to my first page!")
dialog.cont.add("Mono is mining")
dialog.cont.image(Items.copper.uiIcon)
dialog.cont.table(null, (table) => {
table.image(UnitTypes.flare.uiIcon).pad(4)
table.image(Blocks.duo.uiIcon).pad(4)
table.row()
table.image(Liquids.water.uiIcon).pad(4)
table.image(Icon.upload).pad(4)
table.image(Icon.cancel).pad(4)
})
dialog.addCloseButton()
dialog.show()
})
- 只有图标还是有些单调,我们给表格加一些文字:
js
Events.on(ClientLoadEvent, (e) => {
const dialog = new BaseDialog("My First Page")
dialog.cont.add("Welcome to my first page!")
dialog.cont.add("Mono is mining")
dialog.cont.image(Items.copper.uiIcon)
dialog.cont.table(null, (table) => {
table.add("星辉和双管炮:")
table.image(UnitTypes.flare.uiIcon).pad(4)
table.image(Blocks.duo.uiIcon).pad(4)
table.row()
table.add("水和图标:")
table.image(Liquids.water.uiIcon).pad(4)
table.image(Icon.upload).pad(4)
table.image(Icon.cancel).pad(4)
})
dialog.addCloseButton()
dialog.show()
})现在文本 星辉和双管炮: 和 水和图标: 在同一列(Column) 并且 居中对齐(Center Alignment)。图标也各自居中对齐。

经过上面的探索,你会发现表格添加文本和图片的方式,和之前在页面上添加文本和图片的方式完全一致。这是因为,
dialog.cont其实就是一个 表格(Table)。而且你可以看到,我们通过
dialog.cont.table(...)向页面添加表格,dialog.cont本身也是个表格,这就说明,表格是可以嵌套的——这是表格布局的基础。现在你对 表格(Table) 应该有了一定的理解,不过同样有些代码没有做解释:
- 为什么在添加表格的时候,第一个参数是
null,这是必须的吗?
这不是必须的。
如果你省去 null:
js
dialog.cont.table((table) => {})你会发现游戏会报错:

这是因为添加表格元素的函数有很多种,而它们的参数类型各不相同。JS 引擎会尝试根据你传入的类型,去匹配同名函数,上面的写法第一个参数类型是Function,引擎无法根据 Function 区分开 table(Cons) 和 table(Drawable) 函数。如果要写成单参数,正确的写法如下:
js
dialog.cont.table(cons((table) => {}))但这种写法会显得很啰嗦,而且容易漏掉一对小括号,或者漏掉大括号,不推荐。

table.add和table.image函数的返回值是什么,为什么调用返回值pad函数就能调整间距?- 这将在下一章 表格布局(Table Layout) 里深入讲解。
Table Layout - 表格布局
施工中...
小结
施工中...