应无所住,而生其心
排名
1
文章
860
粉丝
112
评论
163
net core webapi post传递参数
庸人 : 确实坑哈,我也是下班好了好几次,发现后台传递对象是可以的,但...
百度编辑器自定义模板
庸人 : 我建议换个编辑器,因为现在百度富文本已经停止维护了,用tinymec...
ICP备案 :渝ICP备18016597号-1
网站信息:2018-2025TNBLOG.NET
技术交流:群号656732739
联系我们:contact@tnblog.net
公网安备:50010702506256
欢迎加群交流技术

JS抽奖特效练习之四:平滑加减速旋转

7040人阅读 2019/8/21 15:33 总访问:5182639 评论:0 收藏:0 手机
分类: 前端

我们进行js抽奖点击开始的时候会不停的绕着圈跑,然后停下来,这期间会先变快,然后变慢,然后停下来。

所以这里会涉及到先变快然后在变慢的方法。


为了让速度平滑的过度,可以让速度每次变化的间隔相同就行了,比如最开始的速度是100,下一次98,然后96,94,92...这样就是一次变快2,


我们最开始绕圈跑的算法是借助的setInterval,开始是匀速跑没有问题,现在我们要变速跑就不能使用它了,因为我们速度每一步都要变,如果用它的话每次都要清除停掉又重新开始浪费效率。


