使用tweenjs写一个发牌的demo

2020-02-22 17:35:14

参考地址 使用tweenjs写一个发牌的demo

移动端h5的三大抽奖方式:转盘,老虎机,翻纸牌。
前两样demo比较多,用户也审美疲劳了。这次微信公众号要抽奖,于是调研了下翻纸牌。
预想的情景是,加载进入页面之后,纸牌从屏幕一个角落发放,并最终成为一个3*3的矩阵。
这件事可以直接用css的transform来解决,写好每个元素要偏移的位置,但会显得十分初级,也不利于复用。
之前做游戏的时候有使用过createjs引擎,其中对动画的处理使用了tween,十分平滑也易于定义。那么有没有不依赖于createjs的tween?搜了下,答案是有,在这里
先贴一个tweenjs的使用范例:

var element = document.getElementById('myElement');var tween = new TWEEN.Tween({ top: 0, left: 0 }).to({ top: 100, left: 100 }, 1000) .onUpdate(function() { 
    element.style.transform = 'translate(' + this.left + 'px, ' + this.top + 'px);';
 });

聪明的你看完肯定知道它是干啥的了。

现在发牌的问题归结为:9张牌,创建9个tween,发到不同的地方去。
关键的js代码:

            var tweens = new Array(9);
            var position = {x: 0, y: 0, rotation: 0};
            var targets = function(){
                var tmp = new Array(9);
                for(var j = 0 ; j < tmp.length ; j ++ ){
                    tmp[j] = document.getElementById('target'+(j+1));
                }
                return tmp ;
            }();
            console.log(targets);
            function createTweens(){
                
                var myW = targets[1].offsetWidth ;
                var myH = targets[1].offsetHeight ;
                for( var i = tweens.length -1  ; i >= 0  ; i -- ){
                    
                    var tween = new TWEEN.Tween(position)
                        .to({x: ((i%3)*1.2-1.2)*myW, y: 0-(parseInt(i/3)+1)*myH-10*parseInt(i/3), rotation: 359}, 200)
                        .delay(0)
                        //.easing(TWEEN.Easing.Cubic.In)
                        .onUpdate(function(i){
                            var j = i;
                            return function(){
                                targets[j].style.webkitTransform = 'translate(' + position.x + 'px, ' + position.y + 'px)';
                            }
                            
                        }(i))
                        .onComplete(function(){
                            position.x = 0 ;
                            position.y = 0 ;
                            console.log(position);
                        });
                    tweens[i] = tween ;
                }
            }

中间需要说明的是,写了一个闭包来绑定onUpdate; 每张纸牌从一个点发放到指定位置,经过了一些计算。
然后我们从上往下发牌:

function init() {

                createTweens();
                for( var i = tweens.length -1 ; i > 0  ; i--){
                    tweens[i].chain(tweens[i-1]);
                }
                

                tweens[tweens.length -1].start();

            }

我把demo放在了服务器上。其中翻牌的部分,请参考这里



  • 2021-01-13 13:36:29

    shortid nodejs短id生成器

    短ID在实际运用中很广泛, 其中比较典型的运用就是短地址。 市面上肯定有不少开源的生成短ID库, 基于node.js的估计也不少。 鉴于本人已然是node.js的脑残粉(本职java开发), 很多业余项目从前端到后端都基于javascript开发, 加上npm和bower的包管理以及grunt的打包工具, 在项目开发过程中体验特别酸爽。 由于当时项目前后端都会用到短ID, 但没找到合适的库同时支持npm和bower的(可能孤陋寡闻). 因此自己乐此不疲地又造了个轮子js-shortid(夷,为什么会说又呢?!). 下面主要介绍它的实现方案, 自认为比较优雅简洁。

  • 2021-01-13 17:23:21

    CREATE TABLE 表名 AS SELECT 语句 快速复制表但是锁表

    注意Table2的主键约束,如果Table2有主键而且不为空,则 field1, field2…中必须包括主键 在执行语句的时候,MySQL是逐行加锁的(扫描一个锁一个),直至锁住所有符合条件的数据,执行完毕才释放锁。所以当业务在进行的时候,切忌使用这种方法。 在RR隔离级别下,还会加行锁和间隙锁

  • 2021-01-13 17:27:04

    Navicat配置mysql数据库用户权限

    用数据库的时候就会遇到有多个用户,分配用户权限的情况,有些用户只读,有些用户可以读写,有些用户只能操作一个或者多个数据库,如何给mysql的用户设置权限,我这里描述一下如何用navicat图形操作分配用户权限

  • 2021-01-14 06:15:04

    通过glide获取图片显示后的真正宽高

    有时候需要获取网络图片的宽高来设置图片显示的大小,很多人会直接利用Glide的加载监听去拿图片的宽高,但是这样拿到的不是图片真正的宽高,而是图片显示在ImageView后的宽高。如下:

  • 2021-01-14 09:38:57

    Chrome插件详细教程

    严格来讲,我们正在说的东西应该叫Chrome扩展(Chrome Extension),真正意义上的Chrome插件是更底层的浏览器功能扩展,可能需要对浏览器源码有一定掌握才有能力去开发。鉴于Chrome插件的叫法已经习惯,本文也全部采用这种叫法,但读者需深知本文所描述的Chrome插件实际上指的是Chrome扩展。

  • 2021-01-14 17:07:51

    chrome.contextMenus.create不出现菜单

    主要原因是,我每次刷新玩,都复制一下右键,然而并没有出现菜单,一度颓废啊,因为demo,还有其他人的文章都是这样的。 哎,后来发现是这样的,我缺少了contexts选项。其实我是成功了,我现在只要不选择文字,直接点右键,菜单已经出现了哦。