GFX、Sprite 与字体
.gfx 文件里的 spriteType 等精灵类型、图标的两种查找方式、贴图格式,以及 fonts.gfx 与 fonts.asset
图片是怎么被引用的
群星里的图片有两种引用方式,写模组前先分清:
- 按 sprite 名引用:脚本或界面里写
icon = "GFX_edict_type_policy"、picture = GFX_evt_tomb_world,游戏在.gfx文件里找这个名字,再读取它指向的贴图。 - 按路径约定直接读取:很多对象没有 sprite,游戏按键名拼出路径。原版里可以确认的有:
| 对象 | 路径 |
|---|---|
| 科技 | gfx/interface/icons/technologies/<科技键>.dds |
| 建筑 | gfx/interface/icons/buildings/<建筑键>.dds |
| 物种特质 | gfx/interface/icons/traits/<特质键>.dds |
| 岗位 | gfx/interface/icons/jobs/job_<岗位键>.dds |
| 国家理念 | gfx/interface/icons/governments/civics/<理念键>.dds(未写 icon 时) |
对第二类,只要把同名 .dds 放到对应目录即可,不需要写 .gfx。
还有一些字段直接写贴图路径,例如起源的 icon = "gfx/interface/icons/origins/origins_mechanist.dds"、静态修正的 icon。
.gfx 文件
.gfx 放在 interface/ 及其子文件夹里(原版有 interface/icons/traits/leader_traits.gfx 这样的子目录文件)。整个文件包在 spriteTypes = { } 里:
spriteTypes = {
spriteType = {
name = "GFX_mymod_edict_icon"
texturefile = "gfx/interface/icons/mymod/edict_icon.dds"
}
}- 原版的 sprite 名都以
GFX_开头。自己的 sprite 请写成GFX_mymod_…,名字必须唯一,撞名会导致其中一方的图片被替换。 - 请新建自己的 .gfx 文件,不要整文件覆盖原版的
main.gfx之类,后者每次游戏更新都会变。 texturefile与textureFile原版两种大小写都有。
精灵类型
原版 .gfx 中出现的类型及数量(按 4.5 原版统计):
| 类型 | 原版数量 | 用途 |
|---|---|---|
spriteType | 约 8000 | 普通图片,按原尺寸显示 |
corneredTileSpriteType | 约 300 | 可拉伸的边框、背景、按钮:四角保持原样,中间平铺 |
frameAnimatedSpriteType | 5 | 逐帧动画 |
textSpriteType | 4 | 带文字的按钮底图 |
flagSpriteType | 3 | 旗帜 |
常用字段:
| 字段 | 说明 |
|---|---|
name | sprite 名 |
texturefile | 贴图路径,相对游戏/模组根目录 |
noOfFrames | 贴图横向切成几帧;按钮常用 2–3 帧(普通/悬停/按下),图标表用多帧配合 frame 选择 |
effectFile | 着色器,例如按钮常用 gfx/FX/buttonstate.shader |
borderSize = { x = 12 y = 12 } | corneredTileSpriteType 的不拉伸边框宽度 |
masking_texture | 遮罩贴图;原版事件图片用它裁出边缘 |
alwaystransparent = yes | 不拦截鼠标 |
原版 interface/common/buttons.gfx 中的可拉伸按钮:
corneredTileSpriteType = {
name = "GFX_tiling_button_standard"
textureFile = "gfx/interface/buttons/tiling_button_standard.dds"
borderSize = { x = 12 y = 12 }
effectFile = "gfx/FX/buttonstate.shader"
noOfFrames = 3
}原版 interface/main.gfx 中的动画:
frameAnimatedSpriteType = {
name = "GFX_control_group_in_combat_flash"
texturefile = "gfx/interface/main/control_group/in_combat_flash.dds"
noOfFrames = 10
transparencecheck = yes
animation_rate_fps = 8
looping = yes
play_on_show = yes
alwaystransparent = yes
}贴图格式
- 原版界面贴图几乎都是
.dds,也有少量.tga。用支持 DDS 的工具(GIMP、Paint.NET、Photoshop 插件等)导出,保留 Alpha 通道。 - 同一类图标请保持与原版相同的尺寸,否则在界面里会被裁切或错位。最简单的做法是打开原版对应目录里的一张图,照它的尺寸和格式来。
- 多帧贴图是横向排列的,宽度 = 单帧宽 ×
noOfFrames。
字体
字体分两层:
| 文件 | 内容 |
|---|---|
fonts/fonts.asset | TTF/OTF 字体:font = { name = … fontstyle = { style = regular file = "gfx/fonts/…" } } |
interface/fonts.gfx | 界面使用的字体名(如 cg_16b),以及全局文字颜色表 |
原版 fonts.asset 中简体中文字体:
font = {
name = "Chinese_normal"
fontstyle = {
style = regular
file = "gfx/fonts/NotoSansCJKsc-Regular.otf"
}
}fonts.gfx 里,界面字体先用 bitmapfont 定义,再用 bitmapfont_override 按语言换成 TTF 字体。原版 cg_16b 的中文覆盖:
bitmapfont_override = {
name = "cg_16b"
ttf_font = "Chinese_normal"
ttf_size = "14"
vertical_offset = "2"
languages = { "l_simp_chinese" }
# ……
}所以想换中文字体,通常是在 fonts.asset 里登记新字体,再用 bitmapfont_override 把相应界面字体指过去。fonts.gfx 开头的 textcolors 是本地化 § 颜色码的定义(注释说明它对所有字体全局生效),见本地化。
注意
fonts.gfx和fonts.asset都是单个大文件,模组改它们只能整文件覆盖,与其他改字体的模组必然冲突。
调试
| 控制台命令 | 作用 |
|---|---|
reload texture all | 重新加载所有贴图(游戏内置说明:Reloads all texture files) |
reload_gui | 重新加载所有 GUI 文件并尝试重新打开当前界面 |
图片不显示时,先看 error.log 里有没有找不到贴图或 sprite 的报错,见调试。
部分内容改编自 Stellaris Wiki: Interface modding,按 CC BY-SA 3.0 授权。