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

最近到了赛季末了,输赢也不怎么在乎了,开始关注守望先锋的设计。在我看来,守望先锋的 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,多完美呀。嗯。。。,因为英雄血槽数不是我规定的呀,是暴雪规定的呀。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

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