使用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-02-03 16:52:27

    ios静态库和动态库区别

    Framework 是 Cocoa/Cocoa Touch 程序中使用的一种资源打包方式,可以将代码文件、头文件、资源文件(nib/xib、图片、国际化文本)、说明文档等集中在一起,方便开发者使用。Framework 其实是资源打包的方式,和静态库动态库的本质是没有什么关系。

  • 2021-02-03 16:57:34

    iOS中的动态库和静态库分析

    由于最近研究组件化后调试时二进制映射源码的功能,发现需要对开发中的动态库和静态库需要有一些了解。所以就有了这篇文章,由于只是了解,并没有深入到编译层面,所以本篇文章只是简单了解一些库的知识,并不深入。

  • 2021-02-03 16:58:39

    iOS静态库与动态库的区别与打包

    这篇主要是记录一下 iOS 下静态库与动态库的打包流程,以便以后用到时快速查阅,供自己也供大家学习记录。同时也简述了一下 动态库 与 静态库 的区别。

  • 2021-02-03 16:59:59

    iOS 静态库和动态库全分析

    库就是程序代码的集合,将 N 个文件组织起来,是共享程序代码的一种方式。从本质上来说是一种可执行代码的二进制格式,可以被载入内存中执行。

  • 2021-02-03 17:01:30

    iOS库 .a与.framework区别

    静态库:连接时完整地拷贝至可执行文件中,被屡次使用就有多份冗余拷贝。 动态库:连接时不复制,程序运行时由系统动态加载到内存,供程序调用,系统只加载一次,多个程序共用,节省内存。

  • 2021-02-03 17:13:58

    iOS - 封装静态库

    静态库:链接时完整的拷贝至可执行文件中,被多次使用就有多份冗余拷贝,.a的静态库 .framework的静态库

  • 2021-02-03 17:16:07

    iOS 中的动态库、静态库和 framework

    首先来看什么是库,库(Library)说白了就是一段编译好的二进制代码,加上头文件就可以供别人使用。 什么时候我们会用到库呢?一种情况是某些代码需要给别人使用,但是我们不希望别人看到源码,就需要以库的形式进行封装,只暴露出头文件。另外一种情况是,对于某些不会进行大的改动的代码,我们想减少编译的时间,就可以把它打包成库,因为库是已经编译好的二进制了,编译的时候只需要 Link 一下,不会浪费编译时间。

  • 2021-02-03 17:17:53

    iOS 同一个工程下打包不同的app

    应用图标,启动画面,应用启动后的首页都不一样。 有些课程(例如公务员考试和高考)是有目标考试的概念,不同的目标考试大纲是不一样的。拿高考来举例,北京的高考和上海的高考,就有着完全不一样的考试大纲。高考的文科和理科,又有着完全不同的考试科目。 有些课程会有一些自定义的界面,例如高考的应用可以设置昵称,有些课程的真题练习中是有推荐真题模块的,而有些课程又没有。 有些课程有扫描答题卡功能,有些课程有考前冲刺功能,有些课程有大题专项查看功能,而有些课程又没有上述功能。另外还有一些微小细节,但是解决方法和类似,所以就不一一展开说明。

  • 2021-02-04 14:02:30

    window软件界面找不到了跑到屏幕外面去了

    一般可以这样操作,按Alt+空格,然后按M,然后用上下左右键把窗口移动到能看到的地方,再按回车。有些第三方的软件可能不能用,大部分都可以这样做。