所以我们把run方法修改一下,变成往前走一步,也就是把那个setInterval去掉,仅仅让他往前走一步就好:

  1. //往前面走一步
  2. var run = function (speed{
  3.     $(".mainbox >div").eq(points[poi]).addClass("cur").siblings().removeClass("cur");
  4.     if (points.length - 1 == poi)
  5.         poi = 0;
  6.     else {
  7.         poi++;
  8.     }
  9. }

这里说一下,这个边界值的判断我们先放增加选中效果的前面去更好一点,可以简化一点代码,而且可以让我们后面计算中奖的时候也不需要处理这个边界值

  1. var run = function (speed{
  2.     if (poi == points.length)
  3.         poi = 0;
  4.     $(".mainbox >div").eq(points[poi]).addClass("cur").siblings().removeClass("cur");
  5.     poi++;
  6. }


为了方便测试我们可以用个按钮试试,点一次按钮移动一步的效果:

  1. $("#begin").click(function ({
  2.     run();
  3. });

如图,我每点一次按钮他就移动一步


然后我们分析实现怎么让速度每次加快2,其实很简单,使用setTimeout即可,让执行间隔每次变短2就ok。上面分析了变速不能在用setInterval了,因为setInterval还要每次都去清除一下,因为它是一直执行而不像setTimeout只执行一次

  1. //平滑变速
  2. var changespeed = function ({
  3.     var speed = 100;//初始速度100
  4.     setTimeout(function ({
  5.         run();
  6.     }, speed);
  7.     speed = speed + 98
  8.     setTimeout(function ({
  9.         run();
  10.     }, speed);
  11.     speed = speed + 96
  12.     setTimeout(function ({
  13.         run();
  14.     }, speed);
  15.     speed = speed + 94
  16.     setTimeout(function ({
  17.         run();
  18.     }, speed);
  19. }

这样的效果就是平滑的变快移动4格

然后找到规律了,就可以用循环写了。

  1. //平滑变速
  2. var changespeed = function ({
  3.     var speed = 0;
  4.     //随机变快步数
  5.     var skipnumber = 5 + Math.floor(Math.random() * 25);
  6.     //变快
  7.     for (var jq = 100; jq > skipnumber; jq--) {
  8.         setTimeout(function ({
  9.             run();
  10.         }, speed);
  11.         speed += jq;
  12.         jq--;//在减去1为了速度每次变化2
  13.     }
  14.     //随机变慢到停下来的步数
  15.     var slownumber = 110 + Math.floor(Math.random() * 96);
  16.     //变慢
  17.     for (var i = jq; i < slownumber; i++) {
  18.         setTimeout(function ({
  19.             run();
  20.         }, speed);
  21.         speed += i;
  22.         i = i + 2;
  23.     }
  24. }

也可以使用下面的方式好理解一点,上面那个变化的频率使用了循环变量杂到一起可能不是那么好理解(2020-12-18添加):

  1. var changeSpeed = function ({
  2.     //初始速度
  3.     var speed = 100;
  4.     //变化频率初始值
  5.     var rate = 98;
  6.     //变快的步数
  7.     var sikpnumber = 10 + Math.random() * 25;
  8.     //速度依次递增,速度变快
  9.     for (var i = 0; i < sikpnumber; i++) {
  10.         speed = speed + rate;
  11.         setTimeout(function ({
  12.             run();
  13.         }, speed);
  14.         //速度间隔变小
  15.         rate = rate - 2;
  16.     }
  17.     //速度依次递减,速度变慢
  18.     var slownumber = 20 + Math.random() * 56;
  19.     //变慢
  20.     for (var i = 0; i < slownumber; i++) {
  21.         speed = speed + rate;
  22.         setTimeout(function ({
  23.             run();
  24.         }, speed);
  25.         //速度间隔变大
  26.         rate = rate + 4;
  27.     }
  28. }


完整一点的类:

  1. //游戏类
  2. var Game = function (map{
  3.     var poi = 0;
  4.     var points = map.points;
  5.     var mapobj = map.mapobj;
  6.     //往前面走一步
  7.     var run = function (speed{
  8.         if (poi == points.length)
  9.            poi = 0;
  10.         $(".mainbox >div").eq(points[poi]).addClass("cur").siblings().removeClass("cur");
  11.         poi++;
  12.     }
  13.     this.begin = function ({
  14.         changespeed();
  15.     }
  16.     //平滑变速
  17.     var changespeed = function ({
  18.         var speed = 0;
  19.         //随机变快步数
  20.         var skipnumber = 5 + Math.floor(Math.random() * 25);
  21.         //变快
  22.         for (var jq = 100; jq > skipnumber; jq--) {
  23.             setTimeout(function ({
  24.                 run();
  25.             }, speed);
  26.             speed += jq;
  27.             jq--;
  28.         }
  29.         //随机变慢到停下来的步数
  30.         var slownumber = 110 + Math.floor(Math.random() * 96);
  31.         //变慢
  32.         for (var i = jq; i < slownumber; i++) {
  33.             setTimeout(function ({
  34.                 run();
  35.             }, speed);
  36.             speed += i;
  37.             i = i + 2;
  38.         }
  39.     }
  40. }

调用代码片段:

  1. //操作者
  2. var Operator = function ({
  3.     this.init = function ({
  4.         //地图类
  5.         var map = new Map();
  6.         map.createMap(7);
  7.         //游戏类
  8.         var game = new Game(map);
  9.         game.begin();
  10.     }
  11. }

当时我们这里的做法暂时是随机来的,后期我们会根据上分下分的数量来计算这一次应该停到什么位置,根据停的位置计算好步数即可。比如王者荣耀抽水晶,根据当前停止的位置就可以判断抽到水晶需要的步骤,要满足什么条件才能生成到达水晶需要的步骤即可,需要再你点击那一刻已经知道你中奖的是什么了

完全随机是没办法做到想赢钱就赢钱的



欢迎加群讨论技术,1群:677373950(满了,可以加,但通过不了),2群:656732739。有需要软件开发,或者学习软件技术的朋友可以和我联系~(Q:815170684)

评价

JS与Controller中分割字符串的方法

js: varstr=OpenRule; varstrs=newArray(); strs=str.split(&quot;,&quot;); for(vari=0;i&lt;strs.length;i++){ $(&q...

珍藏!! JS CSS不传之秘集合

&lt;!--其中5指每隔5秒刷新一次页面--&gt; &lt;metahttp-equiv=&quot;refresh&quot;content=&quot;5&quot;&gt; =========...

JSON对象和JSON字符串的区别

JSON对象是直接可以使用JQuery操作的格式,如C#中可以用对象(类名)点出属性(方法)一样var str2 = { &quot;name&quot;: ...

对象转JSON

/// &lt;summary&gt; /// 对象转json /// &lt;/summary&gt; public static string ToJson(object jsonObject) ...

来!!!今天玩 JSon

别怪我懒,其实我是真的懒///&lt;summary&gt; ///List转成json ///&lt;/summary&gt; ///&lt;typeparamname=&quot;T&quot...

JS遍历localStorage的键值对

//遍历本地存储localStorage for(vari=0;i&lt;localStorage.length;i++){ varkey=localStorage.key(i);//获取本地存储的K...

拓展JS通用方法来对应c操作

有很多时候,js不能像c#一样有那样多的方法操作,但是我们可以自己写一些方法,让他拥有:比如最常见的一些:注意:js里的...

JS的localStorage

localStorage的优势1、localStorage拓展了cookie的4K限制2、localStorage会可以将第一次请求的数据直接存储到本地,这个相...

JS监听input、keydown,有输入法时打字完成后触发事件

在给输入框绑定input或keydown事件时预期效果是有输入法时,输入中文后触发事件,不希望输一个字母就触发一次事件可以用到c...

JS截取两个字符中间的字符串

使用正则表达式来取比如我们要取brush:js;toolbar:false 这个字符串冒号和分号中间的字符串可以varclassname=&quot;brush:j...

Vue.JS+Layer实现表格数据绑定与更新

一:使用Vue.js绑定好数据与更新事件 使用v-on绑定好事件,在事件里边直接把该行数据传递进去,在更新方法里边就可以直接...

JS使用正则进行常用验证

?:问号前面的数字匹配0次或1次,也就是懒惰匹配,最多匹配一次+:匹配1次到无穷次*:匹配0次到无穷次验证只能:数字、字母...

JS字符串的替换

vartitle=&quot;我是你的大表哥&quot;; title=title.replace(&quot;大表哥&quot;,&quot;大表妹&quot;); alert(title);输...

Vue.JS 实现省市联动

HTML代码&lt;divid=&quot;pro_citys&quot;&gt; 省:&lt;selectid=&quot;provice&quot;v-on:change=&quot;prochange()&quo...

Vue.JS常见问题

一:花括号当做字符串显示的问题1:检查下绑定到vue.js的id是否重复,如果id重复了,就有可能存在这种问题,因为有可能把数...

vue.JS常用指令

v-html可以把字符串当成一个html来渲染,而不是原样输出Html类似.net mvc中的@Html.Raw()方法&lt;divv-html=&quot;item.tit...