技能树之旅: 计算点数与从这开始

之前写了一篇技能树之旅: 从模块分离到测试,现在来说说这其中发生了什么。

从这开始

在我们没有点击任何技能的时候,显示的是”从这开始”,而当我们点下去时发生了什么?

明显变化如下:

从Knockout开始

Knockout是一个轻量级的UI类库,通过应用MVVM模式使JavaScript前端UI简单化。

据说有下面的一些特性。

  • 声明式绑定 (Declarative Bindings):使用简明易读的语法很容易地将模型(model)数据关联到DOM元素上。
  • UI界面自动刷新 (Automatic UI Refresh):当您的模型状态(model state)改变时,您的UI界面将自动更新。
  • 依赖跟踪 (Dependency Tracking):为转变和联合数据,在你的模型数据之间隐式建立关系。
  • 模板 (Templating):为您的模型数据快速编写复杂的可嵌套的UI。

在我们的html中的从这开始是这样一段HTML

<h2 class="start-helper" data-bind="css:{active:noPointsSpent}">从这开始!</h2>

这是对应的CSS:

.start-helper-avatar {
  background: url(../images/red-arrow.png) no-repeat left center;
  padding-left: 55px;
  top: 80px;
  position: relative;
  left: 410px;
  -moz-opacity: 0;
  -khtml-opacity: 0;
  -webkit-opacity: 0;
  opacity: 0;
  -ms-filter: progid:DXImageTransform.Microsoft.Alpha(opacity=0);
  filter: alpha(opacity=0);
}

.start-helper-avatar.active {
  -moz-opacity: 1;
  -khtml-opacity: 1;
  -webkit-opacity: 1;
  opacity: 1;
  -ms-filter: progid:DXImageTransform.Microsoft.Alpha(opacity=100);
  filter: alpha(opacity=100);
}

.start-helper-avatar.active.start-helper-avatar的不同之处在于.actie将opacity设置为了1。

而,我们对应的JS代码是这样子的:

self.noPointsSpent = ko.computed(function () {
  return !Boolean(ko.utils.arrayFirst(self.skills(), function (skill) {
    return (skill.points() > 0);
  }));
});

当有一个技能点数大于0时,返回False。而当没有技能点数时,html是这样的。

<h2 class="start-helper active" data-bind="css:{active:noPointsSpent}">从这开始!</h2>

故而对于此,我们可以明白,Knockout的CSS绑定是这样子的:

CSS绑定主要是给DOM元素对象添加或移除一个或多个css class类名。这非常有用,比如当值变成负数的时候用红色高亮显示。

点数计算

对应的我们可以找到点数计算的HTML

<div data-bind="css: { ‘can-add-points‘: canAddPoints, ‘has-points‘: hasPoints, ‘has-max-points‘: hasMaxPoints }, attr: { ‘data-skill-id‘: id }" class="skill">

当然还有:

<div data-bind="click: addPoint, rightClick: removePoint" class="hit-area"></div>

与CSS:

.skill.can-add-points .frame {
  background-position: -80px top;
}
.skill.can-add-points .skill-dependency {
  -moz-opacity: 1;
  -khtml-opacity: 1;
  -webkit-opacity: 1;
  opacity: 1;
  -ms-filter: progid:DXImageTransform.Microsoft.Alpha(opacity=100);
  filter: alpha(opacity=100);
}

对应的,我们可以找到它的js函数:

  self.addPoint = function () {
    if (self.canAddPoints()) {
      self.points(self.points() + 1);
    }
  };
  self.removePoint = function () {
    if (self.canRemovePoints()) {
      self.points(self.points() - 1);
    }
  };

看上去通俗易懂,唯一需要理解的就是click

click绑定在DOM元素上添加事件句柄以便元素被点击的时候执行定义的JavaScript 函数。

其他

Sherlock:一个新的技能树:https://github.com/phodal/sherlock

开发进行时,欢迎加入。

时间: 2024-10-15 10:28:59

技能树之旅: 计算点数与从这开始的相关文章

技能树之旅: 从模块分离到测试

在之前说到 奋斗了近半个月后,将fork的代码读懂.重构.升级版本.调整,添加新功能.添加测试.添加CI.添加分享之后,终于almost finish. 今天就来说说是怎样做的. Github项目组成 以之前造的Lettuce为例,里面有: 代码质量(Code Climate) CI状态(Travis CI) 测试覆盖率(96%) 自动化测试(npm test) 文档 按照Web Developer路线图来说,我们还需要有: 版本管理 自动部署 等等. Skillock模块化 在SkillTre

我的Java开发学习之旅------&gt;计算从1到N中1的出现次数的效率优化问题

