由守望先锋英雄血槽引发的思考

最近到了赛季末了,输赢也不怎么在乎了,开始关注守望先锋的设计。在我看来,守望先锋的 UI 还是很好看的,不仅设计得十分简洁,而且用户体验很友好。昨天注意到了 UI 中的英雄血槽,觉得很奇怪。

奇怪的地方

来看看 DJ 的血槽。以前没怎么注意,昨天仔细数了一下有 8 个小格,嗯?为什么不是 10 个格呢?正常来说我们都希望取整呀。

再来看看别的英雄血槽。

烈空是 6 个小格。要是我来设计显示格数应该是 200 血的对应 10 小格,150 血对应 5 小格。这样才符合我们生活中的取整规则呀。

初步实现

因为最近也在做守望的 UI 组件,所以就想实现这个“血槽”组件。一开始还很容易的,在外面的“血槽” Wrapper 给定一个宽度,然后里面的小格就简单地除一下就好了,再设置 margin-left 搞个空隙,美滋滋。

先看看初步实现的代码

<div class="ow-blood-items" :style="{width: width + 'px'}">
    <span class="ow-blood-item"
        :style="getItemStyles(item)"
        v-for="item in itemNum"
        :key="item">
    </span>
</div>

Vue 文件里的 JS 实现如下

props: {
    total: {
        type: Number,
        default: 200
    },
    width: {
        type: Number,
        default: 200
    },
},
computed: {
    itemNum() {
        return this.total / 25
    },
},
methods: {
    getItemStyles(item) {
        return {
            width: this.width / this.itemNum - 2 + 'px',
            background: (item >= this.residual / 25) ? this.goneColor : this.residualColor
        }
    }
}

这里说下我是怎么算每个小格的宽度的,公式如下

小格宽度 = \frac{给定宽度}{英雄总血量\div25=小格个数} - 2(小格的 Margin 空格)

写完一看,我感觉不太行。

怎么相隔会一大一小呢?打开开发者工具一看,上面的公式是算对的呀,宽度都是 31.333px。

再看看计算后的样式,直接吐血

31.328px + 2px = 33.328px

明显四舍五入了,虽然只差了 0.002px,但是一看就看出来了,得改呀。

选定宽度

浏览器四舍五入真没办法了,要解决这个问题也很简单,只要不出现小数不就好了?所以我开始想 props 里的默认宽度应该选什么值才能 最大地被整除 呢。

这时候,我回看了一下守望先锋里所有英雄的血槽数,分别是 150, 200, 250, 500, 600, 800, 1000,对应的小格个数应该是(全部除以 25)6, 8, 10, 20, 24, 32, 40。现在的目标就是找到一个数,可以将这些小格数整除就好了。这个问题也太简单了,他们的公倍数太容易找到了——240 嘛。

设置了 240px 后果然好看多了。

因为这里每个小格的宽度都是可以被整除的,也就不会出现四舍五入的情况了。

总结

现在可以回答 “为什么要守望先锋为什么要设置 8 个格而不是 10 个格” 这个问题了,主要的原因就是找最小公倍数的时候,设置 8 个格的最小公倍数在其他方案里最小的。想像一下如果小格数是 3, 17, 23,那他们的最小公倍数就是 3\times17\times23,这样也太大了,很不方便设置总宽度。

联想到之前做的栅格系统,它的设计理念和刚刚推理的类似的,只不过是反过来用,如为什么一定要分 12,24 格呢?这里的原因是因为可以分成 1, 2, 3, 6, 8, 12, 24,而如果最大的为 10 就只能分成 1, 2, 5 了,分割的方案很少。

那如果 5, 10, 20, 25 不是更好么?这样的最小公倍数是 50,多完美呀。嗯。。。,因为英雄血槽数不是我规定的呀,是暴雪规定的呀。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 218,122评论 6 505
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,070评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,491评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,636评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,676评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,541评论 1 305
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,292评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,211评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,655评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,846评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,965评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,684评论 5 347
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,295评论 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,894评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,012评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,126评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,914评论 2 355

推荐阅读更多精彩内容

  • 重新梳理下面试中关于游戏的理解。 1.印象最深的什么游戏,这款游戏让我印象深的特点是什么? 从游戏的核心玩法,从机...
    豪猪的名字阅读 1,349评论 1 3
  • 第一章数和数的运算 一概念 (一)整数 1整数的意义 自然数和0都是整数。 2自然数 我们在数物体的时候,用来表示...
    meychang阅读 2,606评论 0 5
  • Provider启动流程 通过dubbo的启动日志分析dubbo的服务发布原理 1. 暴露本地服务 [DUBBO]...
    半个橙子阅读 856评论 0 2
  • 小时候你穿过妈妈织的毛衣吗?那细长的勾针和长长的毛线团在妈妈的手里飞舞着,没几天就变成了漂亮温暖的麻花毛衣,穿在身...
    创意社阅读 455评论 0 4
  • (旅行前夕写) 等不及 将头上的红发 与芳草和繁星间的那一丝霞光 紧紧相连 甩开短靴 赤脚狂奔 躺在湿漉漉的牧草上...
    霖子酱阅读 175评论 3 1