GFX、Sprite 与字体

.gfx 文件里的 spriteType 等精灵类型、图标的两种查找方式、贴图格式,以及 fonts.gfx 与 fonts.asset

图片是怎么被引用的

群星里的图片有两种引用方式,写模组前先分清:

  1. 按 sprite 名引用:脚本或界面里写 icon = "GFX_edict_type_policy"、picture = GFX_evt_tomb_world,游戏在 .gfx 文件里找这个名字,再读取它指向的贴图。
  2. 按路径约定直接读取:很多对象没有 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 = { } 里:

Clausewitz 脚本
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可拉伸的边框、背景、按钮:四角保持原样,中间平铺
frameAnimatedSpriteType5逐帧动画
textSpriteType4带文字的按钮底图
flagSpriteType3旗帜

常用字段:

字段说明
namesprite 名
texturefile贴图路径,相对游戏/模组根目录
noOfFrames贴图横向切成几帧;按钮常用 2–3 帧(普通/悬停/按下),图标表用多帧配合 frame 选择
effectFile着色器,例如按钮常用 gfx/FX/buttonstate.shader
borderSize = { x = 12 y = 12 }corneredTileSpriteType 的不拉伸边框宽度
masking_texture遮罩贴图;原版事件图片用它裁出边缘
alwaystransparent = yes不拦截鼠标

原版 interface/common/buttons.gfx 中的可拉伸按钮:

Clausewitz 脚本
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 中的动画:

Clausewitz 脚本
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.assetTTF/OTF 字体:font = { name = … fontstyle = { style = regular file = "gfx/fonts/…" } }
interface/fonts.gfx界面使用的字体名(如 cg_16b),以及全局文字颜色表

原版 fonts.asset 中简体中文字体:

Clausewitz 脚本
font = {
	name = "Chinese_normal"

	fontstyle = {
		style = regular
		file = "gfx/fonts/NotoSansCJKsc-Regular.otf"
	}
}

fonts.gfx 里,界面字体先用 bitmapfont 定义,再用 bitmapfont_override 按语言换成 TTF 字体。原版 cg_16b 的中文覆盖:

Clausewitz 脚本
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 授权。