曹氏兵法

这个天意表盘其实已经做好很久了,但一直没时间去优化,所以也很久没有开始写笔记。现在还存在的问题主要是(1) stroke 的图层在渲染的时候是没问题的,但是加载到我的手表上时候,秒针的图层会叠在中心圆点上,导致效果不美观;(2)只兼容支持彩显的手表。

一开始做的时候傻傻地手搓了半天指针式,效果总是不好,直到我发现 SDK 文件夹的 sample/Analog 里有指针式的模板,只要在此基础上稍作修改即可……

再加上 Garmin 官方的 Monkey C 教程API Docs, 似乎没有什么需要特别说的。

值得注意的是,表盘坐标轴的原点是左上角,x 轴的方向是从左到右递增,y 轴的方向是从上到下递增。在给手表加 Hashmark 和数字的时候,用作坐标的不是该元素的中心点而是最低点,所以我写了这么丑陋的东西出来:

for (var i = 1; i <= 12; i++) {
        var angleDeg = (i % 12) * 30;
        var rad = angleDeg * Math.PI / 180.0;
        var radius=(width < height ? width : height) / 2 * 0.82;
        var x = width/2 + radius * Math.sin(rad);
        var y = height/2 - radius * Math.cos(rad) -32 ;

有朋友可能注意到了,我用了霞鹜文楷和 JetBrains Mono 作为中文和英数的字体。这部分我参考了这篇文章:How I wrote a watch face for my Garmin Fēnix 8+, FNT 格式的字体基本上就是把要的字全部摘出来转化为 PNG 格式,然后以 FNT 文件指示每个字分别在图片的什么地方,方便调用。在将 TTF 转化为 FNT 的时候需要用到 BMFont。BMFont 的教程网络上也有很多,此处就不再赘述了。有一点需要注意,Latin + Latin Supplement 的部分不需要想太多,直接全部勾上就可以;中文字符则比较麻烦,通常的做法是先创建一个文本文件,输入所有你需要的字符(比如我的是骄败哀胜兵必),以 UTF-8 with BOM 的格式保存后导入到 BMFont 中。在很多教程中建议的是 UTF-8,但我测试之后发现会乱码,如果你遇到差不多的问题,就在这两个格式之间来回切换,看哪个可用。