chuan.ma · UI Assets

川麻牌面资产总览

33 个程序化 SVG 牌面(万 / 条 / 筒 各 1–9 + 牌背)· 矢量 · 任意尺寸清晰 · 零依赖 · 免授权
27 张正牌1 张牌背 viewBox 60×84SVGv3.1 内嵌字形 + 条子实体画法 ← 返回 chuan.ma

万 Characters · 一萬 – 九萬

条 Bamboo · 一索 – 九索(1 索为幺鸡)

按实体牌面画法:1 条是一整只幺鸡(唯一不按数量表达的条子); 5 条正中一根红、7 条最上一根红、9 条中间一行三根红 —— 这三张不看数字也能认; 8 条是唯一左右各一根竖杆、中间一个「山形」的(上组 ∧、下组 ∨,中间留空)。

筒 Dots · 一筒 – 九筒

牌背 · Tile Back

实战尺寸预览 · In-context sizes

我的手牌(点击可打,48×68)
牌河 / 副露(28×39)
对手手牌(牌背)
用法:页面里按顺序引入 tokens.js → glyphs.js → tiles-ui.js 后, MJTiles.face(tileId) 返回牌面 SVG 字符串(tileId 0–26), MJTiles.back() 返回牌背。
容器决定尺寸(SVG 用 width:100%;height:100% + viewBox 自适应), 推荐比例 60:84(约 0.714),最小可用 24×34。
配色:万=靛黑刻字 + 朱红「萬」;条=竹绿圆柱(5 / 7 / 9 条的定位节为朱红); 筒=蓝球面 + 朱红靶心;牌面象牙白。
v3 实体质感:全牌面共用一个光源(左上 45°)。牌身是凸起 (垂直渐变顶亮底暗 + 左上偏置的柔和高光 + 左内缘亮线 / 右内缘暗线 + 底部暗边); 面板是凹陷,四壁明暗与凸起完全相反;万为刻字(下方 0.9 单位亮色副本露边); 条为圆柱(横向暗→亮→暗);筒为球面(径向渐变 + 左上高光点);牌背有斜织纹。 色板与强度集中在 tokens.js,绘制代码不硬写色值。
v3.1 条子实体画法:红色定位节(RED_STICKS:5 条正中 / 7 条最上 / 9 条中间一行)与绿节同结构、同受光,只换色系 —— 换色板的实现是 stick() 收一个色板参数,不是另写一套画法。
v3.2 八条与幺鸡:8 条改成「两根竖杆 + 中间一个山形」×2(TIAO8 / tiao8Segments())—— 每组左右各一根完全竖直的杆,中间两根约 42° 的 短斜杆合成 ∧(上组)/ ∨(下组),上下镜像、中间留空。这组比例是从实体牌面的位图量出来的 (逐行扫墨迹段得到竖杆位置、倾角、斜杆/竖杆的长度比),不是照感觉调的; 斜杆比竖杆短约 24%,顶点距本组近端 36%。 1 条从「椭圆身体 + 圆脑袋」重绘成整幅彩绘幺鸡:冠(3 根红羽)· 上下两瓣金喙 · 眼+高光 · 颈胸身体(左上受光球面渐变)· 亮绿翅羽(3 道羽线)· 三根向左下散开的长尾羽 · 金双足 · 尾根红结(源自「一条=一串贯钱 + 一个红结」的来历)。
v3 字体:汉字是内嵌矢量路径(glyphs.js,由 tools/extract-glyphs.py 从霞鹜文楷 TC Bold 抽取,SIL OFL 1.1,见 docs/OFL.txt)—— 不依赖系统字体,任何设备、任何尺寸下字形一致, 光栅化成图片纹理时也不会缺字。
改动后请跑 npm run smoke、 npm run visual 比对视觉指纹、npm run visual:compare 出前后对照图。
教学应用:Tile Recognition 直接复用本页同一份资产 (讲哪张牌就画哪张牌),并带两个用真实牌面出题的随堂练习。