-
Notifications
You must be signed in to change notification settings - Fork 5
Skinning
界面上的每个视觉元素都可以用贴图替换。放了贴图就用贴图,没放就用内置配色,功能完全不受影响——不会出现缺图变紫黑格的情况。
把 PNG 放进资源包的 assets/mcphone/textures/,路径按下面几张表(相对该目录)。改完按 F3+T 重载资源包即可看到效果,无须重启游戏。
下表共 44 个贴图位,与代码中的 PhoneSkin.Element 枚举一一对应。
| 文件名 | 画的是什么 | 建议尺寸 | 没放时 |
|---|---|---|---|
phone/frame.png |
手机外壳边框 | 136×216(含边框的整机)。中间 120×200 必须透明——外壳画在最上层,不透明会糊掉整个屏幕;反之,绘制在中间区域的内圆角、刘海会正常显示 | 画纯色边框 |
phone/status_bar.png |
顶部状态栏底 | 120×10 | 纯色 |
phone/nav_bar.png |
底部导航栏底 | 120×14 | 纯色 |
phone/nav_back.png |
导航栏返回键 | 40×14 | 画 ◁ 字符 |
phone/nav_home.png |
导航栏主页键 | 40×14 | 画 ○ 字符 |
phone/nav_tasks.png |
导航栏多任务键 | 40×14 | 画 □ 字符 |
phone/drop_slot.png |
主屏拖动排序时「松手落这儿」的空槽 | 20×20 | 半透明纯色 |
phone/page_dot.png |
主屏底部的页码点(不是当前页) | 3×3 | 半透明纯色 |
phone/page_dot_active.png |
页码点(当前页) | 3×3 | 纯白 |
phone/page_edge.png |
拖着图标停在屏幕边上时的翻页提示条 | 10×176(竖条) | 半透明纯色 |
phone/toast.png |
收到消息时右上角的通知底 | 160×32(原版通知的槽位尺寸,照这个画才不会和其他模组的通知挤在一起错位) | 纯色加一圈描边 |
phone/unread_badge.png |
未读条数的角标底。两处共用:会话列表里的未读数与消息通知右上角的计数是同一张图,换一次两处都变 | 12×9 | 纯色 |
| 文件名 | 画的是什么 | 建议尺寸 | 没放时 |
|---|---|---|---|
chat/bubble_self.png |
自己发出的聊天气泡底(只有文字消息用,图片不套气泡) | 随内容拉伸 | 纯色 |
chat/bubble_peer.png |
对方发来的聊天气泡底(同上) | 随内容拉伸 | 纯色 |
chat/input_bar.png |
会话界面输入栏底 | 90×14 | 纯色 |
chat/teleport.png |
会话列表里在线好友那一行右下角的「传送到他身边」小图标 | 7×7(按实际绘制尺寸画,这里不做平滑缩放) | 画 → 字符 |
chat/attach.png |
会话界面输入栏左边那个「+」(点开是图片 / 表情) | 9×9 | 画 + 字符 |
| 文件名 | 画的是什么 | 建议尺寸 | 没放时 |
|---|---|---|---|
music/prev.png |
「上一首」 | 9×9 | 画 ⏮ 字符 |
music/play.png |
「播放」 | 9×9 | 画 ▶ 字符 |
music/pause.png |
「暂停」 | 9×9 | 画 ⏸ 字符 |
music/next.png |
「下一首」 | 9×9 | 画 ⏭ 字符 |
music/eject.png |
唱片仓的「取出」 | 9×9 | 画 ⏏ 字符 |
music/backpack.png |
唱片仓的「从背包放」(只在仓是空的时候出现) | 9×9 | 画 ▤ 字符 |
music/mode_list_loop.png |
循环模式:列表循环 | 9×9 | 画 ↻ 字符 |
music/mode_single_loop.png |
循环模式:单曲循环 | 9×9 | 画 ① 字符 |
music/mode_shuffle.png |
循环模式:随机播放 | 9×9 | 画 ⇄ 字符 |
| 文件名 | 画的是什么 | 建议尺寸 | 没放时 |
|---|---|---|---|
gallery/delete.png |
相册单张查看里的「删除」键(点过一次之后变成文字「再点一次确认」,那一态不走贴图) | 9×9 | 画「删除」两个字 |
store/button.png |
应用详情页上可点的按钮底(购买 / 下载) | 100×16 | 纯色 |
store/button_disabled.png |
点不动时的按钮底(已安装 / 买不起) | 100×16 | 纯色 |
store/companion.png |
商店里「联动App」入口格的图标 | 20×20 | 纯色底加三个小方块 |
store/button_disabled.png是独立的一张,而非把可点的那张自动调暗:「不可点」该长什么样,由绘制贴图的人决定。
| 文件名 | 画的是什么 | 建议尺寸 | 没放时 |
|---|---|---|---|
browser/panel.png |
浏览器那块大面板的底 | 320×200 | 纯色 |
browser/bar.png |
浏览器工具条那一条的底 | 320×22 | 纯色 |
browser/back.png |
「后退」键 | 22×18(整个键框,不是居中的小图标) | 画 ◀ 字符 |
browser/forward.png |
「前进」键 | 22×18 | 画 ▶ 字符 |
browser/reload.png |
「刷新」键 | 22×18 | 画 ↻ 字符 |
browser/panel.png绝大部分会被网页盖住,真正看得见的只有加载中的空白期,纯色就够。browser/bar.png那一条在面板外面,浮在面板上方的留白里,不占网页高度。
| 文件名 | 画的是什么 | 建议尺寸 | 没放时 |
|---|---|---|---|
reader/book.png |
书架列表里那本兜底的书(只在书源画不出那本书自己的图标时用得上) | 16×16(按实际绘制尺寸画,这里不做平滑缩放) | 纯色 |
reader/search_bar.png |
阅读页顶上那条搜索栏的底 | 112×12 | 纯色 |
reader/shelved.png |
书已收进书架时行右端那颗星 | 9×9(按实际绘制尺寸画) | 画 ★ 字符 |
reader/unshelved.png |
书还没收进书架时那颗星 | 9×9 | 画 ☆ 字符 |
reader/tab.png |
底部「书架 / 书城」当前那一页的底 | 54×12 | 纯色(另一页不画底) |
| 文件名 | 画的是什么 | 建议尺寸 | 没放时 |
|---|---|---|---|
settings/slider_track.png |
滑条的槽(「界面大小」那一条,将来的音量条也用它) | 100×6,整张横向拉伸 | 纯色 |
settings/slider_fill.png |
滑条已填充的那一段 | 100×6 | 纯色 |
settings/slider_knob.png |
滑块 | 4×14(比槽高,压在槽上) | 纯色 |
settings/step_button.png |
滑条两端 − + 键的底 | 14×14 | 纯色,悬停时提亮 |
这四个位刻意使用通用名称:此后其他滑条(如音量)复用同一组贴图,只需绘制一次。
App 图标单独放在 app/ 下,文件名就是 App 的短名,都是 20×20:
app/settings.png app/app_store.png app/chat.png app/camera.png
app/gallery.png app/music.png app/ender_chest.png app/notes.png
app/waystone.png app/browser.png app/clock.png app/weather.png
app/reader.png app/quests.png
附属模组的 App 图标路径由它自己决定,见附属接口文档。
天气页那张大图标在 weather/ 下,六张 32×32:clear.png、rain.png、snow.png、thunder.png、dry.png、none.png,按当前是什么天各显其一。
这六张与上面几张表性质不同:它们没有兜底色,模组自带全套,资源包只做覆盖。建议六张一并替换,只换其中一两张会出现画风不统一。
玩家头像不在换肤范围内:那是玩家自己的皮肤,取自 Tab 玩家列表。
尺寸不必精确匹配,贴图会被拉伸到目标区域。要不变形,按建议尺寸或其等比放大绘制即可。
「建议尺寸」指的是画在屏幕上有多大,不是文件必须多大。 整数倍放大的图同样可用,且线条细、有弧度的图案这样更清楚。模组自带图的倍数:
| 贴图 | 倍数 |
|---|---|
phone/frame.png |
2 倍(272×432) |
| 导航栏三个键 | 10 倍(400×140) |
| 书架两颗星、浏览器三个键、滑块与 − + 键 | 4 倍 |
放大倍数取整数——非整数倍在低 GUI 缩放下会掉线条。
默认整张拉伸。 不带元数据的贴图会被拉到实际大小,带圆角的图在宽气泡上抻长、在窄气泡上压扁,因此纯色或纵向渐变最稳妥。
要让圆角不变形,在 PNG 旁放一份同名的 .png.mcmeta:
{"mcphone_skin": {"border": 3}}该图即改走九宫格:四角按源图上那 3 个像素原样绘制,只有四条边和中间被拉伸,气泡无论多宽多高,四个角都一样大。
| 情形 | 行为 |
|---|---|
border 大于源图短边的一半 |
忽略,退回整张拉伸 |
| 老资源包未写该文件 | 行为不变,无须改动 |
自带图中使用九宫格的有五张:
| 贴图 | border |
|---|---|
chat/bubble_self chat/bubble_peer chat/input_bar
|
3 |
settings/slider_track settings/slider_fill
|
2(使两端圆头不随条一起抻长) |
贴图改不了颜色。 悬停、点不动这类状态,在没有贴图的年代是换一个颜色画出来的;一旦这个位上有了贴图,那个颜色就再也看不见。
因此模组在有贴图时改用别的表达:
| 状态 | 表达 |
|---|---|
| 导航键、商店按钮悬停 | 整张按倍数提亮(资源包画的是什么颜色,亮起来还是那个颜色) |
| 浏览器三个键点不动 | 整张压暗 |
| 音乐键、聊天的「+」 | 把高亮块画在贴图底下 |
绘制贴图时不必自行表达这些状态。
半透明有效:alpha 介于 0 与 255 之间的像素会正常混合,抗锯齿边缘、整块半透明的底("壁纸上压一层暗色"这类效果)都可以画。
1.7.40 之前这类像素会被当作不透明绘制,边缘发硬、半透明的底变成实心。那是模组的缺陷,不是贴图的问题。
44 个贴图位模组现已全部自带,一个不缺。资源包放同路径的图仍照常覆盖;「没放时」那一列的兜底色平时轮不到出场,保留在表里是因为资源包塞进一张坏 PNG 时仍会退到那一档,而不是变成紫黑格。
| 情形 | 行为 |
|---|---|
| 文件不是合法 PNG | 退回纯色并在日志记一条警告,不崩溃 |
生成完整清单(含每个位现有的图长什么样、缺图时退回哪个颜色):
python3 docs/make_texture_manifest.py输出一张 HTML。
不在文档里存一份静态清单,是因为那种清单必然过期——
PhoneTheme头部那一份就是这么失效的。
老路径仍然识别。 1.2.7 之前所有贴图平铺在 textures/gui/ 下(phone_frame.png、app_icon_chat.png 这类)。按那套做的资源包无须改动即可继续使用——新路径找不到时自动回退,并在日志中提示一句。新做的资源包请按上面几张表。