有一个整数n,写一个函数f(n),返回0到n之间出现的"1"的个数.比如f(1)=1:f(13)=6,问一个最大的能满足f(n)=n中的n是什么? 例如:f(13)=6, 因为1,10,11,12,13.正好是6个1. 解析:这题关键在效率上,在没有发现很科学.快速地计算出个数的情况下,可以采取缓存的机制.因为就2000000来说,计算时间就已经无法忍受了,因此,可以把以前的计算结果缓存起来,把每次的结果保存好,就不用每次都重新计算,从而可提高效率. 例如:计算101,只需要把1~10

n个骰子的点数

题目:把n个骰子扔在地上,所有骰子朝上一面的点数之和为s,输入n,打印出s的所有可能的值出现的概率. 解法一:基于递归求骰子点数,时间效率不高. 现在我们考虑如何统计每一个点数出现的次数.要想求出n个骰子的点数和,可以先把n个骰子分为两堆:第一堆只有一个,另一个有n-1个,单独的那一个有可能出现从1到6的点数.我们需要计算从1到6的每一种点数和剩下的n-1个骰子来计算点数和.接下来把剩下的n-1个骰子还是分成两堆,第一堆只有一个,第二堆有n-2个.我们把上一轮那个单独骰子的点数和这一轮单独筛子的

剑指Offer面试题43(Java版):n个骰子的点数

题目:把n个骰子仍在地上.全部骰子朝上一面的点数之和为s,输入n,打印出s的全部可能的值出现的概率. 解法一:基于递归求骰子的点数,时间效率不够高 如今我们考虑怎样统计每个点数出现的次数. 要向求出n个骰子的点数和.能够先把n个骰子分为两堆:第一堆仅仅有一个.还有一个有n-1个.单独的那一个有可能出现从1到6的点数. 我们须要计算从1到6的每一种点数和剩下的n-1个骰子来计算点数和. 接下来把剩下的n-1个骰子还是分成两堆,第一堆仅仅有一个.第二堆有n-2个. 我们把上一轮哪个单独骰子的点数和这

n 个骰子的点数

题目 把 n 个骰子扔在地上,所有骰子朝上一面的点数之和为 s.输入 n,打印出 s 的所有可能的值出现的概率. 思路 解法一: 先把 n 个骰子分为两堆:第一堆只有一个,另一个有 n-1 个.单独的那一个有可能出现从 1 到 6 的点数.我们需要计算从 1 到 6 的每一种点数和剩下的 n-1 个骰子来计算点数和.接下来把剩下的 n-1 个骰子还是分成两堆,第一堆只有一个, 第二堆有 n-2 个.我们把上一轮那个单独骰子的点数和这一轮单独骰子的点数相加, 再和剩下的 n-2 个骰子来计算点数和

Jq之21点游戏

最近在看Jq,里面有个21点的游戏挺不错的,也是需要一点时间去理解~分享一下 html结构 <!DOCTYPE html> <html> <head> <title>Head First Black Jack</title> <meta http-equiv="Content-type" content="text/html;charset=utf-8"> <link href="

NDT(Normal Distribution Transform) 算法(与ICP对比)和一些常见配准算法

原文地址:http://ghx0x0.github.io/2014/12/30/NDT-match/ By GH 发表于 12月 30 2014 目前三维配准中用的较多的是ICP迭代算法,需要提供一个较好的初值,同时由于算法本身缺陷,最终迭代结果可能会陷入局部最优.本文介绍的是另一种比较好的配准算法,NDT配准.这个配准算法耗时稳定,跟初值相关不大,初值误差大时,也能很好的纠正过来. 绪论: 采样: 3d点云数据在离相机近处点云密度大,远处密度小,所以在下采样时采用统一的采样方法还是会保留密度不

剑指 Offer 题目汇总索引

剑指 Offer 总目录:(共50道大题) 1. 赋值运算符函数(或应说复制拷贝函数问题) 2. 实现 Singleton 模式 (C#) 3.二维数组中的查找 4.替换空格               时间:O(n) 空间:O(1) 5.从尾到头打印链表 6. 重建二叉树          && 二叉树的各种遍历(BFS,DFS,DLR,LDR,LRD) 7.用两个栈实现队列 8.旋转数组的最小数字 9.斐波那契数列第 n 项        时间O(lgn) 10.一个整数的二进制表示中

对功率谱的一点理解

以下的matlab程序分别使用周期图法.相关函数法以及AR谱方法计算信号的功率谱. % power spectrum estimated clear all; clc; close all; Fs=1000; % 採样频率 nfft = 1024; % fft计算点数 %产生含有噪声的序列 n=0:1/Fs:1; xn=cos(2*pi*100*n)+3*cos(2*pi*200*n)+(2*randn(size(n))); subplot(2,2,1);plot(xn);title('加噪信号