├── common ├── common.js └── loadPic.js ├── css ├── bootstrap.min.css ├── mui.min.css └── style.css ├── fonts └── mui.ttf ├── game ├── actor.js ├── crash.js ├── data.js ├── effects.js ├── enemy.js ├── freeModel.js ├── index.js └── main.js ├── images ├── background.jpeg ├── bg.png ├── enemy │ ├── blowfish-icon.png │ ├── crab-icon-middle.png │ ├── octo-icon.png │ └── squid-icon-middle.png ├── finger3.png ├── obg.png ├── starfish-middle0.png ├── starfish-middle1.png ├── starfish-middle2.png ├── starfish-middle3.png ├── starfish-middle4.png ├── starfish-middle5.png ├── starfish-middle6.png ├── starfish-middle7.png ├── starfish-middle8.png ├── starfish-middle9.png ├── starfish-small0.png ├── starfish-small1.png ├── starfish-small2.png ├── starfish-small3.png ├── starfish-small4.png ├── starfish-small5.png └── weixin.png ├── index.html ├── js ├── animation.js ├── app.js ├── jquery-3.1.1 │ └── jquery-3.1.1.min.js ├── mui.enterfocus.js ├── mui.locker.js ├── mui.min.js └── tween.js ├── main.html ├── manifest.json ├── setting.html ├── test.html └── unpackage └── .confirmed_dependencies /common/common.js: -------------------------------------------------------------------------------- 1 | /* requestAnimationFrame.js 2 | * by zhangxinxu 2013-09-30 3 | */ 4 | var lastTime = 0; 5 | var vendors = ['webkit', 'moz']; 6 | for(var x = 0; x < vendors.length && !window.requestAnimationFrame; ++x) { 7 | window.requestAnimationFrame = window[vendors[x] + 'RequestAnimationFrame']; 8 | window.cancelAnimationFrame = window[vendors[x] + 'CancelAnimationFrame'] || // name has changed in Webkit 9 | window[vendors[x] + 'CancelRequestAnimationFrame']; 10 | } 11 | 12 | if (!window.requestAnimationFrame) { 13 | window.requestAnimationFrame = function(callback, element) { 14 | var currTime = new Date().getTime(); 15 | var timeToCall = Math.max(0, 16.7 - (currTime - lastTime)); 16 | var id = window.setTimeout(function() { 17 | callback(currTime + timeToCall); 18 | }, timeToCall); 19 | lastTime = currTime + timeToCall; 20 | return id; 21 | }; 22 | } 23 | if (!window.cancelAnimationFrame) { 24 | window.cancelAnimationFrame = function(id) { 25 | clearTimeout(id); 26 | }; 27 | } 28 | 29 | 30 | function lerpDistance(aim, cur, ratio){ // 目标,当前,百分比 31 | var del = cur - aim; 32 | return aim + del * ratio; 33 | } 34 | function lerpAngle(a, b, t){ 35 | var d = b - a; 36 | if(d > Math.PI) d = d - 2 * Math.PI; 37 | if(d < -Math.PI) d = d + 2 * Math.PI; 38 | return a+d*t; 39 | } 40 | 41 | function calLength(x1, y1, x2, y2){ 42 | return Math.pow(x1-x2, 2) + Math.pow(y1-y2, 2); 43 | } 44 | 45 | -------------------------------------------------------------------------------- /common/loadPic.js: -------------------------------------------------------------------------------- 1 | //预加载图片方法 2 | 3 | var pro = ['images/background.jpeg','images/starfish-middle0.png','images/starfish-middle1.png','images/starfish-middle2.png','images/starfish-middle3.png','images/starfish-middle4.png','images/starfish-middle5.png','images/starfish-middle6.png','images/starfish-middle7.png','images/starfish-middle8.png','images/starfish-middle9.png','images/enemy/blowfish-icon.png','images/enemy/crab-icon-middle.png','images/enemy/octo-icon.png','images/enemy/squid-icon-middle.png'], // 预加载图片路径 4 | proTip = ['正在疯狂布置海洋...','主角急匆匆进入海洋...','主角正在变装...','白色智障进入海洋...','紫色奇葩进入海洋...','红色大佬正在路上...','Boss章鱼暗中观察...'], // 预加载图片路径 5 | i = 0, 6 | timer = null, 7 | len = pro.length, 8 | load = function(src){ 9 | if(i < len){ 10 | $('#tip').html((proTip[i]?proTip[i]:'正在疯狂布置海洋...')); 11 | var img_obj = new Image(); 12 | img_obj.src = src; 13 | timer = setInterval(function(){ 14 | if( img_obj.complete ) { 15 | clearInterval(timer); 16 | mui('#loading').progressbar().setProgress( ((i+1)/len)*100 ); 17 | load(pro[i++]); 18 | } 19 | },80); 20 | }else { 21 | //加载完成后动作 22 | $('.mui-content').hide();//关闭进度条 23 | $('#container').show();//显示主界面 24 | main();//执行游戏入口 25 | } 26 | }; 27 | 28 | load(pro[i]); 29 | -------------------------------------------------------------------------------- /css/mui.min.css: -------------------------------------------------------------------------------- 1 | /*! 2 | * ===================================================== 3 | * Mui v3.3.0 (http://dev.dcloud.net.cn/mui) 4 | * ===================================================== 5 | *//*! normalize.css v3.0.1 | MIT License | git.io/normalize */html{font-family:sans-serif;-webkit-text-size-adjust:100%}body{margin:0}article,aside,details,figcaption,figure,footer,header,hgroup,main,nav,section,summary{display:block}audio,canvas,progress,video{display:inline-block;vertical-align:baseline}audio:not([controls]){display:none;height:0}[hidden],template{display:none}a{background:0 0}a:active,a:hover{outline:0}abbr[title]{border-bottom:1px dotted}b,strong{font-weight:700}dfn{font-style:italic}h1{margin:.67em 0}mark{color:#000;background:#ff0}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sup{top:-.5em}sub{bottom:-.25em}img{border:0}svg:not(:root){overflow:hidden}figure{margin:1em 40px}hr{box-sizing:content-box;height:0}pre{overflow:auto}code,kbd,pre,samp{font-family:monospace,monospace;font-size:1em}button,input,optgroup,select,textarea{font:inherit;margin:0;color:inherit}button{overflow:visible}button,select{text-transform:none}button,html input[type=button],input[type=reset],input[type=submit]{cursor:pointer;-webkit-appearance:button}button[disabled],html input[disabled]{cursor:default}input{line-height:normal}input[type=checkbox],input[type=radio]{box-sizing:border-box;padding:0}input[type=number]::-webkit-inner-spin-button,input[type=number]::-webkit-outer-spin-button{height:auto}input[type=search]::-webkit-search-cancel-button,input[type=search]::-webkit-search-decoration{-webkit-appearance:none}fieldset{margin:0 2px;padding:.35em .625em .75em;border:1px solid silver}legend{padding:0;border:0}textarea{overflow:auto}optgroup{font-weight:700}table{border-spacing:0;border-collapse:collapse}td,th{padding:0}*{-webkit-box-sizing:border-box;box-sizing:border-box;-webkit-user-select:none;outline:0;-webkit-tap-highlight-color:transparent;-webkit-tap-highlight-color:transparent}body{font-family:'Helvetica Neue',Helvetica,sans-serif;font-size:17px;line-height:21px;color:#000;background-color:#efeff4;-webkit-overflow-scrolling:touch}a{text-decoration:none;color:#007aff}a:active{color:#0062cc}.mui-content{background-color:#efeff4;-webkit-overflow-scrolling:touch}.mui-bar-nav~.mui-content{padding-top:44px}.mui-bar-nav~.mui-content.mui-scroll-wrapper .mui-scrollbar-vertical{top:44px}.mui-bar-header-secondary~.mui-content{padding-top:88px}.mui-bar-header-secondary~.mui-content.mui-scroll-wrapper .mui-scrollbar-vertical{top:88px}.mui-bar-footer~.mui-content{padding-bottom:44px}.mui-bar-footer~.mui-content.mui-scroll-wrapper .mui-scrollbar-vertical{bottom:44px}.mui-bar-footer-secondary~.mui-content{padding-bottom:88px}.mui-bar-footer-secondary~.mui-content.mui-scroll-wrapper .mui-scrollbar-vertical{bottom:88px}.mui-bar-tab~.mui-content{padding-bottom:50px}.mui-bar-tab~.mui-content.mui-scroll-wrapper .mui-scrollbar-vertical{bottom:50px}.mui-bar-footer-secondary-tab~.mui-content{padding-bottom:94px}.mui-bar-footer-secondary-tab~.mui-content.mui-scroll-wrapper .mui-scrollbar-vertical{bottom:94px}.mui-content-padded{margin:10px}.mui-inline{display:inline-block;vertical-align:top}.mui-block{display:block!important}.mui-visibility{visibility:visible!important}.mui-hidden{display:none!important}.mui-ellipsis{overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.mui-ellipsis-2{display:-webkit-box;overflow:hidden;white-space:normal!important;text-overflow:ellipsis;word-wrap:break-word;-webkit-line-clamp:2;-webkit-box-orient:vertical}.mui-table{display:table;width:100%;table-layout:fixed}.mui-table-cell{position:relative;display:table-cell}.mui-text-left{text-align:left!important}.mui-text-center{text-align:center!important}.mui-text-justify{text-align:justify!important}.mui-text-right{text-align:right!important}.mui-pull-left{float:left}.mui-pull-right{float:right}.mui-list-unstyled{padding-left:0;list-style:none}.mui-list-inline{margin-left:-5px;padding-left:0;list-style:none}.mui-list-inline>li{display:inline-block;padding-right:5px;padding-left:5px}.mui-clearfix:after,.mui-clearfix:before{display:table;content:' '}.mui-clearfix:after{clear:both}.mui-bg-primary{background-color:#007aff}.mui-bg-positive{background-color:#4cd964}.mui-bg-negative{background-color:#dd524d}.mui-error{margin:88px 35px;padding:10px;border-radius:6px;background-color:#bbb}.mui-subtitle{font-size:15px}h1,h2,h3,h4,h5,h6{line-height:1;margin-top:5px;margin-bottom:5px}.mui-h1,h1{font-size:36px}.mui-h2,h2{font-size:30px}.mui-h3,h3{font-size:24px}.mui-h4,h4{font-size:18px}.mui-h5,h5{font-size:14px;font-weight:400;color:#8f8f94}.mui-h6,h6{font-size:12px;font-weight:400;color:#8f8f94}p{font-size:14px;margin-top:0;margin-bottom:10px;color:#8f8f94}.mui-row:after,.mui-row:before{display:table;content:' '}.mui-row:after{clear:both}.mui-col-sm-1,.mui-col-sm-10,.mui-col-sm-11,.mui-col-sm-12,.mui-col-sm-2,.mui-col-sm-3,.mui-col-sm-4,.mui-col-sm-5,.mui-col-sm-6,.mui-col-sm-7,.mui-col-sm-8,.mui-col-sm-9,.mui-col-xs-1,.mui-col-xs-10,.mui-col-xs-11,.mui-col-xs-12,.mui-col-xs-2,.mui-col-xs-3,.mui-col-xs-4,.mui-col-xs-5,.mui-col-xs-6,.mui-col-xs-7,.mui-col-xs-8,.mui-col-xs-9{position:relative;min-height:1px}.mui-row>[class*=mui-col-]{float:left}.mui-col-xs-12{width:100%}.mui-col-xs-11{width:91.66666667%}.mui-col-xs-10{width:83.33333333%}.mui-col-xs-9{width:75%}.mui-col-xs-8{width:66.66666667%}.mui-col-xs-7{width:58.33333333%}.mui-col-xs-6{width:50%}.mui-col-xs-5{width:41.66666667%}.mui-col-xs-4{width:33.33333333%}.mui-col-xs-3{width:25%}.mui-col-xs-2{width:16.66666667%}.mui-col-xs-1{width:8.33333333%}@media (min-width:400px){.mui-col-sm-12{width:100%}.mui-col-sm-11{width:91.66666667%}.mui-col-sm-10{width:83.33333333%}.mui-col-sm-9{width:75%}.mui-col-sm-8{width:66.66666667%}.mui-col-sm-7{width:58.33333333%}.mui-col-sm-6{width:50%}.mui-col-sm-5{width:41.66666667%}.mui-col-sm-4{width:33.33333333%}.mui-col-sm-3{width:25%}.mui-col-sm-2{width:16.66666667%}.mui-col-sm-1{width:8.33333333%}}.mui-scroll-wrapper{position:absolute;z-index:2;top:0;bottom:0;left:0;overflow:hidden;width:100%}.mui-scroll{position:absolute;z-index:1;width:100%;-webkit-transform:translateZ(0);transform:translateZ(0)}.mui-scrollbar{position:absolute;z-index:9998;overflow:hidden;-webkit-transition:500ms;transition:500ms;transform:translateZ(0px);pointer-events:none;opacity:0}.mui-scrollbar-vertical{top:0;right:1px;bottom:2px;width:4px}.mui-scrollbar-vertical .mui-scrollbar-indicator{width:100%}.mui-scrollbar-horizontal{right:2px;bottom:0;left:2px;height:4px}.mui-scrollbar-horizontal .mui-scrollbar-indicator{height:100%}.mui-scrollbar-indicator{position:absolute;display:block;box-sizing:border-box;-webkit-transition:.01s cubic-bezier(.1,.57,.1,1);transition:.01s cubic-bezier(.1,.57,.1,1);transform:translate(0px,0) translateZ(0px);border:1px solid rgba(255,255,255,.80196);border-radius:2px;background:rgba(0,0,0,.39804)}.mui-plus-pullrefresh .mui-fullscreen .mui-scroll-wrapper .mui-scroll-wrapper,.mui-plus-pullrefresh .mui-fullscreen .mui-slider-group .mui-scroll-wrapper{position:absolute;top:0;bottom:0;left:0;overflow:hidden;width:100%}.mui-plus-pullrefresh .mui-fullscreen .mui-scroll-wrapper .mui-scroll,.mui-plus-pullrefresh .mui-fullscreen .mui-slider-group .mui-scroll{position:absolute;width:100%}.mui-plus-pullrefresh .mui-scroll-wrapper,.mui-plus-pullrefresh .mui-slider-group{position:static;top:auto;bottom:auto;left:auto;overflow:auto;width:auto}.mui-plus-pullrefresh .mui-slider-group{overflow:visible}.mui-plus-pullrefresh .mui-scroll{position:static;width:auto}.mui-off-canvas-wrap .mui-bar{position:absolute!important;-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0);-webkit-box-shadow:none;box-shadow:none}.mui-off-canvas-wrap{position:relative;z-index:1;overflow:hidden;width:100%;height:100%}.mui-off-canvas-wrap .mui-inner-wrap{position:relative;z-index:1;width:100%;height:100%}.mui-off-canvas-wrap .mui-inner-wrap.mui-transitioning{-webkit-transition:-webkit-transform 350ms;transition:transform 350ms cubic-bezier(.165,.84,.44,1)}.mui-off-canvas-wrap .mui-inner-wrap .mui-off-canvas-left{-webkit-transform:translate3d(-100%,0,0);transform:translate3d(-100%,0,0)}.mui-off-canvas-wrap .mui-inner-wrap .mui-off-canvas-right{-webkit-transform:translate3d(100%,0,0);transform:translate3d(100%,0,0)}.mui-off-canvas-wrap.mui-active{overflow:hidden;height:100%}.mui-off-canvas-wrap.mui-active .mui-off-canvas-backdrop{position:absolute;z-index:998;top:0;right:0;bottom:0;left:0;display:block;transition:background 350ms cubic-bezier(.165,.84,.44,1);background:rgba(0,0,0,.4);box-shadow:-4px 0 4px rgba(0,0,0,.5),4px 0 4px rgba(0,0,0,.5);-webkit-tap-highlight-color:transparent}.mui-off-canvas-wrap.mui-slide-in .mui-off-canvas-right{z-index:10000!important;-webkit-transform:translate3d(100%,0,0)}.mui-off-canvas-wrap.mui-slide-in .mui-off-canvas-left{z-index:10000!important;-webkit-transform:translate3d(-100%,0,0)}.mui-off-canvas-left,.mui-off-canvas-right{position:absolute;z-index:-1;top:0;bottom:0;visibility:hidden;box-sizing:content-box;width:70%;min-height:100%;background:#333;-webkit-overflow-scrolling:touch}.mui-off-canvas-left.mui-transitioning,.mui-off-canvas-right.mui-transitioning{-webkit-transition:-webkit-transform 350ms cubic-bezier(.165,.84,.44,1);transition:transform 350ms cubic-bezier(.165,.84,.44,1)}.mui-off-canvas-left{left:0}.mui-off-canvas-right{right:0}.mui-off-canvas-wrap:not(.mui-slide-in).mui-scalable{background-color:#333}.mui-off-canvas-wrap:not(.mui-slide-in).mui-scalable>.mui-off-canvas-left,.mui-off-canvas-wrap:not(.mui-slide-in).mui-scalable>.mui-off-canvas-right{width:80%;-webkit-transform:scale(.8);transform:scale(.8);opacity:.1}.mui-off-canvas-wrap:not(.mui-slide-in).mui-scalable>.mui-off-canvas-left.mui-transitioning,.mui-off-canvas-wrap:not(.mui-slide-in).mui-scalable>.mui-off-canvas-right.mui-transitioning{-webkit-transition:-webkit-transform 350ms cubic-bezier(.165,.84,.44,1),opacity 350ms cubic-bezier(.165,.84,.44,1);transition:transform 350ms cubic-bezier(.165,.84,.44,1),opacity 350ms cubic-bezier(.165,.84,.44,1)}.mui-off-canvas-wrap:not(.mui-slide-in).mui-scalable>.mui-off-canvas-left{-webkit-transform-origin:-100%;transform-origin:-100%}.mui-off-canvas-wrap:not(.mui-slide-in).mui-scalable>.mui-off-canvas-right{-webkit-transform-origin:200%;transform-origin:200%}.mui-off-canvas-wrap:not(.mui-slide-in).mui-scalable.mui-active>.mui-inner-wrap{-webkit-transform:scale(.8);transform:scale(.8)}.mui-off-canvas-wrap:not(.mui-slide-in).mui-scalable.mui-active>.mui-off-canvas-left,.mui-off-canvas-wrap:not(.mui-slide-in).mui-scalable.mui-active>.mui-off-canvas-right{-webkit-transform:scale(1);transform:scale(1);opacity:1}.mui-loading .mui-spinner{display:block;margin:0 auto}.mui-spinner{display:inline-block;width:24px;height:24px;-webkit-transform-origin:50%;transform-origin:50%;-webkit-animation:spinner-spin 1s step-end infinite;animation:spinner-spin 1s step-end infinite}.mui-spinner:after{display:block;width:100%;height:100%;content:'';background-image:url('data:image/svg+xml;charset=utf-8,');background-repeat:no-repeat;background-position:50%;background-size:100%}.mui-spinner-white:after{background-image:url('data:image/svg+xml;charset=utf-8,')}@-webkit-keyframes spinner-spin{0%{-webkit-transform:rotate(0deg)}8.33333333%{-webkit-transform:rotate(30deg)}16.66666667%{-webkit-transform:rotate(60deg)}25%{-webkit-transform:rotate(90deg)}33.33333333%{-webkit-transform:rotate(120deg)}41.66666667%{-webkit-transform:rotate(150deg)}50%{-webkit-transform:rotate(180deg)}58.33333333%{-webkit-transform:rotate(210deg)}66.66666667%{-webkit-transform:rotate(240deg)}75%{-webkit-transform:rotate(270deg)}83.33333333%{-webkit-transform:rotate(300deg)}91.66666667%{-webkit-transform:rotate(330deg)}100%{-webkit-transform:rotate(360deg)}}@keyframes spinner-spin{0%{transform:rotate(0deg)}8.33333333%{transform:rotate(30deg)}16.66666667%{transform:rotate(60deg)}25%{transform:rotate(90deg)}33.33333333%{transform:rotate(120deg)}41.66666667%{transform:rotate(150deg)}50%{transform:rotate(180deg)}58.33333333%{transform:rotate(210deg)}66.66666667%{transform:rotate(240deg)}75%{transform:rotate(270deg)}83.33333333%{transform:rotate(300deg)}91.66666667%{transform:rotate(330deg)}100%{transform:rotate(360deg)}}.mui-btn,button,input[type=button],input[type=reset],input[type=submit]{font-size:14px;font-weight:400;line-height:1.42;position:relative;display:inline-block;margin-bottom:0;padding:6px 12px;cursor:pointer;-webkit-transition:all;transition:all;-webkit-transition-timing-function:linear;transition-timing-function:linear;-webkit-transition-duration:.2s;transition-duration:.2s;text-align:center;vertical-align:top;white-space:nowrap;color:#333;border:1px solid #ccc;border-radius:3px;border-top-left-radius:3px;border-top-right-radius:3px;border-bottom-right-radius:3px;border-bottom-left-radius:3px;background-color:#fff;background-clip:padding-box}.mui-btn.mui-active:enabled,.mui-btn:enabled:active,button.mui-active:enabled,button:enabled:active,input[type=button].mui-active:enabled,input[type=button]:enabled:active,input[type=reset].mui-active:enabled,input[type=reset]:enabled:active,input[type=submit].mui-active:enabled,input[type=submit]:enabled:active{color:#fff;background-color:#929292}.mui-btn.mui-disabled,.mui-btn:disabled,button.mui-disabled,button:disabled,input[type=button].mui-disabled,input[type=button]:disabled,input[type=reset].mui-disabled,input[type=reset]:disabled,input[type=submit].mui-disabled,input[type=submit]:disabled{opacity:.6}.mui-btn-blue,.mui-btn-primary,input[type=submit]{color:#fff;border:1px solid #007aff;background-color:#007aff}.mui-btn-blue.mui-active:enabled,.mui-btn-blue:enabled:active,.mui-btn-primary.mui-active:enabled,.mui-btn-primary:enabled:active,input[type=submit].mui-active:enabled,input[type=submit]:enabled:active{color:#fff;border:1px solid #0062cc;background-color:#0062cc}.mui-btn-green,.mui-btn-positive,.mui-btn-success{color:#fff;border:1px solid #4cd964;background-color:#4cd964}.mui-btn-green.mui-active:enabled,.mui-btn-green:enabled:active,.mui-btn-positive.mui-active:enabled,.mui-btn-positive:enabled:active,.mui-btn-success.mui-active:enabled,.mui-btn-success:enabled:active{color:#fff;border:1px solid #2ac845;background-color:#2ac845}.mui-btn-warning,.mui-btn-yellow{color:#fff;border:1px solid #f0ad4e;background-color:#f0ad4e}.mui-btn-warning.mui-active:enabled,.mui-btn-warning:enabled:active,.mui-btn-yellow.mui-active:enabled,.mui-btn-yellow:enabled:active{color:#fff;border:1px solid #ec971f;background-color:#ec971f}.mui-btn-danger,.mui-btn-negative,.mui-btn-red{color:#fff;border:1px solid #dd524d;background-color:#dd524d}.mui-btn-danger.mui-active:enabled,.mui-btn-danger:enabled:active,.mui-btn-negative.mui-active:enabled,.mui-btn-negative:enabled:active,.mui-btn-red.mui-active:enabled,.mui-btn-red:enabled:active{color:#fff;border:1px solid #cf2d28;background-color:#cf2d28}.mui-btn-purple,.mui-btn-royal{color:#fff;border:1px solid #8a6de9;background-color:#8a6de9}.mui-btn-purple.mui-active:enabled,.mui-btn-purple:enabled:active,.mui-btn-royal.mui-active:enabled,.mui-btn-royal:enabled:active{color:#fff;border:1px solid #6641e2;background-color:#6641e2}.mui-btn-grey{color:#fff;border:1px solid #c7c7cc;background-color:#c7c7cc}.mui-btn-grey.mui-active:enabled,.mui-btn-grey:enabled:active{color:#fff;border:1px solid #acacb4;background-color:#acacb4}.mui-btn-outlined{background-color:transparent}.mui-btn-outlined.mui-btn-blue,.mui-btn-outlined.mui-btn-primary{color:#007aff}.mui-btn-outlined.mui-btn-green,.mui-btn-outlined.mui-btn-positive,.mui-btn-outlined.mui-btn-success{color:#4cd964}.mui-btn-outlined.mui-btn-warning,.mui-btn-outlined.mui-btn-yellow{color:#f0ad4e}.mui-btn-outlined.mui-btn-danger,.mui-btn-outlined.mui-btn-negative,.mui-btn-outlined.mui-btn-red{color:#dd524d}.mui-btn-outlined.mui-btn-purple,.mui-btn-outlined.mui-btn-royal{color:#8a6de9}.mui-btn-outlined.mui-btn-blue:enabled:active,.mui-btn-outlined.mui-btn-danger:enabled:active,.mui-btn-outlined.mui-btn-green:enabled:active,.mui-btn-outlined.mui-btn-negative:enabled:active,.mui-btn-outlined.mui-btn-positive:enabled:active,.mui-btn-outlined.mui-btn-primary:enabled:active,.mui-btn-outlined.mui-btn-purple:enabled:active,.mui-btn-outlined.mui-btn-red:enabled:active,.mui-btn-outlined.mui-btn-royal:enabled:active,.mui-btn-outlined.mui-btn-success:enabled:active,.mui-btn-outlined.mui-btn-warning:enabled:active,.mui-btn-outlined.mui-btn-yellow:enabled:active{color:#fff}.mui-btn-link{padding-top:6px;padding-bottom:6px;color:#007aff;border:0;background-color:transparent}.mui-btn-link.mui-active:enabled,.mui-btn-link:enabled:active{color:#0062cc;background-color:transparent}.mui-btn-block{font-size:18px;display:block;width:100%;margin-bottom:10px;padding:15px 0}.mui-btn .mui-badge{font-size:14px;margin:-2px -4px -2px 4px;background-color:rgba(0,0,0,.15)}.mui-btn .mui-badge-inverted,.mui-btn:enabled:active .mui-badge-inverted{background-color:transparent}.mui-btn-negative:enabled:active .mui-badge-inverted,.mui-btn-positive:enabled:active .mui-badge-inverted,.mui-btn-primary:enabled:active .mui-badge-inverted{color:#fff}.mui-btn-block .mui-badge{position:absolute;right:0;margin-right:10px}.mui-btn .mui-icon{font-size:inherit}.mui-btn.mui-icon{font-size:14px;line-height:1.42}.mui-btn.mui-fab{width:56px;height:56px;padding:16px;border-radius:50%;outline:0}.mui-btn.mui-fab.mui-btn-mini{width:40px;height:40px;padding:8px}.mui-btn.mui-fab .mui-icon{font-size:24px;line-height:24px;width:24px;height:24px}.mui-bar{position:fixed;z-index:10;right:0;left:0;height:44px;padding-right:10px;padding-left:10px;border-bottom:0;background-color:#f7f7f7;-webkit-box-shadow:0 0 1px rgba(0,0,0,.85);box-shadow:0 0 1px rgba(0,0,0,.85);-webkit-backface-visibility:hidden;backface-visibility:hidden}.mui-bar .mui-title{right:40px;left:40px;display:inline-block;overflow:hidden;width:auto;margin:0;text-overflow:ellipsis}.mui-bar .mui-backdrop{background:0 0}.mui-bar-header-secondary{top:44px}.mui-bar-footer{bottom:0}.mui-bar-footer-secondary{bottom:44px}.mui-bar-footer-secondary-tab{bottom:50px}.mui-bar-footer,.mui-bar-footer-secondary,.mui-bar-footer-secondary-tab{border-top:0}.mui-bar-transparent{top:0;background-color:rgba(247,247,247,0);-webkit-box-shadow:none;box-shadow:none}.mui-bar-nav{top:0;-webkit-box-shadow:0 1px 6px #ccc;box-shadow:0 1px 6px #ccc}.mui-bar-nav~.mui-content .mui-anchor{display:block;visibility:hidden;height:45px;margin-top:-45px}.mui-bar-nav.mui-bar .mui-icon{margin-right:-10px;margin-left:-10px;padding-right:10px;padding-left:10px}.mui-title{font-size:17px;font-weight:500;line-height:44px;position:absolute;display:block;width:100%;margin:0 -10px;padding:0;text-align:center;white-space:nowrap;color:#000}.mui-title a{color:inherit}.mui-bar-tab{bottom:0;display:table;width:100%;height:50px;padding:0;table-layout:fixed;border-top:0;border-bottom:0;-webkit-touch-callout:none}.mui-bar-tab .mui-tab-item{display:table-cell;overflow:hidden;width:1%;height:50px;text-align:center;vertical-align:middle;white-space:nowrap;text-overflow:ellipsis;color:#929292}.mui-bar-tab .mui-tab-item.mui-active{color:#007aff}.mui-bar-tab .mui-tab-item .mui-icon{top:3px;width:24px;height:24px;padding-top:0;padding-bottom:0}.mui-bar-tab .mui-tab-item .mui-icon~.mui-tab-label{font-size:11px;display:block;overflow:hidden;text-overflow:ellipsis}.mui-bar-tab .mui-tab-item .mui-icon:active{background:0 0}.mui-focusin>.mui-bar-header-secondary,.mui-focusin>.mui-bar-nav{position:absolute}.mui-focusin>.mui-bar~.mui-content{padding-bottom:0}.mui-bar .mui-btn{font-weight:400;position:relative;z-index:20;top:7px;margin-top:0;padding:6px 12px 7px}.mui-bar .mui-btn.mui-pull-right{margin-left:10px}.mui-bar .mui-btn.mui-pull-left{margin-right:10px}.mui-bar .mui-btn-link{font-size:16px;line-height:44px;top:0;padding:0;color:#007aff;border:0}.mui-bar .mui-btn-link.mui-active,.mui-bar .mui-btn-link:active{color:#0062cc}.mui-bar .mui-btn-block{font-size:16px;top:6px;margin-bottom:0;padding:5px 0}.mui-bar .mui-btn-nav.mui-pull-left{margin-left:-5px}.mui-bar .mui-btn-nav.mui-pull-left .mui-icon-left-nav{margin-right:-3px}.mui-bar .mui-btn-nav.mui-pull-right{margin-right:-5px}.mui-bar .mui-btn-nav.mui-pull-right .mui-icon-right-nav{margin-left:-3px}.mui-bar .mui-btn-nav:active{opacity:.3}.mui-bar .mui-icon{font-size:24px;position:relative;z-index:20;padding-top:10px;padding-bottom:10px}.mui-bar .mui-icon:active{opacity:.3}.mui-bar .mui-btn .mui-icon{top:1px;margin:0;padding:0}.mui-bar .mui-title .mui-icon{margin:0;padding:0}.mui-bar .mui-title .mui-icon.mui-icon-caret{top:4px;margin-left:-5px}.mui-bar input[type=search]{height:29px;margin:6px 0}.mui-bar .mui-input-row .mui-btn{padding:12px 10px}.mui-bar .mui-search:before{margin-top:-10px}.mui-bar .mui-input-row .mui-input-clear~.mui-icon-clear,.mui-bar .mui-input-row .mui-input-speech~.mui-icon-speech{top:0;right:12px}.mui-bar.mui-bar-header-secondary .mui-input-row .mui-input-clear~.mui-icon-clear,.mui-bar.mui-bar-header-secondary .mui-input-row .mui-input-speech~.mui-icon-speech{top:0;right:0}.mui-bar .mui-segmented-control{top:7px;width:auto;margin:0 auto}.mui-bar.mui-bar-header-secondary .mui-segmented-control{top:0}.mui-badge{font-size:12px;line-height:1;display:inline-block;padding:3px 6px;color:#333;border-radius:100px;background-color:rgba(0,0,0,.15)}.mui-badge.mui-badge-inverted{padding:0 5px 0 0;color:#929292;background-color:transparent}.mui-badge-blue,.mui-badge-primary{color:#fff;background-color:#007aff}.mui-badge-blue.mui-badge-inverted,.mui-badge-primary.mui-badge-inverted{color:#007aff;background-color:transparent}.mui-badge-green,.mui-badge-success{color:#fff;background-color:#4cd964}.mui-badge-green.mui-badge-inverted,.mui-badge-success.mui-badge-inverted{color:#4cd964;background-color:transparent}.mui-badge-warning,.mui-badge-yellow{color:#fff;background-color:#f0ad4e}.mui-badge-warning.mui-badge-inverted,.mui-badge-yellow.mui-badge-inverted{color:#f0ad4e;background-color:transparent}.mui-badge-danger,.mui-badge-red{color:#fff;background-color:#dd524d}.mui-badge-danger.mui-badge-inverted,.mui-badge-red.mui-badge-inverted{color:#dd524d;background-color:transparent}.mui-badge-purple,.mui-badge-royal{color:#fff;background-color:#8a6de9}.mui-badge-purple.mui-badge-inverted,.mui-badge-royal.mui-badge-inverted{color:#8a6de9;background-color:transparent}.mui-icon .mui-badge{font-size:10px;line-height:1.4;position:absolute;top:-2px;left:100%;margin-left:-10px;padding:1px 5px;color:#fff;background:red}.mui-card{font-size:14px;position:relative;overflow:hidden;margin:10px;border-radius:2px;background-color:#fff;background-clip:padding-box;box-shadow:0 1px 2px rgba(0,0,0,.3)}.mui-content>.mui-card:first-child{margin-top:15px}.mui-card .mui-input-group .mui-input-row:last-child:after,.mui-card .mui-input-group .mui-input-row:last-child:before,.mui-card .mui-input-group:after,.mui-card .mui-input-group:before{height:0}.mui-card .mui-table-view{margin-bottom:0;border-top:0;border-bottom:0;border-radius:6px}.mui-card .mui-table-view .mui-table-view-cell:first-child,.mui-card .mui-table-view .mui-table-view-divider:first-child{top:0;border-top-left-radius:6px;border-top-right-radius:6px}.mui-card .mui-table-view .mui-table-view-cell:last-child,.mui-card .mui-table-view .mui-table-view-divider:last-child{border-bottom-right-radius:6px;border-bottom-left-radius:6px}.mui-card .mui-table-view:after,.mui-card .mui-table-view:before,.mui-card>.mui-table-view>.mui-table-view-cell:last-child:after,.mui-card>.mui-table-view>.mui-table-view-cell:last-child:before{height:0}.mui-card-footer,.mui-card-header{position:relative;display:-webkit-box;display:-webkit-flex;display:flex;min-height:44px;padding:10px 15px;-webkit-box-pack:justify;-webkit-justify-content:space-between;justify-content:space-between;-webkit-box-align:center;-webkit-align-items:center;align-items:center}.mui-card-footer .mui-card-link,.mui-card-header .mui-card-link{line-height:44px;position:relative;display:-webkit-box;display:-webkit-flex;display:flex;height:44px;margin-top:-10px;margin-bottom:-10px;-webkit-transition-duration:.3s;transition-duration:.3s;text-decoration:none;-webkit-box-pack:start;-webkit-justify-content:flex-start;justify-content:flex-start;-webkit-box-align:center;-webkit-align-items:center;align-items:center}.mui-card-footer:before,.mui-card-header:after{position:absolute;top:0;right:0;left:0;height:1px;content:'';-webkit-transform:scaleY(.5);transform:scaleY(.5);background-color:#c8c7cc}.mui-card-header{font-size:17px;border-radius:2px 2px 0 0}.mui-card-header:after{top:auto;bottom:0}.mui-card-header>img:first-child{font-size:0;line-height:0;float:left;width:34px;height:34px}.mui-card-footer{color:#6d6d72;border-radius:0 0 2px 2px}.mui-card-content{font-size:14px;position:relative}.mui-card-content-inner{position:relative;padding:15px}.mui-card-media{vertical-align:bottom;color:#fff;background-position:center;background-size:cover}.mui-card-header.mui-card-media{display:block;padding:10px}.mui-card-header.mui-card-media .mui-media-body{font-size:14px;font-weight:500;line-height:17px;margin-bottom:0;margin-left:44px;color:#333}.mui-card-header.mui-card-media .mui-media-body p{font-size:13px;margin-bottom:0}.mui-table-view{position:relative;margin-top:0;margin-bottom:0;padding-left:0;list-style:none;background-color:#fff}.mui-table-view:after{position:absolute;right:0;bottom:0;left:0;height:1px;content:'';-webkit-transform:scaleY(.5);transform:scaleY(.5);background-color:#c8c7cc}.mui-table-view:before{position:absolute;right:0;left:0;height:1px;content:'';-webkit-transform:scaleY(.5);transform:scaleY(.5);background-color:#c8c7cc;top:-1px}.mui-table-view-icon .mui-table-view-cell .mui-navigate-right .mui-icon{font-size:20px;margin-top:-1px;margin-right:5px;margin-left:-5px}.mui-table-view-icon .mui-table-view-cell:after{left:40px}.mui-table-view-chevron .mui-table-view-cell{padding-right:65px}.mui-table-view-chevron .mui-table-view-cell>a:not(.mui-btn){margin-right:-65px}.mui-table-view-radio .mui-table-view-cell{padding-right:65px}.mui-table-view-radio .mui-table-view-cell>a:not(.mui-btn){margin-right:-65px}.mui-table-view-radio .mui-table-view-cell .mui-navigate-right:after{font-size:30px;font-weight:600;right:9px;content:'';color:#007aff}.mui-table-view-radio .mui-table-view-cell.mui-selected .mui-navigate-right:after{content:'\e472'}.mui-table-view-inverted{color:#fff;background:#333}.mui-table-view-inverted:after{position:absolute;right:0;bottom:0;left:0;height:1px;content:'';-webkit-transform:scaleY(.5);transform:scaleY(.5);background-color:#222}.mui-table-view-inverted:before{position:absolute;top:0;right:0;left:0;height:1px;content:'';-webkit-transform:scaleY(.5);transform:scaleY(.5);background-color:#222}.mui-table-view-inverted .mui-table-view-cell:after{position:absolute;right:0;bottom:0;left:15px;height:1px;content:'';-webkit-transform:scaleY(.5);transform:scaleY(.5);background-color:#222}.mui-table-view-inverted .mui-table-view-cell.mui-active,.mui-table-view-inverted .mui-table-view-cell>a:not(.mui-btn).mui-active{background-color:#242424}.mui-table-view-cell{position:relative;overflow:hidden;padding:11px 15px;-webkit-touch-callout:none}.mui-table-view-cell:after{position:absolute;right:0;bottom:0;left:15px;height:1px;content:'';-webkit-transform:scaleY(.5);transform:scaleY(.5);background-color:#c8c7cc}.mui-table-view-cell.mui-checkbox input[type=checkbox],.mui-table-view-cell.mui-radio input[type=radio]{top:8px}.mui-table-view-cell.mui-checkbox.mui-left,.mui-table-view-cell.mui-radio.mui-left{padding-left:58px}.mui-table-view-cell.mui-active{background-color:#eee}.mui-table-view-cell:last-child:after,.mui-table-view-cell:last-child:before{height:0}.mui-table-view-cell>a:not(.mui-btn){position:relative;display:block;overflow:hidden;margin:-11px -15px;padding:inherit;white-space:nowrap;text-overflow:ellipsis;color:inherit}.mui-table-view-cell>a:not(.mui-btn).mui-active{background-color:#eee}.mui-table-view-cell p{margin-bottom:0}.mui-table-view-cell.mui-transitioning>.mui-slider-handle,.mui-table-view-cell.mui-transitioning>.mui-slider-left .mui-btn,.mui-table-view-cell.mui-transitioning>.mui-slider-right .mui-btn{-webkit-transition:-webkit-transform 300ms ease;transition:transform 300ms ease}.mui-table-view-cell.mui-active>.mui-slider-handle{background-color:#eee}.mui-table-view-cell>.mui-slider-handle{position:relative;background-color:#fff}.mui-table-view-cell>.mui-slider-handle .mui-navigate-right:after,.mui-table-view-cell>.mui-slider-handle.mui-navigate-right:after{right:0}.mui-table-view-cell>.mui-slider-handle,.mui-table-view-cell>.mui-slider-left .mui-btn,.mui-table-view-cell>.mui-slider-right .mui-btn{-webkit-transition:-webkit-transform 0ms ease;transition:transform 0ms ease}.mui-table-view-cell>.mui-slider-left,.mui-table-view-cell>.mui-slider-right{position:absolute;top:0;display:-webkit-box;display:-webkit-flex;display:flex;height:100%}.mui-table-view-cell>.mui-slider-left>.mui-btn,.mui-table-view-cell>.mui-slider-right>.mui-btn{position:relative;left:0;display:-webkit-box;display:-webkit-flex;display:flex;padding:0 30px;color:#fff;border:0;border-radius:0;-webkit-box-align:center;-webkit-align-items:center;align-items:center}.mui-table-view-cell>.mui-slider-left>.mui-btn:after,.mui-table-view-cell>.mui-slider-right>.mui-btn:after{position:absolute;z-index:-1;top:0;width:600%;height:100%;content:'';background:inherit}.mui-table-view-cell>.mui-slider-left>.mui-btn.mui-icon,.mui-table-view-cell>.mui-slider-right>.mui-btn.mui-icon{font-size:30px}.mui-table-view-cell>.mui-slider-right{right:0;-webkit-transition:-webkit-transform 0ms ease;transition:transform 0ms ease;-webkit-transform:translateX(100%);transform:translateX(100%)}.mui-table-view-cell>.mui-slider-left{left:0;-webkit-transition:-webkit-transform 0ms ease;transition:transform 0ms ease;-webkit-transform:translateX(-100%);transform:translateX(-100%)}.mui-table-view-cell>.mui-slider-left>.mui-btn:after{right:100%;margin-right:-1px}.mui-table-view-divider{font-weight:500;position:relative;margin-top:-1px;margin-left:0;padding-top:6px;padding-bottom:6px;padding-left:15px;color:#999;background-color:#fafafa}.mui-table-view-divider:after{position:absolute;right:0;bottom:0;left:0;height:1px;content:'';-webkit-transform:scaleY(.5);transform:scaleY(.5);background-color:#c8c7cc}.mui-table-view-divider:before{position:absolute;top:0;right:0;left:0;height:1px;content:'';-webkit-transform:scaleY(.5);transform:scaleY(.5);background-color:#c8c7cc}.mui-table-view .mui-media,.mui-table-view .mui-media-body{overflow:hidden}.mui-table-view .mui-media-large .mui-media-object{line-height:80px;max-width:80px;height:80px}.mui-table-view .mui-media .mui-subtitle{color:#000}.mui-table-view .mui-media-object{line-height:42px;max-width:42px;height:42px}.mui-table-view .mui-media-object.mui-pull-left{margin-right:10px}.mui-table-view .mui-media-object.mui-pull-right{margin-left:10px}.mui-table-view .mui-table-view-cell.mui-media-icon .mui-media-object{line-height:29px;max-width:29px;height:29px;margin:-4px 0}.mui-table-view .mui-table-view-cell.mui-media-icon .mui-media-object img{line-height:29px;max-width:29px;height:29px}.mui-table-view .mui-table-view-cell.mui-media-icon .mui-media-object.mui-pull-left{margin-right:10px}.mui-table-view .mui-table-view-cell.mui-media-icon .mui-media-object .mui-icon{font-size:29px}.mui-table-view .mui-table-view-cell.mui-media-icon .mui-media-body:after{position:absolute;right:0;bottom:0;left:55px;height:1px;content:'';-webkit-transform:scaleY(.5);transform:scaleY(.5);background-color:#c8c7cc}.mui-table-view .mui-table-view-cell.mui-media-icon:after{height:0!important}.mui-table-view.mui-unfold .mui-table-view-cell.mui-collapse .mui-table-view{display:block}.mui-table-view.mui-unfold .mui-table-view-cell.mui-collapse .mui-table-view:after,.mui-table-view.mui-unfold .mui-table-view-cell.mui-collapse .mui-table-view:before{height:0!important}.mui-table-view.mui-unfold .mui-table-view-cell.mui-media-icon.mui-collapse .mui-media-body:after{position:absolute;right:0;bottom:0;left:70px;height:1px;content:'';-webkit-transform:scaleY(.5);transform:scaleY(.5);background-color:#c8c7cc}.mui-table-view-cell>.mui-badge,.mui-table-view-cell>.mui-btn,.mui-table-view-cell>.mui-switch,.mui-table-view-cell>a>.mui-badge,.mui-table-view-cell>a>.mui-btn,.mui-table-view-cell>a>.mui-switch{position:absolute;top:50%;right:15px;-webkit-transform:translateY(-50%);transform:translateY(-50%)}.mui-table-view-cell .mui-navigate-right>.mui-badge,.mui-table-view-cell .mui-navigate-right>.mui-btn,.mui-table-view-cell .mui-navigate-right>.mui-switch,.mui-table-view-cell .mui-push-left>.mui-badge,.mui-table-view-cell .mui-push-left>.mui-btn,.mui-table-view-cell .mui-push-left>.mui-switch,.mui-table-view-cell .mui-push-right>.mui-badge,.mui-table-view-cell .mui-push-right>.mui-btn,.mui-table-view-cell .mui-push-right>.mui-switch,.mui-table-view-cell>a .mui-navigate-right>.mui-badge,.mui-table-view-cell>a .mui-navigate-right>.mui-btn,.mui-table-view-cell>a .mui-navigate-right>.mui-switch,.mui-table-view-cell>a .mui-push-left>.mui-badge,.mui-table-view-cell>a .mui-push-left>.mui-btn,.mui-table-view-cell>a .mui-push-left>.mui-switch,.mui-table-view-cell>a .mui-push-right>.mui-badge,.mui-table-view-cell>a .mui-push-right>.mui-btn,.mui-table-view-cell>a .mui-push-right>.mui-switch{right:35px}.mui-content>.mui-table-view:first-child{margin-top:15px}.mui-table-view-cell.mui-collapse .mui-table-view .mui-table-view-cell:last-child:after,.mui-table-view-cell.mui-collapse .mui-table-view:after,.mui-table-view-cell.mui-collapse .mui-table-view:before{height:0}.mui-table-view-cell.mui-collapse>.mui-navigate-right:after,.mui-table-view-cell.mui-collapse>.mui-push-right:after{content:'\e581'}.mui-table-view-cell.mui-collapse.mui-active{margin-top:-1px}.mui-table-view-cell.mui-collapse.mui-active .mui-collapse-content,.mui-table-view-cell.mui-collapse.mui-active .mui-table-view{display:block}.mui-table-view-cell.mui-collapse.mui-active>.mui-navigate-right:after,.mui-table-view-cell.mui-collapse.mui-active>.mui-push-right:after{content:'\e580'}.mui-table-view-cell.mui-collapse.mui-active .mui-table-view-cell>a:not(.mui-btn).mui-active{margin-left:-31px;padding-left:47px}.mui-table-view-cell.mui-collapse .mui-collapse-content{position:relative;display:none;overflow:hidden;margin:11px -15px -11px;padding:8px 15px;-webkit-transition:height .35s ease;-o-transition:height .35s ease;transition:height .35s ease;background:#fff}.mui-table-view-cell.mui-collapse .mui-collapse-content>.mui-input-group,.mui-table-view-cell.mui-collapse .mui-collapse-content>.mui-slider{width:auto;height:auto;margin:-8px -15px}.mui-table-view-cell.mui-collapse .mui-collapse-content>.mui-slider{margin:-8px -16px}.mui-table-view-cell.mui-collapse .mui-table-view{display:none;margin-top:11px;margin-right:-15px;margin-bottom:-11px;margin-left:-15px;border:0}.mui-table-view-cell.mui-collapse .mui-table-view.mui-table-view-chevron{margin-right:-65px}.mui-table-view-cell.mui-collapse .mui-table-view .mui-table-view-cell{padding-left:31px;background-position:31px 100%}.mui-table-view-cell.mui-collapse .mui-table-view .mui-table-view-cell:after{position:absolute;right:0;bottom:0;left:30px;height:1px;content:'';-webkit-transform:scaleY(.5);transform:scaleY(.5);background-color:#c8c7cc}.mui-table-view.mui-grid-view{font-size:0;display:block;width:100%;padding:0 10px 10px 0;white-space:normal}.mui-table-view.mui-grid-view .mui-table-view-cell{font-size:17px;display:inline-block;margin-right:-4px;padding:10px 0 0 14px;text-align:center;vertical-align:middle;background:0 0}.mui-table-view.mui-grid-view .mui-table-view-cell .mui-media-object{width:100%;max-width:100%;height:auto}.mui-table-view.mui-grid-view .mui-table-view-cell>a:not(.mui-btn){margin:-10px 0 0 -14px}.mui-table-view.mui-grid-view .mui-table-view-cell>a:not(.mui-btn).mui-active,.mui-table-view.mui-grid-view .mui-table-view-cell>a:not(.mui-btn):active{background:0 0}.mui-table-view.mui-grid-view .mui-table-view-cell .mui-media-body{font-size:15px;line-height:15px;display:block;width:100%;height:15px;margin-top:8px;text-overflow:ellipsis;color:#333}.mui-table-view.mui-grid-view .mui-table-view-cell:after,.mui-table-view.mui-grid-view .mui-table-view-cell:before{height:0}.mui-grid-view.mui-grid-9{margin:0;padding:0;border-top:1px solid #eee;border-left:1px solid #eee;background-color:#f2f2f2}.mui-grid-view.mui-grid-9:after,.mui-grid-view.mui-grid-9:before{display:table;content:' '}.mui-grid-view.mui-grid-9:after{clear:both;position:static}.mui-grid-view.mui-grid-9 .mui-table-view-cell{margin:0;padding:11px 15px;vertical-align:top;border-right:1px solid #eee;border-bottom:1px solid #eee}.mui-grid-view.mui-grid-9 .mui-table-view-cell.mui-active{background-color:#eee}.mui-grid-view.mui-grid-9 .mui-table-view-cell>a:not(.mui-btn){margin:0;padding:10px 0}.mui-grid-view.mui-grid-9:before{height:0}.mui-grid-view.mui-grid-9 .mui-media{color:#797979}.mui-grid-view.mui-grid-9 .mui-media .mui-icon{font-size:2.4em;position:relative}.mui-slider-cell{position:relative}.mui-slider-cell>.mui-slider-handle{z-index:1}.mui-slider-cell>.mui-slider-left,.mui-slider-cell>.mui-slider-right{position:absolute;z-index:0;top:0;bottom:0}.mui-slider-cell>.mui-slider-left{left:0}.mui-slider-cell>.mui-slider-right{right:0}input,select,textarea{font-family:'Helvetica Neue',Helvetica,sans-serif;font-size:17px;-webkit-tap-highlight-color:transparent;-webkit-tap-highlight-color:transparent}input:focus,select:focus,textarea:focus{-webkit-tap-highlight-color:transparent;-webkit-tap-highlight-color:transparent;-webkit-user-modify:read-write-plaintext-only}input[type=color],input[type=date],input[type=datetime-local],input[type=datetime],input[type=email],input[type=month],input[type=number],input[type=password],input[type=search],input[type=tel],input[type=text],input[type=time],input[type=url],input[type=week],select,textarea{line-height:21px;width:100%;height:40px;margin-bottom:15px;padding:10px 15px;-webkit-user-select:text;border:1px solid rgba(0,0,0,.2);border-radius:3px;outline:0;background-color:#fff;-webkit-appearance:none}input[type=number]::-webkit-inner-spin-button,input[type=number]::-webkit-outer-spin-button{margin:0;-webkit-appearance:none}input[type=search]{font-size:16px;-webkit-box-sizing:border-box;box-sizing:border-box;height:34px;text-align:center;border:0;border-radius:6px;background-color:rgba(0,0,0,.1)}input[type=search]:focus{text-align:left}textarea{height:auto;resize:none}select{font-size:14px;height:auto;margin-top:1px;border:0!important;background-color:#fff}select:focus{-webkit-user-modify:read-only}.mui-input-group{position:relative;padding:0;border:0;background-color:#fff}.mui-input-group:after{position:absolute;right:0;bottom:0;left:0;height:1px;content:'';-webkit-transform:scaleY(.5);transform:scaleY(.5);background-color:#c8c7cc}.mui-input-group:before{position:absolute;top:0;right:0;left:0;height:1px;content:'';-webkit-transform:scaleY(.5);transform:scaleY(.5);background-color:#c8c7cc}.mui-input-group input,.mui-input-group textarea{margin-bottom:0;border:0;border-radius:0;background-color:transparent;-webkit-box-shadow:none;box-shadow:none}.mui-input-group input[type=search]{background:0 0}.mui-input-group input:last-child{background-image:none}.mui-input-row{clear:left;overflow:hidden}.mui-input-row select{font-size:17px;height:37px;padding:0}.mui-input-row .mui-btn+input,.mui-input-row label+input,.mui-input-row:last-child{background:0 0}.mui-input-group .mui-input-row{height:40px}.mui-input-group .mui-input-row:after{position:absolute;right:0;bottom:0;left:15px;height:1px;content:'';-webkit-transform:scaleY(.5);transform:scaleY(.5);background-color:#c8c7cc}.mui-input-row label{font-family:'Helvetica Neue',Helvetica,sans-serif;line-height:1.1;float:left;width:35%;padding:11px 15px}.mui-input-row label~input,.mui-input-row label~select,.mui-input-row label~textarea{float:right;width:65%;margin-bottom:0;padding-left:0;border:0}.mui-input-row .mui-btn{line-height:1.1;float:right;width:15%;padding:10px 15px}.mui-input-row .mui-btn~input,.mui-input-row .mui-btn~select,.mui-input-row .mui-btn~textarea{float:left;width:85%;margin-bottom:0;padding-left:0;border:0}.mui-button-row{position:relative;padding-top:5px;text-align:center}.mui-input-group .mui-button-row{height:45px}.mui-input-row{position:relative}.mui-input-row.mui-input-range{overflow:visible;padding-right:20px}.mui-input-row .mui-inline{padding:8px 0}.mui-input-row .mui-input-clear~.mui-icon-clear,.mui-input-row .mui-input-password~.mui-icon-eye,.mui-input-row .mui-input-speech~.mui-icon-speech{font-size:20px;position:absolute;z-index:1;top:10px;right:0;width:38px;height:38px;text-align:center;color:#999}.mui-input-row .mui-input-clear~.mui-icon-clear.mui-active,.mui-input-row .mui-input-password~.mui-icon-eye.mui-active,.mui-input-row .mui-input-speech~.mui-icon-speech.mui-active{color:#007aff}.mui-input-row .mui-input-speech~.mui-icon-speech{font-size:24px;top:8px}.mui-input-row .mui-input-clear~.mui-icon-clear~.mui-icon-speech{display:none}.mui-input-row .mui-input-clear~.mui-icon-clear.mui-hidden~.mui-icon-speech{display:inline-block}.mui-input-row .mui-icon-speech~.mui-placeholder{right:38px}.mui-input-row.mui-search .mui-icon-clear{top:7px}.mui-input-row.mui-search .mui-icon-speech{top:5px}.mui-checkbox,.mui-radio{position:relative}.mui-checkbox label,.mui-radio label{display:inline-block;float:none;width:100%;padding-right:58px}.mui-checkbox.mui-left input[type=checkbox],.mui-radio.mui-left input[type=radio]{left:20px}.mui-checkbox.mui-left label,.mui-radio.mui-left label{padding-right:15px;padding-left:58px}.mui-checkbox input[type=checkbox],.mui-radio input[type=radio]{position:absolute;top:4px;right:20px;display:inline-block;width:28px;height:26px;border:0;outline:0!important;background-color:transparent;-webkit-appearance:none}.mui-checkbox input[type=checkbox][disabled]:before,.mui-radio input[type=radio][disabled]:before{opacity:.3}.mui-checkbox input[type=checkbox]:before,.mui-radio input[type=radio]:before{font-family:Muiicons;font-size:28px;font-weight:400;line-height:1;text-decoration:none;color:#aaa;border-radius:0;background:0 0;-webkit-font-smoothing:antialiased}.mui-checkbox input[type=checkbox]:checked:before,.mui-radio input[type=radio]:checked:before{color:#007aff}.mui-checkbox label.mui-disabled,.mui-checkbox.mui-disabled label,.mui-radio label.mui-disabled,.mui-radio.mui-disabled label{opacity:.4}.mui-radio input[type=radio]:before{content:'\e411'}.mui-radio input[type=radio]:checked:before{content:'\e441'}.mui-checkbox input[type=checkbox]:before{content:'\e411'}.mui-checkbox input[type=checkbox]:checked:before{content:'\e442'}.mui-select{position:relative}.mui-select:before{font-family:Muiicons;position:absolute;top:8px;right:21px;content:'\e581';color:rgba(170,170,170,.6)}.mui-input-row .mui-switch{float:right;margin-top:5px;margin-right:20px}.mui-input-range input[type=range]{position:relative;width:100%;height:2px;margin:17px 0;padding:0;cursor:pointer;border:0;border-radius:3px;outline:0;background-color:#999;-webkit-appearance:none!important}.mui-input-range input[type=range]::-webkit-slider-thumb{width:28px;height:28px;border-color:#0062cc;border-radius:50%;background-color:#007aff;background-clip:padding-box;-webkit-appearance:none!important}.mui-input-range label~input[type=range]{width:65%}.mui-input-range .mui-tooltip{font-size:36px;line-height:64px;position:absolute;z-index:1;top:-70px;width:64px;height:64px;text-align:center;opacity:.8;color:#333;border:1px solid #ddd;border-radius:6px;background-color:#fff;text-shadow:0 1px 0 #f3f3f3}.mui-search{position:relative}.mui-search input[type=search]{padding-left:30px}.mui-search .mui-placeholder{font-size:16px;line-height:34px;position:absolute;z-index:1;top:0;right:0;bottom:0;left:0;display:inline-block;height:34px;text-align:center;color:#999;border:0;border-radius:6px;background:0 0}.mui-search .mui-placeholder .mui-icon{font-size:20px;color:#333}.mui-search:before{font-family:Muiicons;font-size:20px;font-weight:400;position:absolute;top:50%;right:50%;display:none;margin-top:-18px;margin-right:31px;content:'\e466'}.mui-search.mui-active:before{font-size:20px;right:auto;left:5px;display:block;margin-right:0}.mui-search.mui-active input[type=search]{text-align:left}.mui-search.mui-active .mui-placeholder{display:none}.mui-segmented-control{font-size:15px;font-weight:400;position:relative;display:table;overflow:hidden;width:100%;table-layout:fixed;border:1px solid #007aff;border-radius:3px;background-color:transparent;-webkit-touch-callout:none}.mui-segmented-control.mui-segmented-control-vertical{border-collapse:collapse;border-width:0;border-radius:0}.mui-segmented-control.mui-segmented-control-vertical .mui-control-item{display:block;border-bottom:1px solid #c8c7cc;border-left-width:0}.mui-segmented-control.mui-scroll-wrapper{height:38px}.mui-segmented-control.mui-scroll-wrapper .mui-scroll{width:auto;height:40px;white-space:nowrap}.mui-segmented-control.mui-scroll-wrapper .mui-control-item{display:inline-block;width:auto;padding:0 20px;border:0}.mui-segmented-control .mui-control-item{line-height:38px;display:table-cell;overflow:hidden;width:1%;-webkit-transition:background-color .1s linear;transition:background-color .1s linear;text-align:center;white-space:nowrap;text-overflow:ellipsis;color:#007aff;border-color:#007aff;border-left:1px solid #007aff}.mui-segmented-control .mui-control-item:first-child{border-left-width:0}.mui-segmented-control .mui-control-item.mui-active{color:#fff;background-color:#007aff}.mui-segmented-control.mui-segmented-control-inverted{width:100%;border:0;border-radius:0}.mui-segmented-control.mui-segmented-control-inverted.mui-segmented-control-vertical .mui-control-item,.mui-segmented-control.mui-segmented-control-inverted.mui-segmented-control-vertical .mui-control-item.mui-active{border-bottom:1px solid #c8c7cc}.mui-segmented-control.mui-segmented-control-inverted .mui-control-item{color:inherit;border:0}.mui-segmented-control.mui-segmented-control-inverted .mui-control-item.mui-active{color:#007aff;border-bottom:2px solid #007aff;background:0 0}.mui-segmented-control.mui-segmented-control-inverted~.mui-slider-progress-bar{background-color:#007aff}.mui-segmented-control-positive{border:1px solid #4cd964}.mui-segmented-control-positive .mui-control-item{color:#4cd964;border-color:inherit}.mui-segmented-control-positive .mui-control-item.mui-active{color:#fff;background-color:#4cd964}.mui-segmented-control-positive.mui-segmented-control-inverted .mui-control-item.mui-active{color:#4cd964;border-bottom:2px solid #4cd964;background:0 0}.mui-segmented-control-positive.mui-segmented-control-inverted~.mui-slider-progress-bar{background-color:#4cd964}.mui-segmented-control-negative{border:1px solid #dd524d}.mui-segmented-control-negative .mui-control-item{color:#dd524d;border-color:inherit}.mui-segmented-control-negative .mui-control-item.mui-active{color:#fff;background-color:#dd524d}.mui-segmented-control-negative.mui-segmented-control-inverted .mui-control-item.mui-active{color:#dd524d;border-bottom:2px solid #dd524d;background:0 0}.mui-segmented-control-negative.mui-segmented-control-inverted~.mui-slider-progress-bar{background-color:#dd524d}.mui-control-content{position:relative;display:none}.mui-control-content.mui-active{display:block}.mui-popover{position:absolute;z-index:999;display:none;width:280px;-webkit-transition:opacity .3s;transition:opacity .3s;-webkit-transition-property:opacity;transition-property:opacity;-webkit-transform:none;transform:none;opacity:0;border-radius:7px;background-color:#f7f7f7;-webkit-box-shadow:0 0 15px rgba(0,0,0,.1);box-shadow:0 0 15px rgba(0,0,0,.1)}.mui-popover .mui-popover-arrow{position:absolute;z-index:1000;top:-25px;left:0;overflow:hidden;width:26px;height:26px}.mui-popover .mui-popover-arrow:after{position:absolute;top:19px;left:0;width:26px;height:26px;content:' ';-webkit-transform:rotate(45deg);transform:rotate(45deg);border-radius:3px;background:#f7f7f7}.mui-popover .mui-popover-arrow.mui-bottom{top:100%;left:-26px;margin-top:-1px}.mui-popover .mui-popover-arrow.mui-bottom:after{top:-19px;left:0}.mui-popover.mui-popover-action{bottom:0;width:100%;-webkit-transition:-webkit-transform .3s,opacity .3s;transition:transform .3s,opacity .3s;-webkit-transform:translate3d(0,100%,0);transform:translate3d(0,100%,0);border-radius:0;background:0 0;-webkit-box-shadow:none;box-shadow:none}.mui-popover.mui-popover-action .mui-popover-arrow{display:none}.mui-popover.mui-popover-action.mui-popover-bottom{position:fixed}.mui-popover.mui-popover-action.mui-active{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}.mui-popover.mui-popover-action .mui-table-view{margin:8px;text-align:center;color:#007aff;border-radius:4px}.mui-popover.mui-popover-action .mui-table-view .mui-table-view-cell:after{position:absolute;right:0;bottom:0;left:0;height:1px;content:'';-webkit-transform:scaleY(.5);transform:scaleY(.5);background-color:#c8c7cc}.mui-popover.mui-popover-action .mui-table-view small{font-weight:400;line-height:1.3;display:block}.mui-popover.mui-active{display:block;opacity:1}.mui-popover .mui-bar~.mui-table-view{padding-top:44px}.mui-backdrop{position:fixed;z-index:998;top:0;right:0;bottom:0;left:0;background-color:rgba(0,0,0,.3)}.mui-bar-backdrop.mui-backdrop{bottom:50px;background:0 0}.mui-backdrop-action.mui-backdrop{background-color:rgba(0,0,0,.3)}.mui-backdrop-action.mui-backdrop,.mui-bar-backdrop.mui-backdrop{opacity:0}.mui-backdrop-action.mui-backdrop.mui-active,.mui-bar-backdrop.mui-backdrop.mui-active{-webkit-transition:all .4s ease;transition:all .4s ease;opacity:1}.mui-popover .mui-btn-block{margin-bottom:5px}.mui-popover .mui-btn-block:last-child{margin-bottom:0}.mui-popover .mui-bar{-webkit-box-shadow:none;box-shadow:none}.mui-popover .mui-bar-nav{border-bottom:1px solid rgba(0,0,0,.15);border-top-left-radius:12px;border-top-right-radius:12px;-webkit-box-shadow:none;box-shadow:none}.mui-popover .mui-scroll-wrapper{margin:7px 0;border-radius:7px;background-clip:padding-box}.mui-popover .mui-scroll .mui-table-view{max-height:none}.mui-popover .mui-table-view{overflow:auto;max-height:300px;margin-bottom:0;border-radius:7px;background-color:#f7f7f7;background-image:none;-webkit-overflow-scrolling:touch}.mui-popover .mui-table-view:after,.mui-popover .mui-table-view:before{height:0}.mui-popover .mui-table-view .mui-table-view-cell:first-child,.mui-popover .mui-table-view .mui-table-view-cell:first-child>a:not(.mui-btn){border-top-left-radius:12px;border-top-right-radius:12px}.mui-popover .mui-table-view .mui-table-view-cell:last-child,.mui-popover .mui-table-view .mui-table-view-cell:last-child>a:not(.mui-btn){border-bottom-right-radius:12px;border-bottom-left-radius:12px}.mui-popover.mui-bar-popover .mui-table-view{width:106px}.mui-popover.mui-bar-popover .mui-table-view .mui-table-view-cell{padding:11px 15px;background-position:0 100%}.mui-popover.mui-bar-popover .mui-table-view .mui-table-view-cell>a:not(.mui-btn){margin:-11px -15px -11px -15px}.mui-popup-backdrop{position:fixed;z-index:998;top:0;right:0;bottom:0;left:0;-webkit-transition-duration:400ms;transition-duration:400ms;opacity:0;background:rgba(0,0,0,.4)}.mui-popup-backdrop.mui-active{opacity:1}.mui-popup{position:fixed;z-index:10000;top:50%;left:50%;display:none;overflow:hidden;width:270px;-webkit-transition-property:-webkit-transform,opacity;transition-property:transform,opacity;-webkit-transform:translate3d(-50%,-50%,0) scale(1.185);transform:translate3d(-50%,-50%,0) scale(1.185);text-align:center;opacity:0;color:#000;border-radius:13px}.mui-popup.mui-popup-in{display:block;-webkit-transition-duration:400ms;transition-duration:400ms;-webkit-transform:translate3d(-50%,-50%,0) scale(1);transform:translate3d(-50%,-50%,0) scale(1);opacity:1}.mui-popup.mui-popup-out{-webkit-transition-duration:400ms;transition-duration:400ms;-webkit-transform:translate3d(-50%,-50%,0) scale(1);transform:translate3d(-50%,-50%,0) scale(1);opacity:0}.mui-popup-inner{position:relative;padding:15px;border-radius:13px 13px 0 0;background:rgba(255,255,255,.95)}.mui-popup-inner:after{position:absolute;z-index:15;top:auto;right:auto;bottom:0;left:0;display:block;width:100%;height:1px;content:'';-webkit-transform:scaleY(.5);transform:scaleY(.5);-webkit-transform-origin:50% 100%;transform-origin:50% 100%;background-color:rgba(0,0,0,.2)}.mui-popup-title{font-size:18px;font-weight:500;text-align:center}.mui-popup-title+.mui-popup-text{font-family:inherit;font-size:14px;margin:5px 0 0}.mui-popup-buttons{position:relative;display:-webkit-box;display:-webkit-flex;display:flex;height:44px;-webkit-box-pack:center;-webkit-justify-content:center;justify-content:center}.mui-popup-button{font-size:17px;line-height:44px;position:relative;display:block;overflow:hidden;box-sizing:border-box;width:100%;height:44px;padding:0 5px;cursor:pointer;text-align:center;white-space:nowrap;text-overflow:ellipsis;color:#007aff;background:rgba(255,255,255,.95);-webkit-box-flex:1}.mui-popup-button:after{position:absolute;z-index:15;top:0;right:0;bottom:auto;left:auto;display:block;width:1px;height:100%;content:'';-webkit-transform:scaleX(.5);transform:scaleX(.5);-webkit-transform-origin:100% 50%;transform-origin:100% 50%;background-color:rgba(0,0,0,.2)}.mui-popup-button:first-child{border-radius:0 0 0 13px}.mui-popup-button:first-child:last-child{border-radius:0 0 13px 13px}.mui-popup-button:last-child{border-radius:0 0 13px}.mui-popup-button:last-child:after{display:none}.mui-popup-button.mui-popup-button-bold{font-weight:600}.mui-popup-input input{font-size:14px;width:100%;height:26px;margin:15px 0 0;padding:0 5px;border:1px solid rgba(0,0,0,.3);border-radius:0;background:#fff}.mui-plus.mui-android .mui-popup-backdrop{-webkit-transition-duration:1ms;transition-duration:1ms}.mui-plus.mui-android .mui-popup{-webkit-transition-duration:1ms;transition-duration:1ms;-webkit-transform:translate3d(-50%,-50%,0) scale(1);transform:translate3d(-50%,-50%,0) scale(1)}.mui-progressbar{position:relative;display:block;overflow:hidden;width:100%;height:2px;-webkit-transform-origin:center top;transform-origin:center top;vertical-align:middle;border-radius:2px;background:#b6b6b6;-webkit-transform-style:preserve-3d;transform-style:preserve-3d}.mui-progressbar span{position:absolute;top:0;left:0;width:100%;height:100%;-webkit-transition:150ms;transition:150ms;-webkit-transform:translate3d(-100%,0,0);transform:translate3d(-100%,0,0);background:#007aff}.mui-progressbar.mui-progressbar-infinite:before{position:absolute;top:0;left:0;width:100%;height:100%;content:'';-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0);-webkit-transform-origin:left center;transform-origin:left center;-webkit-animation:mui-progressbar-infinite 1s linear infinite;animation:mui-progressbar-infinite 1s linear infinite;background:#007aff}body>.mui-progressbar{position:absolute;z-index:10000;top:44px;left:0;border-radius:0}.mui-progressbar-in{-webkit-animation:mui-progressbar-in 300ms forwards;animation:mui-progressbar-in 300ms forwards}.mui-progressbar-out{-webkit-animation:mui-progressbar-out 300ms forwards;animation:mui-progressbar-out 300ms forwards}@-webkit-keyframes mui-progressbar-in{from{-webkit-transform:scaleY(0);opacity:0}to{-webkit-transform:scaleY(1);opacity:1}}@keyframes mui-progressbar-in{from{transform:scaleY(0);opacity:0}to{transform:scaleY(1);opacity:1}}@-webkit-keyframes mui-progressbar-out{from{-webkit-transform:scaleY(1);opacity:1}to{-webkit-transform:scaleY(0);opacity:0}}@keyframes mui-progressbar-out{from{transform:scaleY(1);opacity:1}to{transform:scaleY(0);opacity:0}}@-webkit-keyframes mui-progressbar-infinite{0%{-webkit-transform:translate3d(-50%,0,0) scaleX(.5)}100%{-webkit-transform:translate3d(100%,0,0) scaleX(.5)}}@keyframes mui-progressbar-infinite{0%{transform:translate3d(-50%,0,0) scaleX(.5)}100%{transform:translate3d(100%,0,0) scaleX(.5)}}.mui-pagination{display:inline-block;margin:0 auto;padding-left:0;border-radius:6px}.mui-pagination>li{display:inline}.mui-pagination>li>a,.mui-pagination>li>span{line-height:1.428571429;position:relative;float:left;margin-left:-1px;padding:6px 12px;text-decoration:none;color:#007aff;border:1px solid #ddd;background-color:#fff}.mui-pagination>li:first-child>a,.mui-pagination>li:first-child>span{margin-left:0;border-top-left-radius:6px;border-bottom-left-radius:6px;background-clip:padding-box}.mui-pagination>li:last-child>a,.mui-pagination>li:last-child>span{border-top-right-radius:6px;border-bottom-right-radius:6px;background-clip:padding-box}.mui-pagination>li.mui-active>a,.mui-pagination>li.mui-active>a:active,.mui-pagination>li.mui-active>span,.mui-pagination>li.mui-active>span:active,.mui-pagination>li:active>a,.mui-pagination>li:active>a:active,.mui-pagination>li:active>span,.mui-pagination>li:active>span:active{z-index:2;cursor:default;color:#fff;border-color:#007aff;background-color:#007aff}.mui-pagination>li.mui-disabled>a,.mui-pagination>li.mui-disabled>a:active,.mui-pagination>li.mui-disabled>span,.mui-pagination>li.mui-disabled>span:active{opacity:.6;color:#777;border:1px solid #ddd;background-color:#fff}.mui-pagination-lg>li>a,.mui-pagination-lg>li>span{font-size:18px;padding:10px 16px}.mui-pagination-sm>li>a,.mui-pagination-sm>li>span{font-size:12px;padding:5px 10px}.mui-pager{padding-left:0;list-style:none;text-align:center}.mui-pager:after,.mui-pager:before{display:table;content:' '}.mui-pager:after{clear:both}.mui-pager li{display:inline}.mui-pager li>a,.mui-pager li>span{display:inline-block;padding:5px 14px;border:1px solid #ddd;border-radius:6px;background-color:#fff;background-clip:padding-box}.mui-pager li.mui-active>a,.mui-pager li.mui-active>span,.mui-pager li:active>a,.mui-pager li:active>span{cursor:default;text-decoration:none;color:#fff;border-color:#007aff;background-color:#007aff}.mui-pager .mui-next>a,.mui-pager .mui-next>span{float:right}.mui-pager .mui-previous>a,.mui-pager .mui-previous>span{float:left}.mui-pager .mui-disabled>a,.mui-pager .mui-disabled>a:active,.mui-pager .mui-disabled>span,.mui-pager .mui-disabled>span:active{opacity:.6;color:#777;border:1px solid #ddd;background-color:#fff}.mui-modal{position:fixed;z-index:999;top:0;overflow:hidden;width:100%;min-height:100%;-webkit-transition:-webkit-transform .25s,opacity 1ms .25s;transition:transform .25s,opacity 1ms .25s;-webkit-transition-timing-function:cubic-bezier(.1,.5,.1,1);transition-timing-function:cubic-bezier(.1,.5,.1,1);-webkit-transform:translate3d(0,100%,0);transform:translate3d(0,100%,0);opacity:0;background-color:#fff}.mui-modal.mui-active{height:100%;-webkit-transition:-webkit-transform .25s;transition:transform .25s;-webkit-transition-timing-function:cubic-bezier(.1,.5,.1,1);transition-timing-function:cubic-bezier(.1,.5,.1,1);-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0);opacity:1}.mui-android .mui-modal .mui-bar{position:static}.mui-android .mui-modal .mui-bar-nav~.mui-content{padding-top:0}.mui-slider{position:relative;z-index:1;overflow:hidden;width:100%}.mui-slider .mui-segmented-control.mui-segmented-control-inverted .mui-control-item.mui-active{border-bottom:0}.mui-slider .mui-segmented-control.mui-segmented-control-inverted~.mui-slider-group .mui-slider-item{border-top:1px solid #c8c7cc;border-bottom:1px solid #c8c7cc}.mui-slider .mui-slider-group{font-size:0;position:relative;-webkit-transition:all 0s linear;transition:all 0s linear;white-space:nowrap}.mui-slider .mui-slider-group .mui-slider-item{font-size:14px;position:relative;display:inline-block;width:100%;height:100%;vertical-align:top;white-space:normal}.mui-slider .mui-slider-group .mui-slider-item>a:not(.mui-control-item){line-height:0;position:relative;display:block}.mui-slider .mui-slider-group .mui-slider-item img{width:100%}.mui-slider .mui-slider-group .mui-slider-item .mui-table-view:after,.mui-slider .mui-slider-group .mui-slider-item .mui-table-view:before{height:0}.mui-slider .mui-slider-group.mui-slider-loop{-webkit-transform:translate(-100%,0);transform:translate(-100%,0)}.mui-slider-title{line-height:30px;position:absolute;bottom:0;left:0;width:100%;height:30px;margin:0;text-align:left;text-indent:12px;opacity:.8;background-color:#000}.mui-slider-indicator{position:absolute;bottom:8px;width:100%;text-align:center;background:0 0}.mui-slider-indicator.mui-segmented-control{position:relative;bottom:auto}.mui-slider-indicator .mui-indicator{display:inline-block;width:6px;height:6px;margin:1px 6px;cursor:pointer;border-radius:50%;background:#aaa;-webkit-box-shadow:0 0 1px 1px rgba(130,130,130,.7);box-shadow:0 0 1px 1px rgba(130,130,130,.7)}.mui-slider-indicator .mui-active.mui-indicator{background:#fff}.mui-slider-indicator .mui-icon{font-size:20px;line-height:30px;width:40px;height:30px;margin:3px;text-align:center;border:1px solid #ddd}.mui-slider-indicator .mui-number{line-height:32px;display:inline-block;width:58px}.mui-slider-indicator .mui-number span{color:#ff5053}.mui-slider-progress-bar{z-index:1;height:2px;-webkit-transform:translateZ(0);transform:translateZ(0)}.mui-switch{position:relative;display:block;width:74px;height:30px;-webkit-transition-timing-function:ease-in-out;transition-timing-function:ease-in-out;-webkit-transition-duration:.2s;transition-duration:.2s;-webkit-transition-property:background-color,border;transition-property:background-color,border;border:2px solid #ddd;border-radius:20px;background-color:#fff;background-clip:padding-box}.mui-switch.mui-disabled{opacity:.3}.mui-switch .mui-switch-handle{position:absolute;z-index:1;top:-1px;left:-1px;width:28px;height:28px;-webkit-transition:.2s ease-in-out;transition:.2s ease-in-out;-webkit-transition-property:-webkit-transform,width,left;transition-property:transform,width,left;border-radius:16px;background-color:#fff;background-clip:padding-box;-webkit-box-shadow:0 2px 5px rgba(0,0,0,.4);box-shadow:0 2px 5px rgba(0,0,0,.4)}.mui-switch:before{font-size:13px;position:absolute;top:3px;right:11px;content:'Off';text-transform:uppercase;color:#999}.mui-switch.mui-dragging{border-color:#f7f7f7;background-color:#f7f7f7}.mui-switch.mui-dragging .mui-switch-handle{width:38px}.mui-switch.mui-dragging.mui-active .mui-switch-handle{left:-11px;width:38px}.mui-switch.mui-active{border-color:#4cd964;background-color:#4cd964}.mui-switch.mui-active .mui-switch-handle{-webkit-transform:translate(43px,0);transform:translate(43px,0)}.mui-switch.mui-active:before{right:auto;left:15px;content:'On';color:#fff}.mui-switch input[type=checkbox]{display:none}.mui-switch-mini{width:47px}.mui-switch-mini:before{display:none}.mui-switch-mini.mui-active .mui-switch-handle{-webkit-transform:translate(16px,0);transform:translate(16px,0)}.mui-switch-blue.mui-active{border:2px solid #007aff;background-color:#007aff}.mui-content.mui-fade{left:0;opacity:0}.mui-content.mui-fade.mui-in{opacity:1}.mui-content.mui-sliding{z-index:2;-webkit-transition:-webkit-transform .4s;transition:transform .4s;-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}.mui-content.mui-sliding.mui-left{z-index:1;-webkit-transform:translate3d(-100%,0,0);transform:translate3d(-100%,0,0)}.mui-content.mui-sliding.mui-right{z-index:3;-webkit-transform:translate3d(100%,0,0);transform:translate3d(100%,0,0)}.mui-navigate-right:after,.mui-push-left:after,.mui-push-right:after{font-family:Muiicons;font-size:inherit;line-height:1;position:absolute;top:50%;display:inline-block;-webkit-transform:translateY(-50%);transform:translateY(-50%);text-decoration:none;color:#bbb;-webkit-font-smoothing:antialiased}.mui-push-left:after{left:15px;content:'\e582'}.mui-navigate-right:after,.mui-push-right:after{right:15px;content:'\e583'}.mui-pull-bottom-pocket,.mui-pull-top-pocket{position:absolute;left:0;display:block;visibility:hidden;overflow:hidden;width:100%;height:50px}.mui-plus-pullrefresh .mui-pull-bottom-pocket,.mui-plus-pullrefresh .mui-pull-top-pocket{display:none;visibility:visible}.mui-pull-top-pocket{top:0}.mui-bar-nav~.mui-content .mui-pull-top-pocket{top:44px}.mui-bar-nav~.mui-bar-header-secondary~.mui-content .mui-pull-top-pocket{top:88px}.mui-pull-bottom-pocket{position:relative;bottom:0;height:40px}.mui-pull-bottom-pocket .mui-pull-loading{visibility:hidden}.mui-pull-bottom-pocket .mui-pull-loading.mui-in{display:inline-block}.mui-pull{font-weight:700;position:absolute;right:0;bottom:10px;left:0;text-align:center;color:#777}.mui-pull-loading{margin-right:10px;-webkit-transition:-webkit-transform .4s;transition:transform .4s;-webkit-transition-duration:400ms;transition-duration:400ms;vertical-align:middle}.mui-pull-loading.mui-reverse{-webkit-transform:rotate(180deg) translateZ(0);transform:rotate(180deg) translateZ(0)}.mui-pull-caption{font-size:15px;line-height:24px;position:relative;display:inline-block;overflow:visible;margin-top:0;vertical-align:middle}.mui-pull-caption span{display:none}.mui-pull-caption span.mui-in{display:inline}.mui-toast-container{position:fixed;z-index:9999;bottom:50px;width:100%;-webkit-transition:opacity .8s;transition:opacity .8s;opacity:0}.mui-toast-container.mui-active{opacity:1}.mui-toast-message{font-size:14px;width:270px;margin:5px auto;padding:5px;text-align:center;color:#000;border-radius:7px;background-color:#d8d8d8}.mui-numbox{position:relative;display:inline-block;overflow:hidden;width:120px;height:35px;padding:0 40px;vertical-align:top;vertical-align:middle;border:solid 1px #bbb;border-radius:3px;background-color:#efeff4}.mui-numbox [class*=btn-numbox],.mui-numbox [class*=numbox-btn]{font-size:18px;font-weight:400;line-height:100%;position:absolute;top:0;overflow:hidden;width:40px;height:100%;padding:0;color:#555;border:none;border-radius:0;background-color:#f9f9f9}.mui-numbox [class*=btn-numbox]:active,.mui-numbox [class*=numbox-btn]:active{background-color:#ccc}.mui-numbox [class*=btn-numbox][disabled],.mui-numbox [class*=numbox-btn][disabled]{color:silver}.mui-numbox .mui-btn-numbox-plus,.mui-numbox .mui-numbox-btn-plus{right:0;border-top-right-radius:3px;border-bottom-right-radius:3px}.mui-numbox .mui-btn-numbox-minus,.mui-numbox .mui-numbox-btn-minus{left:0;border-top-left-radius:3px;border-bottom-left-radius:3px}.mui-numbox .mui-input-numbox,.mui-numbox .mui-numbox-input{display:inline-block;overflow:hidden;width:100%!important;height:100%;margin:0;padding:0 3px!important;text-align:center;text-overflow:ellipsis;word-break:normal;border:none!important;border-right:solid 1px #ccc!important;border-left:solid 1px #ccc!important;border-radius:0!important}.mui-input-row .mui-numbox{float:right;margin:2px 8px}@font-face{font-family:Muiicons;font-weight:400;font-style:normal;src:url(../fonts/mui.ttf) format('truetype')}.mui-icon{font-family:Muiicons;font-size:24px;font-weight:400;font-style:normal;line-height:1;display:inline-block;text-decoration:none;-webkit-font-smoothing:antialiased}.mui-icon.mui-active{color:#007aff}.mui-icon.mui-right:before{float:right;padding-left:.2em}.mui-icon-contact:before{content:'\e100'}.mui-icon-person:before{content:'\e101'}.mui-icon-personadd:before{content:'\e102'}.mui-icon-contact-filled:before{content:'\e130'}.mui-icon-person-filled:before{content:'\e131'}.mui-icon-personadd-filled:before{content:'\e132'}.mui-icon-phone:before{content:'\e200'}.mui-icon-email:before{content:'\e201'}.mui-icon-chatbubble:before{content:'\e202'}.mui-icon-chatboxes:before{content:'\e203'}.mui-icon-phone-filled:before{content:'\e230'}.mui-icon-email-filled:before{content:'\e231'}.mui-icon-chatbubble-filled:before{content:'\e232'}.mui-icon-chatboxes-filled:before{content:'\e233'}.mui-icon-weibo:before{content:'\e260'}.mui-icon-weixin:before{content:'\e261'}.mui-icon-pengyouquan:before{content:'\e262'}.mui-icon-chat:before{content:'\e263'}.mui-icon-qq:before{content:'\e264'}.mui-icon-videocam:before{content:'\e300'}.mui-icon-camera:before{content:'\e301'}.mui-icon-mic:before{content:'\e302'}.mui-icon-location:before{content:'\e303'}.mui-icon-mic-filled:before,.mui-icon-speech:before{content:'\e332'}.mui-icon-location-filled:before{content:'\e333'}.mui-icon-micoff:before{content:'\e360'}.mui-icon-image:before{content:'\e363'}.mui-icon-map:before{content:'\e364'}.mui-icon-compose:before{content:'\e400'}.mui-icon-trash:before{content:'\e401'}.mui-icon-upload:before{content:'\e402'}.mui-icon-download:before{content:'\e403'}.mui-icon-close:before{content:'\e404'}.mui-icon-redo:before{content:'\e405'}.mui-icon-undo:before{content:'\e406'}.mui-icon-refresh:before{content:'\e407'}.mui-icon-star:before{content:'\e408'}.mui-icon-plus:before{content:'\e409'}.mui-icon-minus:before{content:'\e410'}.mui-icon-checkbox:before,.mui-icon-circle:before{content:'\e411'}.mui-icon-clear:before,.mui-icon-close-filled:before{content:'\e434'}.mui-icon-refresh-filled:before{content:'\e437'}.mui-icon-star-filled:before{content:'\e438'}.mui-icon-plus-filled:before{content:'\e439'}.mui-icon-minus-filled:before{content:'\e440'}.mui-icon-circle-filled:before{content:'\e441'}.mui-icon-checkbox-filled:before{content:'\e442'}.mui-icon-closeempty:before{content:'\e460'}.mui-icon-refreshempty:before{content:'\e461'}.mui-icon-reload:before{content:'\e462'}.mui-icon-starhalf:before{content:'\e463'}.mui-icon-spinner:before{content:'\e464'}.mui-icon-spinner-cycle:before{content:'\e465'}.mui-icon-search:before{content:'\e466'}.mui-icon-plusempty:before{content:'\e468'}.mui-icon-forward:before{content:'\e470'}.mui-icon-back:before,.mui-icon-left-nav:before{content:'\e471'}.mui-icon-checkmarkempty:before{content:'\e472'}.mui-icon-home:before{content:'\e500'}.mui-icon-navigate:before{content:'\e501'}.mui-icon-gear:before{content:'\e502'}.mui-icon-paperplane:before{content:'\e503'}.mui-icon-info:before{content:'\e504'}.mui-icon-help:before{content:'\e505'}.mui-icon-locked:before{content:'\e506'}.mui-icon-more:before{content:'\e507'}.mui-icon-flag:before{content:'\e508'}.mui-icon-home-filled:before{content:'\e530'}.mui-icon-gear-filled:before{content:'\e532'}.mui-icon-info-filled:before{content:'\e534'}.mui-icon-help-filled:before{content:'\e535'}.mui-icon-more-filled:before{content:'\e537'}.mui-icon-settings:before{content:'\e560'}.mui-icon-list:before{content:'\e562'}.mui-icon-bars:before{content:'\e563'}.mui-icon-loop:before{content:'\e565'}.mui-icon-paperclip:before{content:'\e567'}.mui-icon-eye:before{content:'\e568'}.mui-icon-arrowup:before{content:'\e580'}.mui-icon-arrowdown:before{content:'\e581'}.mui-icon-arrowleft:before{content:'\e582'}.mui-icon-arrowright:before{content:'\e583'}.mui-icon-arrowthinup:before{content:'\e584'}.mui-icon-arrowthindown:before{content:'\e585'}.mui-icon-arrowthinleft:before{content:'\e586'}.mui-icon-arrowthinright:before{content:'\e587'}.mui-icon-pulldown:before{content:'\e588'}.mui-fullscreen{position:absolute;top:0;right:0;bottom:0;left:0}.mui-fullscreen.mui-slider .mui-slider-group{height:100%}.mui-fullscreen .mui-segmented-control~.mui-slider-group{position:absolute;top:40px;bottom:0;width:100%;height:auto}.mui-fullscreen.mui-slider .mui-slider-item>a{top:50%;-webkit-transform:translateY(-50%);transform:translateY(-50%)}.mui-fullscreen .mui-off-canvas-wrap .mui-slider-item>a{top:auto;-webkit-transform:none;transform:none}.mui-bar-nav~.mui-content .mui-slider.mui-fullscreen{top:44px}.mui-bar-tab~.mui-content .mui-slider.mui-fullscreen .mui-segmented-control~.mui-slider-group{bottom:50px}.mui-android.mui-android-4-0 input:focus,.mui-android.mui-android-4-0 textarea:focus{-webkit-user-modify:inherit}.mui-android.mui-android-4-2 input,.mui-android.mui-android-4-2 textarea,.mui-android.mui-android-4-3 input,.mui-android.mui-android-4-3 textarea{-webkit-user-select:text}.mui-ios .mui-table-view-cell{-webkit-transform-style:preserve-3d;transform-style:preserve-3d}.mui-plus-visible,.mui-wechat-visible{display:none!important}.mui-plus-hidden,.mui-wechat-hidden{display:block!important}.mui-tab-item.mui-plus-hidden,.mui-tab-item.mui-wechat-hidden{display:table-cell!important}.mui-plus .mui-plus-visible,.mui-wechat .mui-wechat-visible{display:block!important}.mui-plus .mui-tab-item.mui-plus-visible,.mui-wechat .mui-tab-item.mui-wechat-visible{display:table-cell!important}.mui-plus .mui-plus-hidden,.mui-wechat .mui-wechat-hidden{display:none!important}.mui-plus.mui-statusbar.mui-statusbar-offset .mui-bar-nav{height:64px;padding-top:20px}.mui-plus.mui-statusbar.mui-statusbar-offset .mui-bar-nav~.mui-content{padding-top:64px}.mui-plus.mui-statusbar.mui-statusbar-offset .mui-bar-header-secondary,.mui-plus.mui-statusbar.mui-statusbar-offset .mui-bar-nav~.mui-content .mui-pull-top-pocket{top:64px}.mui-plus.mui-statusbar.mui-statusbar-offset .mui-bar-header-secondary~.mui-content{padding-top:94px}.mui-iframe-wrapper{position:absolute;right:0;left:0;-webkit-overflow-scrolling:touch}.mui-iframe-wrapper iframe{width:100%;height:100%;border:0} -------------------------------------------------------------------------------- /css/style.css: -------------------------------------------------------------------------------- 1 | .ui-page-login, 2 | body { 3 | width: 100%; 4 | height: 100%; 5 | margin: 0px; 6 | padding: 0px; 7 | } 8 | .mui-content{height: 100%;} 9 | -------------------------------------------------------------------------------- /fonts/mui.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/palxiao/game/85335218087d04572ca6adfd3ae7918c38347532/fonts/mui.ttf -------------------------------------------------------------------------------- /game/actor.js: -------------------------------------------------------------------------------- 1 | var actor = function(){ 2 | this.x; 3 | this.y; 4 | this.body;//体型 5 | this.actorSkin = []; 6 | this.angle; 7 | this.bodyTimer = 0; 8 | this.bodyCount = 8; 9 | } 10 | actor.prototype.init = function(){ 11 | this.body = 30;//初始化体型大小 12 | this.angle = 0; 13 | this.x = wWidth*0.5; 14 | this.y = wHeight; 15 | for(var i=0; i<10; i++){ 16 | this.actorSkin[i] = new Image(); 17 | this.actorSkin[i].src = 'images/starfish-middle'+i+'.png'; 18 | } 19 | } 20 | actor.prototype.draw = function(){ 21 | this.x = lerpDistance(mx, this.x, 0.97); 22 | this.y = lerpDistance(my, this.y, 0.97); 23 | 24 | var xDvalue = mx - this.x; 25 | var yDvalue = my - this.y; 26 | var beta = Math.atan2(yDvalue, xDvalue) + Math.PI//正切 27 | this.angle = lerpAngle(beta, this.angle, 0.7); 28 | 29 | //升级动画 30 | this.bodyTimer += subTime; 31 | if(this.bodyTimer > 100){ 32 | this.bodyCount = this.bodyCount + 1 ; 33 | this.bodyTimer = 0 ; 34 | if(this.bodyCount > 9){ 35 | this.bodyCount = 9 ; 36 | } 37 | } 38 | 39 | ctx2.save(); 40 | ctx2.translate(this.x, this.y); 41 | ctx2.rotate(this.angle - Math.PI/2); 42 | ctx2.drawImage(this.actorSkin[this.bodyCount], -this.actorSkin[this.bodyCount].width * 0.5, -this.actorSkin[this.bodyCount].height * 0.5, this.body, this.body); 43 | ctx2.restore(); 44 | } 45 | actor.prototype.bigger = function(score){ 46 | if(this.body < 80) { 47 | this.body += score; 48 | data.death += 1; 49 | } else{ 50 | gameWin() 51 | } 52 | } 53 | actor.prototype.upgrade = function(){ 54 | this.bodyCount = 0; 55 | } 56 | -------------------------------------------------------------------------------- /game/crash.js: -------------------------------------------------------------------------------- 1 | function enemyCarsh() { 2 | for(var i = 0; i < enemy.num; i++) { 3 | if(enemy.isAttack[i] && gameStatus == false) { 4 | var l = calLength(enemy.x[i], enemy.y[i], actor.x, actor.y); 5 | if(l < 900) { 6 | if(enemy.type[i] == 'small') { 7 | wave.born(enemy.x[i], enemy.y[i], 50); 8 | enemy.dead(i); 9 | actor.bigger(0.3 * difficulty); 10 | } else if(enemy.type[i] == 'middle') { 11 | if(actor.body >= 40) { 12 | wave.born(enemy.x[i], enemy.y[i], 100); 13 | enemy.dead(i); 14 | actor.bigger(0.6 * difficulty); 15 | } else { 16 | gameOver(); 17 | } 18 | } else if(enemy.type[i] == 'large') { 19 | if(actor.body >= 50) { 20 | wave.born(enemy.x[i], enemy.y[i], 120); 21 | enemy.dead(i); 22 | actor.bigger(0.8 * difficulty); 23 | } else { 24 | gameOver(); 25 | } 26 | } else if(enemy.type[i] == 'boss') { 27 | if(actor.body >= 65) { 28 | wave.born(enemy.x[i], enemy.y[i], 140); 29 | enemy.dead(i); 30 | actor.bigger(1 * difficulty); 31 | } else { 32 | gameOver(); 33 | } 34 | } 35 | } 36 | } 37 | } 38 | } 39 | -------------------------------------------------------------------------------- /game/data.js: -------------------------------------------------------------------------------- 1 | var data = function() { 2 | this.death = 0 3 | this.level = 1 4 | this.show = '' 5 | } 6 | data.prototype.init = function() { 7 | var proh = wHeight - 20 * 2 + 2 8 | $('#data').attr('style', 'top:' + proh + 'px;padding-left: 80px;'); 9 | } 10 | data.prototype.draw = function() { 11 | $('.progress-bar').attr('style', 'width: ' + (actor.body - 30) / 50 * 100 + '%;'); 12 | $('.progress-value').hide(); 13 | if(actor.body >= 40 && actor.body < 50) { //lv2 14 | this.level = 2 15 | $('.progress-bar').removeClass('progress-bar-info') 16 | $('.progress-bar').addClass('progress-bar-success') 17 | } else if(actor.body >= 50 && actor.body < 65) { //lv3 18 | this.level = 3 19 | $('.progress-bar').removeClass('progress-bar-success') 20 | $('.progress-bar').addClass('progress-bar-warning') 21 | } else if(actor.body >= 65) { //lv4 22 | this.level = '∞' 23 | $('.progress-bar').removeClass('progress-bar-warning') 24 | $('.progress-bar').addClass('progress-bar-danger') 25 | } 26 | if(actor.body >= 40 && actor.body < 4.7 || actor.body >= 50 && actor.body < 51 || actor.body >= 65 && actor.body < 66) { 27 | actor.upgrade(); 28 | $('.progress-value').show(); 29 | } 30 | if(difficulty == 1 && moshi == 'fast') { //特殊竞速模式 31 | if(countdown > 0) { 32 | this.show = '时间:' + countdown 33 | } else { 34 | this.show = '深海绝望' 35 | } 36 | } else { 37 | this.show = '等级:' + this.level 38 | } 39 | ctx1.save(); 40 | ctx1.font = "16px 微软雅黑"; 41 | ctx1.strokeStyle = 'rgba(255, 255, 255,0.98)'; 42 | ctx1.strokeText(this.show, 10, wHeight - 20); 43 | ctx1.restore(); 44 | } 45 | 46 | function gameOver() { 47 | wxShare(true); 48 | gameStatus = true; 49 | wx.ready(function() { 50 | wx.onMenuShareTimeline({ 51 | title: '我'+theTime+'秒内消灭了'+data.death+'只生物,称霸海洋...', // 分享标题 52 | link: 'http://palxp.com/game', // 分享链接 53 | imgUrl: 'http://palxp.com/game/images/starfish-middle0.png', // 分享图标 54 | success: function() { 55 | // 用户确认分享后执行的回调函数 56 | }, 57 | cancel: function() { 58 | // 用户取消分享后执行的回调函数 59 | } 60 | }); 61 | }) 62 | mui.confirm('\n总共耗时:' + theTime + ' 秒\n消灭:' + data.death + ' 只生物', '您被吞食了', ["主界面", "英雄不朽"], function(e) { 63 | if(e.index == 0) { 64 | mui.back(); 65 | } else location.reload() 66 | }); 67 | } 68 | 69 | function gameWin() { 70 | wxShare(true); 71 | gameStatus = true; 72 | mui.confirm('\n总共消灭:' + data.death + ' 只生物', '游戏胜利,称霸海洋', ["主界面", "再来一局"], function(e) { 73 | if(e.index == 0) { 74 | mui.back(); 75 | } else location.reload() 76 | }); 77 | } 78 | function wxShare(e){ 79 | if(e){ 80 | $('#wxShare').show(); 81 | } else{ 82 | $('#wxShare').hide(); 83 | } 84 | } 85 | -------------------------------------------------------------------------------- /game/effects.js: -------------------------------------------------------------------------------- 1 | var wave = function(){ 2 | this.x = [] 3 | this.y = [] 4 | this.exist = [] 5 | this.r = [] 6 | this.power = [] 7 | } 8 | wave.prototype.num = 12; 9 | wave.prototype.init = function(){ 10 | for (var i=0; ithis.power ){ 24 | this.exist[i] = false 25 | } 26 | var alpha = 1 - this.r[i] / this.power; 27 | ctx2.beginPath(); 28 | ctx2.arc(this.x[i], this.y[i], this.r[i], 0, Math.PI*2); 29 | ctx2.closePath(); 30 | ctx2.strokeStyle = 'rgba(255, 255, 255,'+alpha+')'; 31 | ctx2.stroke(); 32 | } 33 | } 34 | ctx2.restore(); 35 | } 36 | wave.prototype.born = function(x, y, power){ 37 | for (var i=0; i 0.2 && Math.random() < 0.35) { 34 | this.EStype[i] = 2 35 | } else if(Math.random() > 0.35 && Math.random() < 0.45) { 36 | this.EStype[i] = 3 37 | } else if(Math.random() > 0.45 && Math.random() < 0.6) { 38 | this.EStype[i] = 4 39 | } else if(Math.random() > 0.6 && Math.random() < 0.8) { 40 | this.EStype[i] = 5 41 | } else this.EStype[i] = 6 42 | } 43 | this.smallEnemy.src = 'images/enemy/blowfish-icon.png'; 44 | this.middleEnemy.src = 'images/enemy/octo-icon.png'; 45 | this.largeEnemy.src = 'images/enemy/crab-icon-middle.png'; 46 | this.boss.src = 'images/enemy/squid-icon-middle.png'; 47 | } 48 | enemy.prototype.draw = function() { 49 | ctx2.strokeRect(0, 0, wWidth, wHeight); 50 | // ctx2.clearRect(this.x[i]-this.l[i]*0.5, this.y[i]-this.l[i]*0.5, this.l[i], this.l[i]) 51 | for(var i = 0; i < this.num; i++) { 52 | if(this.alive[i]) { 53 | if(this.EStype[i] == 1) { 54 | this.x[i] += Math.random() * this.spd[i] * this.enemySpeed[i] * subTime 55 | } else if(this.EStype[i] == 2) { 56 | this.y[i] += Math.random() * this.spd[i] * this.enemySpeed[i] * subTime 57 | } else if(this.EStype[i] == 3) { 58 | this.x[i] -= Math.random() * this.spd[i] * this.enemySpeed[i] * subTime 59 | } else if(this.EStype[i] == 4) { 60 | this.y[i] -= Math.random() * this.spd[i] * this.enemySpeed[i] * subTime 61 | } else if(this.EStype[i] == 5) { 62 | this.x[i] -= Math.random() * this.spd[i] * this.enemySpeed[i] * subTime 63 | this.y[i] -= Math.random() * this.spd[i] * this.enemySpeed[i] * subTime 64 | } else { 65 | this.x[i] += Math.random() * this.spd[i] * this.enemySpeed[i] * subTime 66 | this.y[i] += Math.random() * this.spd[i] * this.enemySpeed[i] * subTime 67 | } 68 | var pic; 69 | if(this.type[i] == 'small') { 70 | pic = this.smallEnemy 71 | } else if(this.type[i] == 'middle') { 72 | pic = this.middleEnemy 73 | } else if(this.type[i] == 'large') { 74 | pic = this.largeEnemy 75 | } else if(this.type[i] == 'boss') { 76 | pic = this.boss 77 | } 78 | if(this.l[i] < this.body[i]) { 79 | this.l[i] += this.spd[i] * subTime 80 | } else { 81 | this.isAttack[i] = true 82 | } 83 | ctx2.drawImage(pic, this.x[i] - this.l[i] * 0.5, this.y[i] - this.l[i] * 0.5, this.l[i], this.l[i]); 84 | 85 | if(this.y[i] > wHeight || this.x[i] > wWidth || this.y[i] < 0 || this.x[i] < 0) { 86 | this.alive[i] = false; 87 | } 88 | } 89 | } 90 | } 91 | enemy.prototype.born = function(i) { 92 | this.x[i] = Math.floor(Math.random() * wWidth); 93 | this.y[i] = Math.floor(Math.random() * wHeight); 94 | this.l[i] = 0; 95 | this.body[i] = 25; 96 | this.alive[i] = true; 97 | this.isAttack[i] = false; 98 | var ran = Math.random(); 99 | if(ran < flag) { 100 | this.type[i] = 'small'; 101 | } else { 102 | if(flag == 0.7) { 103 | if(Math.random() > 0.5) { 104 | this.type[i] = 'large'; 105 | this.body[i] = 45; 106 | return; 107 | } 108 | } else if(flag == 0) { 109 | if(Math.random() > 0.35) { 110 | this.type[i] = 'large'; 111 | this.body[i] = 45; 112 | return; 113 | } else { 114 | this.type[i] = 'boss'; 115 | this.body[i] = 55; 116 | if(moshi == 'fast') { //产出boss 117 | return; 118 | } else { 119 | console.log("重新排序") 120 | var ran = Math.random(); 121 | if(ran <= 0.35) { 122 | this.type[i] = 'middle'; 123 | this.body[i] = 35; 124 | return; 125 | } else if(ran > 0.35 && ran < 0.8) { 126 | this.type[i] = 'small'; 127 | this.body[i] = 25; 128 | return; 129 | } else { 130 | this.type[i] = 'boss'; 131 | this.body[i] = 55; 132 | return; 133 | } 134 | } 135 | } 136 | } 137 | this.type[i] = 'middle'; 138 | this.body[i] = 35; 139 | } 140 | } 141 | enemy.prototype.dead = function(i) { 142 | this.alive[i] = false; 143 | this.isAttack[i] = false; 144 | } 145 | 146 | function enemyMonitor() { 147 | var enemyNum = 0; 148 | for(var i = 0; i < enemy.num; i++) { 149 | if(enemy.alive[i]) { 150 | enemyNum++ 151 | } 152 | } 153 | if(enemyNum < 15) { 154 | sendEnemy() 155 | return 156 | } 157 | } 158 | 159 | function sendEnemy() { 160 | for(var i = 0; i < enemy.num; i++) { 161 | if(!enemy.alive[i]) { 162 | enemy.born(i); 163 | return 164 | } 165 | } 166 | } -------------------------------------------------------------------------------- /game/freeModel.js: -------------------------------------------------------------------------------- 1 | var model = function() { 2 | this.x = []; 3 | this.y = []; 4 | this.bodySkin = []; 5 | this.angle = []; 6 | } 7 | model.prototype.num = 6; 8 | model.prototype.init = function() { 9 | for(var i = 0; i < this.num; i++) { 10 | mx2[i] = Math.floor(Math.random() * wWidth); 11 | my2[i] = Math.floor(Math.random() * wHeight); 12 | } 13 | for(var i = 0; i < this.num; i++) { 14 | this.angle[i] = 0; 15 | this.x[i] = wWidth * 0.5; 16 | this.y[i] = 0; 17 | } 18 | for(var i = 0; i < this.num; i++) { 19 | this.bodySkin[i] = new Image(); 20 | this.bodySkin[i].src = 'images/starfish-small' + i + '.png'; 21 | } 22 | } 23 | model.prototype.draw = function() { 24 | for(var i = 0; i < this.num; i++) { 25 | this.x[i] = lerpDistance(mx2[i], this.x[i], 0.980); 26 | this.y[i] = lerpDistance(my2[i], this.y[i], 0.980); 27 | 28 | var xDvalue = mx2[i] - this.x[i]; 29 | var yDvalue = my2[i] - this.y[i]; 30 | var beta = Math.atan2(yDvalue, xDvalue) + Math.PI //正切 31 | this.angle[i] = lerpAngle(beta, this.angle[i], 0.7); 32 | 33 | ctx.save(); 34 | ctx.translate(this.x[i], this.y[i]); 35 | ctx.rotate(this.angle[i] - Math.PI / 2); 36 | ctx.drawImage(this.bodySkin[i], -this.bodySkin[i].width * 0.5, -this.bodySkin[i].height * 0.5, 20, 20); 37 | ctx.restore(); 38 | } 39 | } -------------------------------------------------------------------------------- /game/index.js: -------------------------------------------------------------------------------- 1 | var wWidth = window.screen.width; 2 | var wHeight = document.documentElement.clientHeight; 3 | var mx = []; 4 | var mx2 = []; 5 | var my = []; 6 | var my2 = []; 7 | 8 | document.getElementById('can').setAttribute('width', wWidth); 9 | document.getElementById('can').setAttribute('height', wHeight); 10 | 11 | can = document.getElementById('can'); 12 | ctx = can.getContext('2d'); 13 | 14 | can.addEventListener("touchstart", function(e) { 15 | e.preventDefault(); 16 | for(var i = 0; i < actor.num; i++) { 17 | mx[i] = mx2[i] = e.touches[0].pageX; 18 | my[i] = my2[i] = e.touches[0].pageY; 19 | } 20 | //进行了点击 21 | document.getElementById('tip').style.display="none"; 22 | 23 | }); 24 | can.addEventListener("touchmove", function(e) { 25 | if(e.touches.length > 1 || e.scale && e.scale !== 1) return; 26 | for(var i = 0; i < actor.num; i++) { 27 | mx[i] = mx2[i] = e.touches[0].pageX; 28 | my[i] = my2[i] = e.touches[0].pageY; 29 | } 30 | }); 31 | 32 | var actor = function() { 33 | this.x = []; 34 | this.y = []; 35 | this.bodySkin = []; 36 | this.angle = []; 37 | } 38 | actor.prototype.num = 6; 39 | actor.prototype.init = function() { 40 | for(var i = 0; i < this.num; i++) { 41 | mx[i] = Math.floor(Math.random() * wWidth); 42 | my[i] = Math.floor(Math.random() * wHeight); 43 | } 44 | for(var i = 0; i < this.num; i++) { 45 | this.angle[i] = 0; 46 | this.x[i] = wWidth * 0.5; 47 | this.y[i] = wHeight; 48 | } 49 | for(var i = 0; i < this.num; i++) { 50 | this.bodySkin[i] = new Image(); 51 | this.bodySkin[i].src = 'images/starfish-small' + i + '.png'; 52 | } 53 | } 54 | actor.prototype.draw = function() { 55 | ctx.clearRect(0, 0, wWidth, wHeight); 56 | for(var i = 0; i < this.num; i++) { 57 | this.x[i] = lerpDistance(mx[i], this.x[i], 0.989); 58 | this.y[i] = lerpDistance(my[i], this.y[i], 0.989); 59 | 60 | var xDvalue = mx[i] - this.x[i]; 61 | var yDvalue = my[i] - this.y[i]; 62 | var beta = Math.atan2(yDvalue, xDvalue) + Math.PI //正切 63 | this.angle[i] = lerpAngle(beta, this.angle[i], 0.7); 64 | 65 | ctx.save(); 66 | ctx.translate(this.x[i], this.y[i]); 67 | ctx.rotate(this.angle[i] - Math.PI / 2); 68 | ctx.drawImage(this.bodySkin[i], -this.bodySkin[i].width * 0.5, -this.bodySkin[i].height * 0.5, 20, 20); 69 | ctx.restore(); 70 | } 71 | } -------------------------------------------------------------------------------- /game/main.js: -------------------------------------------------------------------------------- 1 | var can1, can2, ctx1, ctx2; 2 | var lastTime, subTime = 0; 3 | var bgPic = new Image(); 4 | var wWidth, wHight; 5 | var enemy, enemyTemp; 6 | var mx, my; 7 | var actor; 8 | var wave; 9 | var gameStatus = false; 10 | var flag = 0.8; 11 | var difficulty; //游戏难度 12 | var moshi; //游戏模式 13 | var countdown = 59 14 | var theTime = 0; //记录耗时 15 | 16 | //document.body.onload = main; 17 | 18 | function main() { 19 | //准备微信分享 http://palxp.com/spider_api/blog/json 20 | mui.ajax('http://palxp.com/jfinal_demo/weixin/circleShare?shareUrl=http://palxp.com/game/main.html', { 21 | dataType: 'json', //服务器返回json格式数据 22 | type: 'get', //HTTP请求类型 23 | async: true, 24 | timeout: 10000, //超时时间设置为10秒; 25 | success: function(data) { 26 | console.log(data); 27 | wx.config({ 28 | debug: false, // 开启调试模式,调用的所有api的返回值会在客户端alert出来,若要查看传入的参数,可以在pc端打开,参数信息会通过log打出,仅在pc端时才会打印。 29 | appId: 'wx3f8bf6344e14ae66', // 必填,公众号的唯一标识 30 | timestamp: data.timestamp, // 必填,生成签名的时间戳 31 | nonceStr: data.nonceStr, // 必填,生成签名的随机串 32 | signature: data.signature, // 必填,签名,见附录1 33 | jsApiList: ['onMenuShareTimeline', 'onMenuShareAppMessage', 'onMenuShareQQ', 'onMenuShareWeibo','hideOptionMenu','showOptionMenu','hideMenuItems','showMenuItems','hideAllNonBaseMenuItem','showAllNonBaseMenuItem'] // 必填,需要使用的JS接口列表,所有JS接口列表见附录2 34 | }); 35 | wx.ready(function() { 36 | wx.onMenuShareAppMessage({ 37 | title: '天哦怎么有这么无聊的游戏', // 分享标题 38 | desc: '吃吃吃停不下来...', // 分享描述 39 | link: 'http://palxp.com/game', // 分享链接,该链接域名或路径必须与当前页面对应的公众号JS安全域名一致 40 | imgUrl: 'http://palxp.com/game/images/starfish-middle0.png', // 分享图标 41 | type: '', // 分享类型,music、video或link,不填默认为link 42 | dataUrl: '', // 如果type是music或video,则要提供数据链接,默认为空 43 | success: function() { 44 | // 用户确认分享后执行的回调函数 45 | }, 46 | cancel: function() { 47 | // 用户取消分享后执行的回调函数 48 | } 49 | }); 50 | }) 51 | }, 52 | error: function(xhr, type, errorThrown) { 53 | console.log("获取微信签名出错") 54 | } 55 | }); 56 | //获取游戏难度 57 | if(localStorage.getItem('difficulty')) { 58 | difficulty = localStorage.getItem('difficulty') 59 | } else { 60 | difficulty = 1 61 | } 62 | //获取游戏模式 63 | if(localStorage.getItem('moshi')) { 64 | moshi = localStorage.getItem('moshi') 65 | } else { 66 | moshi = 'normal' 67 | } 68 | 69 | init(); 70 | gameLoop(); 71 | } 72 | 73 | function init() { 74 | lastTime = Date.now(); 75 | can1 = document.getElementById('canvas1'); 76 | ctx1 = can1.getContext('2d'); 77 | can2 = document.getElementById('canvas2'); 78 | ctx2 = can1.getContext('2d'); 79 | 80 | bgPic.src = './images/background.jpeg'; 81 | 82 | // mui.plusReady(function() { 83 | // void plus.navigator.setFullscreen(false); 84 | wWidth = window.screen.width; 85 | wHeight = document.documentElement.clientHeight; 86 | // wHeight = plus.screen.resolutionHeight - plus.navigator.getStatusbarHeight() 87 | // wWidth = plus.screen.resolutionWidth 88 | $('#container').attr('height', wHeight).attr('width', wWidth); 89 | $('#canvas1').attr('height', wHeight).attr('width', wWidth); 90 | $('#canvas2').attr('height', wHeight).attr('width', wWidth); 91 | ctx1.globalAlpha = 0.9 92 | ctx1.drawImage(bgPic, 0, 0, wWidth, wHeight); //绘制背景,静态 93 | //初始化 94 | enemyTemp = 1; 95 | //定时改变敌人移动规律 96 | var timer = setInterval(function() { 97 | enemyTemp = -(enemyTemp); 98 | countdown -= 1; 99 | theTime += 1; 100 | }, 1000); 101 | //初始化敌人 102 | enemy = new enemy(); 103 | enemy.init(); 104 | //初始化主角 105 | actor = new actor(); 106 | actor.init(); 107 | 108 | mx = wWidth * 0.5; 109 | my = wHeight * 0.5; 110 | //初始化波动特效 111 | wave = new wave(); 112 | wave.init(); 113 | //到达时间出现其他怪物 114 | mui.later(function() { 115 | flag = 0.7; 116 | }, 26000); 117 | mui.later(function() { 118 | flag = 0; 119 | }, 60000); 120 | //分值计算 121 | data = new data(); 122 | data.init(); 123 | 124 | // }); 125 | 126 | can2.addEventListener("touchstart", function(e) { 127 | e.preventDefault(); 128 | if(!gameStatus) { 129 | mx = e.touches[0].pageX; 130 | my = e.touches[0].pageY; 131 | } 132 | }); 133 | can2.addEventListener("touchmove", function(e) { 134 | if(e.touches.length > 1 || e.scale && e.scale !== 1) return; 135 | if(!gameStatus) { 136 | mx = e.touches[0].pageX; 137 | my = e.touches[0].pageY; 138 | } 139 | //console.log(e.touches[0].pageX, e.touches[0].pageY); 140 | }); 141 | } 142 | 143 | function gameLoop() { 144 | window.requestAnimationFrame(gameLoop); 145 | subTime = Date.now() - lastTime; 146 | if(subTime > 40) { 147 | subTime = 40; 148 | } 149 | lastTime = Date.now(); 150 | 151 | // mui.plusReady(function() { 152 | ctx1.drawImage(bgPic, 0, 0, wWidth, wHeight); 153 | enemy.draw(); 154 | enemyMonitor(); 155 | actor.draw(); 156 | enemyCarsh(); 157 | wave.draw(); 158 | data.draw(); 159 | // }); 160 | } -------------------------------------------------------------------------------- /images/background.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/palxiao/game/85335218087d04572ca6adfd3ae7918c38347532/images/background.jpeg -------------------------------------------------------------------------------- /images/bg.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/palxiao/game/85335218087d04572ca6adfd3ae7918c38347532/images/bg.png -------------------------------------------------------------------------------- /images/enemy/blowfish-icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/palxiao/game/85335218087d04572ca6adfd3ae7918c38347532/images/enemy/blowfish-icon.png -------------------------------------------------------------------------------- /images/enemy/crab-icon-middle.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/palxiao/game/85335218087d04572ca6adfd3ae7918c38347532/images/enemy/crab-icon-middle.png -------------------------------------------------------------------------------- /images/enemy/octo-icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/palxiao/game/85335218087d04572ca6adfd3ae7918c38347532/images/enemy/octo-icon.png -------------------------------------------------------------------------------- /images/enemy/squid-icon-middle.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/palxiao/game/85335218087d04572ca6adfd3ae7918c38347532/images/enemy/squid-icon-middle.png -------------------------------------------------------------------------------- /images/finger3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/palxiao/game/85335218087d04572ca6adfd3ae7918c38347532/images/finger3.png -------------------------------------------------------------------------------- /images/obg.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/palxiao/game/85335218087d04572ca6adfd3ae7918c38347532/images/obg.png -------------------------------------------------------------------------------- /images/starfish-middle0.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/palxiao/game/85335218087d04572ca6adfd3ae7918c38347532/images/starfish-middle0.png -------------------------------------------------------------------------------- /images/starfish-middle1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/palxiao/game/85335218087d04572ca6adfd3ae7918c38347532/images/starfish-middle1.png -------------------------------------------------------------------------------- /images/starfish-middle2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/palxiao/game/85335218087d04572ca6adfd3ae7918c38347532/images/starfish-middle2.png -------------------------------------------------------------------------------- /images/starfish-middle3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/palxiao/game/85335218087d04572ca6adfd3ae7918c38347532/images/starfish-middle3.png -------------------------------------------------------------------------------- /images/starfish-middle4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/palxiao/game/85335218087d04572ca6adfd3ae7918c38347532/images/starfish-middle4.png -------------------------------------------------------------------------------- /images/starfish-middle5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/palxiao/game/85335218087d04572ca6adfd3ae7918c38347532/images/starfish-middle5.png -------------------------------------------------------------------------------- /images/starfish-middle6.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/palxiao/game/85335218087d04572ca6adfd3ae7918c38347532/images/starfish-middle6.png -------------------------------------------------------------------------------- /images/starfish-middle7.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/palxiao/game/85335218087d04572ca6adfd3ae7918c38347532/images/starfish-middle7.png -------------------------------------------------------------------------------- /images/starfish-middle8.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/palxiao/game/85335218087d04572ca6adfd3ae7918c38347532/images/starfish-middle8.png -------------------------------------------------------------------------------- /images/starfish-middle9.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/palxiao/game/85335218087d04572ca6adfd3ae7918c38347532/images/starfish-middle9.png -------------------------------------------------------------------------------- /images/starfish-small0.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/palxiao/game/85335218087d04572ca6adfd3ae7918c38347532/images/starfish-small0.png -------------------------------------------------------------------------------- /images/starfish-small1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/palxiao/game/85335218087d04572ca6adfd3ae7918c38347532/images/starfish-small1.png -------------------------------------------------------------------------------- /images/starfish-small2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/palxiao/game/85335218087d04572ca6adfd3ae7918c38347532/images/starfish-small2.png -------------------------------------------------------------------------------- /images/starfish-small3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/palxiao/game/85335218087d04572ca6adfd3ae7918c38347532/images/starfish-small3.png -------------------------------------------------------------------------------- /images/starfish-small4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/palxiao/game/85335218087d04572ca6adfd3ae7918c38347532/images/starfish-small4.png -------------------------------------------------------------------------------- /images/starfish-small5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/palxiao/game/85335218087d04572ca6adfd3ae7918c38347532/images/starfish-small5.png -------------------------------------------------------------------------------- /images/weixin.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/palxiao/game/85335218087d04572ca6adfd3ae7918c38347532/images/weixin.png -------------------------------------------------------------------------------- /index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 我是一只鱼 7 | 8 | 9 | 69 | 70 | 71 | 72 | 73 |
74 | 75 | 76 |
77 |
78 |
点击任意处
79 |
80 | 81 |
82 |
83 | 84 | 85 | 86 | 87 | 88 | 89 | 90 | 132 | 133 | 134 | -------------------------------------------------------------------------------- /js/animation.js: -------------------------------------------------------------------------------- 1 | // 对运动方法进行封装 2 | Math.animation = function (from, to, duration, easing, callback) { 3 | var isUndefined = function (obj) { 4 | return typeof obj == 'undefined'; 5 | }; 6 | var isFunction = function (obj) { 7 | return typeof obj == 'function'; 8 | }; 9 | var isNumber = function(obj) { 10 | return typeof obj == 'number'; 11 | }; 12 | var isString = function(obj) { 13 | return typeof obj == 'string'; 14 | }; 15 | 16 | // 转换成毫秒 17 | var toMillisecond = function(obj) { 18 | if (isNumber(obj)) { 19 | return obj; 20 | } else if (isString(obj)) { 21 | if (/\d+m?s$/.test(obj)) { 22 | if (/ms/.test(obj)) { 23 | return 1 * obj.replace('ms', ''); 24 | } 25 | return 1000 * obj.replace('s', ''); 26 | } else if (/^\d+$/.test(obj)) { 27 | return +obj; 28 | } 29 | } 30 | return -1; 31 | }; 32 | 33 | if (!isNumber(from) || !isNumber(to)) { 34 | if (window.console) { 35 | console.error('from和to两个参数必须且为数值'); 36 | } 37 | return 0; 38 | } 39 | 40 | // 缓动算法 41 | var tween = Math.tween || window.Tween; 42 | 43 | if (!tween) { 44 | if (window.console) { 45 | console.error('缓动算法函数缺失'); 46 | } 47 | return 0; 48 | } 49 | 50 | // duration, easing, callback均为可选参数 51 | // 而且顺序可以任意 52 | var options = { 53 | duration: 300, 54 | easing: 'Linear', 55 | callback: function() {} 56 | }; 57 | 58 | var setOptions = function(obj) { 59 | if (isFunction(obj)) { 60 | options.callback = obj; 61 | } else if (toMillisecond(obj) != -1) { 62 | options.duration = toMillisecond(obj); 63 | } else if (isString(obj)) { 64 | options.easing = obj; 65 | } 66 | }; 67 | setOptions(duration); 68 | setOptions(easing); 69 | setOptions(callback); 70 | 71 | // requestAnimationFrame的兼容处理 72 | if (!window.requestAnimationFrame) { 73 | requestAnimationFrame = function (fn) { 74 | setTimeout(fn, 17); 75 | }; 76 | } 77 | 78 | // 算法需要的几个变量 79 | var start = 0; 80 | // during根据设置的总时间计算 81 | var during = Math.ceil(options.duration / 17); 82 | 83 | // 当前动画算法 84 | // 确保首字母大写 85 | options.easing = options.easing.slice(0, 1).toUpperCase() + options.easing.slice(1); 86 | var arrKeyTween = options.easing.split('.'); 87 | var fnGetValue; 88 | 89 | if (arrKeyTween.length == 1) { 90 | fnGetValue = tween[arrKeyTween[0]]; 91 | } else if (arrKeyTween.length == 2) { 92 | fnGetValue = tween[arrKeyTween[0]] && tween[arrKeyTween[0]][arrKeyTween[1]]; 93 | } 94 | if (isFunction(fnGetValue) == false) { 95 | console.error('没有找到名为"'+ options.easing +'"的动画算法'); 96 | return; 97 | } 98 | 99 | // 运动 100 | var step = function() { 101 | // 当前的运动位置 102 | var value = fnGetValue(start, from, to - from, during); 103 | 104 | // 时间递增 105 | start++; 106 | // 如果还没有运动到位,继续 107 | if (start <= during) { 108 | options.callback(value); 109 | requestAnimationFrame(step); 110 | } else { 111 | // 动画结束,这里可以插入回调... 112 | options.callback(to, true); 113 | } 114 | }; 115 | // 开始执行动画 116 | step(); 117 | }; -------------------------------------------------------------------------------- /js/app.js: -------------------------------------------------------------------------------- 1 | /** 2 | * 演示程序当前的 “注册/登录” 等操作,是基于 “本地存储” 完成的 3 | * 当您要参考这个演示程序进行相关 app 的开发时, 4 | * 请注意将相关方法调整成 “基于服务端Service” 的实现。 5 | **/ 6 | (function($, owner) { 7 | /** 8 | * 用户登录 9 | **/ 10 | owner.login = function(loginInfo, callback) { 11 | callback = callback || $.noop; 12 | loginInfo = loginInfo || {}; 13 | loginInfo.account = loginInfo.account || ''; 14 | loginInfo.password = loginInfo.password || ''; 15 | if (loginInfo.account.length < 5) { 16 | return callback('账号最短为 5 个字符'); 17 | } 18 | if (loginInfo.password.length < 6) { 19 | return callback('密码最短为 6 个字符'); 20 | } 21 | var users = JSON.parse(localStorage.getItem('$users') || '[]'); 22 | var authed = users.some(function(user) { 23 | return loginInfo.account == user.account && loginInfo.password == user.password; 24 | }); 25 | if (authed) { 26 | return owner.createState(loginInfo.account, callback); 27 | } else { 28 | return callback('用户名或密码错误'); 29 | } 30 | }; 31 | 32 | owner.createState = function(name, callback) { 33 | var state = owner.getState(); 34 | state.account = name; 35 | state.token = "token123456789"; 36 | owner.setState(state); 37 | return callback(); 38 | }; 39 | 40 | /** 41 | * 新用户注册 42 | **/ 43 | owner.reg = function(regInfo, callback) { 44 | callback = callback || $.noop; 45 | regInfo = regInfo || {}; 46 | regInfo.account = regInfo.account || ''; 47 | regInfo.password = regInfo.password || ''; 48 | if (regInfo.account.length < 5) { 49 | return callback('用户名最短需要 5 个字符'); 50 | } 51 | if (regInfo.password.length < 6) { 52 | return callback('密码最短需要 6 个字符'); 53 | } 54 | if (!checkEmail(regInfo.email)) { 55 | return callback('邮箱地址不合法'); 56 | } 57 | var users = JSON.parse(localStorage.getItem('$users') || '[]'); 58 | users.push(regInfo); 59 | localStorage.setItem('$users', JSON.stringify(users)); 60 | return callback(); 61 | }; 62 | 63 | /** 64 | * 获取当前状态 65 | **/ 66 | owner.getState = function() { 67 | var stateText = localStorage.getItem('$state') || "{}"; 68 | return JSON.parse(stateText); 69 | }; 70 | 71 | /** 72 | * 设置当前状态 73 | **/ 74 | owner.setState = function(state) { 75 | state = state || {}; 76 | localStorage.setItem('$state', JSON.stringify(state)); 77 | //var settings = owner.getSettings(); 78 | //settings.gestures = ''; 79 | //owner.setSettings(settings); 80 | }; 81 | 82 | var checkEmail = function(email) { 83 | email = email || ''; 84 | return (email.length > 3 && email.indexOf('@') > -1); 85 | }; 86 | 87 | /** 88 | * 找回密码 89 | **/ 90 | owner.forgetPassword = function(email, callback) { 91 | callback = callback || $.noop; 92 | if (!checkEmail(email)) { 93 | return callback('邮箱地址不合法'); 94 | } 95 | return callback(null, '新的随机密码已经发送到您的邮箱,请查收邮件。'); 96 | }; 97 | 98 | /** 99 | * 获取应用本地配置 100 | **/ 101 | owner.setSettings = function(settings) { 102 | settings = settings || {}; 103 | localStorage.setItem('$settings', JSON.stringify(settings)); 104 | } 105 | 106 | /** 107 | * 设置应用本地配置 108 | **/ 109 | owner.getSettings = function() { 110 | var settingsText = localStorage.getItem('$settings') || "{}"; 111 | return JSON.parse(settingsText); 112 | } 113 | /** 114 | * 获取本地是否安装客户端 115 | **/ 116 | owner.isInstalled = function(id) { 117 | if (id === 'qihoo' && mui.os.plus) { 118 | return true; 119 | } 120 | if (mui.os.android) { 121 | var main = plus.android.runtimeMainActivity(); 122 | var packageManager = main.getPackageManager(); 123 | var PackageManager = plus.android.importClass(packageManager) 124 | var packageName = { 125 | "qq": "com.tencent.mobileqq", 126 | "weixin": "com.tencent.mm", 127 | "sinaweibo": "com.sina.weibo" 128 | } 129 | try { 130 | return packageManager.getPackageInfo(packageName[id], PackageManager.GET_ACTIVITIES); 131 | } catch (e) {} 132 | } else { 133 | switch (id) { 134 | case "qq": 135 | var TencentOAuth = plus.ios.import("TencentOAuth"); 136 | return TencentOAuth.iphoneQQInstalled(); 137 | case "weixin": 138 | var WXApi = plus.ios.import("WXApi"); 139 | return WXApi.isWXAppInstalled() 140 | case "sinaweibo": 141 | var SinaAPI = plus.ios.import("WeiboSDK"); 142 | return SinaAPI.isWeiboAppInstalled() 143 | default: 144 | break; 145 | } 146 | } 147 | } 148 | }(mui, window.app = {})); -------------------------------------------------------------------------------- /js/mui.enterfocus.js: -------------------------------------------------------------------------------- 1 | (function($) { 2 | $.enterfocus = function(selector, callback) { 3 | var boxArray = [].slice.call(document.querySelectorAll(selector)); 4 | for (var index in boxArray) { 5 | var box = boxArray[index]; 6 | box.addEventListener('keyup', function(event) { 7 | if (event.keyCode == 13) { 8 | var boxIndex = boxArray.indexOf(this); 9 | if (boxIndex == boxArray.length - 1) { 10 | if (callback) callback(); 11 | } else { 12 | //console.log(boxIndex); 13 | var nextBox = boxArray[++boxIndex]; 14 | nextBox.focus(); 15 | } 16 | } 17 | }, false); 18 | } 19 | }; 20 | }(window.mui = window.mui || {})); -------------------------------------------------------------------------------- /js/mui.locker.js: -------------------------------------------------------------------------------- 1 | /** 2 | * 手势锁屏插件 3 | * varstion 1.0.5 4 | * by Houfeng 5 | * Houfeng@DCloud.io 6 | */ 7 | 8 | (function($, doc) { 9 | 10 | var touchSupport = ('ontouchstart' in document); 11 | var startEventName = touchSupport ? 'touchstart' : 'mousedown'; 12 | var moveEventName = touchSupport ? 'touchmove' : 'mousemove'; 13 | var endEventName = touchSupport ? 'touchend' : 'mouseup'; 14 | var lockerHolderClassName = $.className('locker-holder'); 15 | var lockerClassName = $.className('locker'); 16 | 17 | var styleHolder = doc.querySelector('head') || doc.querySelector('body'); 18 | styleHolder.innerHTML += ""; 19 | 20 | var times = 4; 21 | 22 | function getElementLeft(element) {     23 | var actualLeft = element.offsetLeft;     24 | var current = element.offsetParent;     25 | while (current !== null) {       26 | actualLeft += current.offsetLeft;       27 | current = current.offsetParent;     28 | }     29 | return actualLeft;   30 | }   31 | 32 | function getElementTop(element) {     33 | var actualTop = element.offsetTop;     34 | var current = element.offsetParent;     35 | while (current !== null) {       36 | actualTop += current.offsetTop;       37 | current = current.offsetParent;     38 | }     39 | return actualTop;   40 | } 41 | 42 | //定义 Locker 类 43 | var Locker = $.Locker = $.Class.extend({ 44 | R: 26, 45 | CW: 400, 46 | CH: 320, 47 | OffsetX: 30, 48 | OffsetY: 30, 49 | 50 | /** 51 | * 构造函数 52 | * */ 53 | init: function(holder, options) { 54 | var self = this; 55 | if (!holder) { 56 | throw "构造 Locker 时缺少容器元素"; 57 | } 58 | self.holder = holder; 59 | //避免重复初始化开始 60 | if (self.holder.__locker_inited) return; 61 | self.holder.__locker_inited = true; 62 | //避免重复初始化结束 63 | // 64 | self.options = options || {}; 65 | self.options.callback = self.options.callback || self.options.done || $.noop; 66 | self.holder.innerHTML = ''; 67 | // 68 | self.holder.classList.add(lockerHolderClassName); 69 | //初始化 70 | var canvas = self.canvas = $.qsa('canvas', self.holder)[0]; 71 | canvas.on = canvas.addEventListener || function(name, handler, capture) { 72 | canvas.attachEvent('on' + name, handler, capture); 73 | }; 74 | canvas.off = canvas.removeEventListener || function(name, handler, capture) { 75 | canvas.detachEvent('on' + name, handler, capture); 76 | }; 77 | // 78 | if (self.options.width) self.holder.style.width = self.options.width + 'px'; 79 | if (self.options.height) self.holder.style.height = self.options.height + 'px'; 80 | self.CW = self.options.width || self.holder.offsetWidth || self.CW; 81 | self.CH = self.options.height || self.holder.offsetHeight || self.CH; 82 | //处理 “宽、高” 等数值, 全部扩大 times 倍 83 | self.R *= times; 84 | self.CW *= times; 85 | self.CH *= times; 86 | self.OffsetX *= times; 87 | self.OffsetY *= times; 88 | // 89 | canvas.width = self.CW; 90 | canvas.height = self.CH; 91 | var cxt = self.cxt = canvas.getContext("2d"); 92 | //两个圆之间的外距离 就是说两个圆心的距离去除两个半径 93 | var X = (self.CW - 2 * self.OffsetX - self.R * 2 * 3) / 2; 94 | var Y = (self.CH - 2 * self.OffsetY - self.R * 2 * 3) / 2; 95 | self.pointLocationArr = self.caculateNinePointLotion(X, Y); 96 | self.initEvent(canvas, cxt, self.holder); 97 | //console.log(X); 98 | self.draw(cxt, self.pointLocationArr, [], null); 99 | setTimeout(function() { 100 | self.draw(cxt, self.pointLocationArr, [], null); 101 | }, 0); 102 | }, 103 | 104 | /** 105 | * 计算 106 | */ 107 | caculateNinePointLotion: function(diffX, diffY) { 108 | var self = this; 109 | var Re = []; 110 | for (var row = 0; row < 3; row++) { 111 | for (var col = 0; col < 3; col++) { 112 | var Point = { 113 | X: (self.OffsetX + col * diffX + (col * 2 + 1) * self.R), 114 | Y: (self.OffsetY + row * diffY + (row * 2 + 1) * self.R) 115 | }; 116 | Re.push(Point); 117 | } 118 | } 119 | return Re; 120 | }, 121 | 122 | /** 123 | * 绘制 124 | */ 125 | draw: function(cxt, _PointLocationArr, _LinePointArr, touchPoint) { 126 | var self = this; 127 | var R = self.R; 128 | if (_LinePointArr.length > 0) { 129 | cxt.beginPath(); 130 | for (var i = 0; i < _LinePointArr.length; i++) { 131 | var pointIndex = _LinePointArr[i]; 132 | cxt.lineTo(_PointLocationArr[pointIndex].X, _PointLocationArr[pointIndex].Y); 133 | } 134 | cxt.lineWidth = 2 * times; 135 | cxt.strokeStyle = self.options.lineColor || "#999"; //连结线颜色 136 | cxt.stroke(); 137 | cxt.closePath(); 138 | if (touchPoint != null) { 139 | var lastPointIndex = _LinePointArr[_LinePointArr.length - 1]; 140 | var lastPoint = _PointLocationArr[lastPointIndex]; 141 | cxt.beginPath(); 142 | cxt.moveTo(lastPoint.X, lastPoint.Y); 143 | cxt.lineTo(touchPoint.X, touchPoint.Y); 144 | cxt.stroke(); 145 | cxt.closePath(); 146 | } 147 | } 148 | for (var i = 0; i < _PointLocationArr.length; i++) { 149 | var Point = _PointLocationArr[i]; 150 | cxt.fillStyle = self.options.ringColor || "#888"; //圆圈边框颜色 151 | cxt.beginPath(); 152 | cxt.arc(Point.X, Point.Y, R, 0, Math.PI * times, true); 153 | cxt.closePath(); 154 | cxt.fill(); 155 | cxt.fillStyle = self.options.fillColor || "#f3f3f3"; //圆圈填充颜色 156 | cxt.beginPath(); 157 | cxt.arc(Point.X, Point.Y, R - (2 * times), 0, Math.PI * times, true); 158 | cxt.closePath(); 159 | cxt.fill(); 160 | if (_LinePointArr.indexOf(i) >= 0) { 161 | cxt.fillStyle = self.options.pointColor || "#777"; //圆圈中心点颜色 162 | cxt.beginPath(); 163 | cxt.arc(Point.X, Point.Y, R - (16 * times), 0, Math.PI * times, true); 164 | cxt.closePath(); 165 | cxt.fill(); 166 | } 167 | } 168 | }, 169 | 170 | isPointSelect: function(touches, linePoint) { 171 | var self = this; 172 | for (var i = 0; i < self.pointLocationArr.length; i++) { 173 | var currentPoint = self.pointLocationArr[i]; 174 | var xdiff = Math.abs(currentPoint.X - touches.elementX); 175 | var ydiff = Math.abs(currentPoint.Y - touches.elementY); 176 | var dir = Math.pow((xdiff * xdiff + ydiff * ydiff), 0.5); 177 | if (dir < self.R) { 178 | if (linePoint.indexOf(i) < 0) { 179 | linePoint.push(i); 180 | } 181 | break; 182 | } 183 | } 184 | }, 185 | 186 | initEvent: function(canvas, cxt, holder) { 187 | var self = this; 188 | var linePoint = []; 189 | var isDown = false; //针对鼠标事件 190 | //start 191 | self._startHandler = function(e) { 192 | e.point = event.changedTouches ? event.changedTouches[0] : event; 193 | e.point.elementX = (e.point.pageX - getElementLeft(holder)) * times; 194 | e.point.elementY = (e.point.pageY - getElementTop(holder)) * times; 195 | self.isPointSelect(e.point, linePoint); 196 | isDown = true; 197 | }; 198 | canvas.on(startEventName, self._startHandler, false); 199 | //move 200 | self._moveHanlder = function(e) { 201 | if (!isDown) return; 202 | e.preventDefault(); 203 | e.point = event.changedTouches ? event.changedTouches[0] : event; 204 | e.point.elementX = (e.point.pageX - getElementLeft(holder)) * times; 205 | e.point.elementY = (e.point.pageY - getElementTop(holder)) * times; 206 | var touches = e.point; 207 | self.isPointSelect(touches, linePoint); 208 | cxt.clearRect(0, 0, self.CW, self.CH); 209 | self.draw(cxt, self.pointLocationArr, linePoint, { 210 | X: touches.elementX, 211 | Y: touches.elementY 212 | }); 213 | }; 214 | canvas.on(moveEventName, self._moveHanlder, false); 215 | //end 216 | self._endHandler = function(e) { 217 | e.point = event.changedTouches ? event.changedTouches[0] : event; 218 | e.point.elementX = (e.point.pageX - getElementLeft(holder)) * times; 219 | e.point.elementY = (e.point.pageY - getElementTop(holder)) * times; 220 | cxt.clearRect(0, 0, self.CW, self.CH); 221 | self.draw(cxt, self.pointLocationArr, linePoint, null); 222 | //事件数据 223 | var eventData = { 224 | sender: self, 225 | points: linePoint 226 | }; 227 | /* 228 | * 回调完成事件 229 | * 230 | * 备注: 231 | * 比较理想的做法是为 Locker 的实例启用事件机制,比如 locker.on('done',handler); 232 | * 在 mui 没有完整的公共事件模块前,此版本中 locker 实例暂通过 options.callback 处理 233 | */ 234 | self.options.callback(eventData); 235 | //触发声明的DOM的自定义事件(暂定 done 为事件名,可以考虑更有针对的事件名 ) 236 | $.trigger(self.holder, 'done', eventData); 237 | //- 238 | linePoint = []; 239 | isDown = false; 240 | }; 241 | canvas.on(endEventName, self._endHandler, false); 242 | }, 243 | 244 | pointLocationArr: [], 245 | 246 | /** 247 | * 清除图形 248 | * */ 249 | clear: function() { 250 | var self = this; 251 | //self.pointLocationArr = []; 252 | if (self.cxt) { 253 | self.cxt.clearRect(0, 0, self.CW, self.CH); 254 | self.draw(self.cxt, self.pointLocationArr, [], { 255 | X: 0, 256 | Y: 0 257 | }); 258 | } 259 | }, 260 | 261 | /** 262 | * 释放资源 263 | * */ 264 | dispose: function() { 265 | var self = this; 266 | self.cxt = null; 267 | self.canvas.off(startEventName, self._startHandler); 268 | self.canvas.off(moveEventName, self._moveHandler); 269 | self.canvas.off(endEventName, self._endHandler); 270 | self.holder.innerHTML = ''; 271 | self.canvas = null; 272 | } 273 | }); 274 | 275 | //添加 locker 插件 276 | $.fn.locker = function(options) { 277 | //遍历选择的元素 278 | this.each(function(i, element) { 279 | if (options) { 280 | new Locker(element, options); 281 | } else { 282 | var optionsText = element.getAttribute('data-locker-options'); 283 | var options = optionsText ? JSON.parse(optionsText) : {}; 284 | options.lineColor = element.getAttribute('data-locker-line-color') || options.lineColor; 285 | options.ringColor = element.getAttribute('data-locker-ring-color') || options.ringColor; 286 | options.fillColor = element.getAttribute('data-locker-fill-color') || options.fillColor; 287 | options.pointColor = element.getAttribute('data-locker-point-color') || options.pointColor; 288 | options.width = element.getAttribute('data-locker-width') || options.width; 289 | options.height = element.getAttribute('data-locker-height') || options.height; 290 | new Locker(element, options); 291 | } 292 | }); 293 | return this; 294 | }; 295 | 296 | //自动处理 class='mui-locker' 的 dom 297 | try { 298 | $('.' + lockerClassName).locker(); 299 | } catch (ex) {} 300 | $.ready(function() { 301 | $('.' + lockerClassName).locker(); 302 | }); 303 | 304 | }(mui, document)); -------------------------------------------------------------------------------- /js/tween.js: -------------------------------------------------------------------------------- 1 | /* 2 | * Tween.js 3 | * t: current time(当前时间); 4 | * b: beginning value(初始值); 5 | * c: change in value(变化量); 6 | * d: duration(持续时间)。 7 | * you can visit 'http://easings.net/zh-cn' to get effect 8 | */ 9 | var Tween = { 10 | Linear: function(t, b, c, d) { return c*t/d + b; }, 11 | Quad: { 12 | easeIn: function(t, b, c, d) { 13 | return c * (t /= d) * t + b; 14 | }, 15 | easeOut: function(t, b, c, d) { 16 | return -c *(t /= d)*(t-2) + b; 17 | }, 18 | easeInOut: function(t, b, c, d) { 19 | if ((t /= d / 2) < 1) return c / 2 * t * t + b; 20 | return -c / 2 * ((--t) * (t-2) - 1) + b; 21 | } 22 | }, 23 | Cubic: { 24 | easeIn: function(t, b, c, d) { 25 | return c * (t /= d) * t * t + b; 26 | }, 27 | easeOut: function(t, b, c, d) { 28 | return c * ((t = t/d - 1) * t * t + 1) + b; 29 | }, 30 | easeInOut: function(t, b, c, d) { 31 | if ((t /= d / 2) < 1) return c / 2 * t * t*t + b; 32 | return c / 2*((t -= 2) * t * t + 2) + b; 33 | } 34 | }, 35 | Quart: { 36 | easeIn: function(t, b, c, d) { 37 | return c * (t /= d) * t * t*t + b; 38 | }, 39 | easeOut: function(t, b, c, d) { 40 | return -c * ((t = t/d - 1) * t * t*t - 1) + b; 41 | }, 42 | easeInOut: function(t, b, c, d) { 43 | if ((t /= d / 2) < 1) return c / 2 * t * t * t * t + b; 44 | return -c / 2 * ((t -= 2) * t * t*t - 2) + b; 45 | } 46 | }, 47 | Quint: { 48 | easeIn: function(t, b, c, d) { 49 | return c * (t /= d) * t * t * t * t + b; 50 | }, 51 | easeOut: function(t, b, c, d) { 52 | return c * ((t = t/d - 1) * t * t * t * t + 1) + b; 53 | }, 54 | easeInOut: function(t, b, c, d) { 55 | if ((t /= d / 2) < 1) return c / 2 * t * t * t * t * t + b; 56 | return c / 2*((t -= 2) * t * t * t * t + 2) + b; 57 | } 58 | }, 59 | Sine: { 60 | easeIn: function(t, b, c, d) { 61 | return -c * Math.cos(t/d * (Math.PI/2)) + c + b; 62 | }, 63 | easeOut: function(t, b, c, d) { 64 | return c * Math.sin(t/d * (Math.PI/2)) + b; 65 | }, 66 | easeInOut: function(t, b, c, d) { 67 | return -c / 2 * (Math.cos(Math.PI * t/d) - 1) + b; 68 | } 69 | }, 70 | Expo: { 71 | easeIn: function(t, b, c, d) { 72 | return (t==0) ? b : c * Math.pow(2, 10 * (t/d - 1)) + b; 73 | }, 74 | easeOut: function(t, b, c, d) { 75 | return (t==d) ? b + c : c * (-Math.pow(2, -10 * t/d) + 1) + b; 76 | }, 77 | easeInOut: function(t, b, c, d) { 78 | if (t==0) return b; 79 | if (t==d) return b+c; 80 | if ((t /= d / 2) < 1) return c / 2 * Math.pow(2, 10 * (t - 1)) + b; 81 | return c / 2 * (-Math.pow(2, -10 * --t) + 2) + b; 82 | } 83 | }, 84 | Circ: { 85 | easeIn: function(t, b, c, d) { 86 | return -c * (Math.sqrt(1 - (t /= d) * t) - 1) + b; 87 | }, 88 | easeOut: function(t, b, c, d) { 89 | return c * Math.sqrt(1 - (t = t/d - 1) * t) + b; 90 | }, 91 | easeInOut: function(t, b, c, d) { 92 | if ((t /= d / 2) < 1) return -c / 2 * (Math.sqrt(1 - t * t) - 1) + b; 93 | return c / 2 * (Math.sqrt(1 - (t -= 2) * t) + 1) + b; 94 | } 95 | }, 96 | Elastic: { 97 | easeIn: function(t, b, c, d, a, p) { 98 | var s; 99 | if (t==0) return b; 100 | if ((t /= d) == 1) return b + c; 101 | if (typeof p == "undefined") p = d * .3; 102 | if (!a || a < Math.abs(c)) { 103 | s = p / 4; 104 | a = c; 105 | } else { 106 | s = p / (2 * Math.PI) * Math.asin(c / a); 107 | } 108 | return -(a * Math.pow(2, 10 * (t -= 1)) * Math.sin((t * d - s) * (2 * Math.PI) / p)) + b; 109 | }, 110 | easeOut: function(t, b, c, d, a, p) { 111 | var s; 112 | if (t==0) return b; 113 | if ((t /= d) == 1) return b + c; 114 | if (typeof p == "undefined") p = d * .3; 115 | if (!a || a < Math.abs(c)) { 116 | a = c; 117 | s = p / 4; 118 | } else { 119 | s = p/(2*Math.PI) * Math.asin(c/a); 120 | } 121 | return (a * Math.pow(2, -10 * t) * Math.sin((t * d - s) * (2 * Math.PI) / p) + c + b); 122 | }, 123 | easeInOut: function(t, b, c, d, a, p) { 124 | var s; 125 | if (t==0) return b; 126 | if ((t /= d / 2) == 2) return b+c; 127 | if (typeof p == "undefined") p = d * (.3 * 1.5); 128 | if (!a || a < Math.abs(c)) { 129 | a = c; 130 | s = p / 4; 131 | } else { 132 | s = p / (2 *Math.PI) * Math.asin(c / a); 133 | } 134 | if (t < 1) return -.5 * (a * Math.pow(2, 10* (t -=1 )) * Math.sin((t * d - s) * (2 * Math.PI) / p)) + b; 135 | return a * Math.pow(2, -10 * (t -= 1)) * Math.sin((t * d - s) * (2 * Math.PI) / p ) * .5 + c + b; 136 | } 137 | }, 138 | Back: { 139 | easeIn: function(t, b, c, d, s) { 140 | if (typeof s == "undefined") s = 1.70158; 141 | return c * (t /= d) * t * ((s + 1) * t - s) + b; 142 | }, 143 | easeOut: function(t, b, c, d, s) { 144 | if (typeof s == "undefined") s = 1.70158; 145 | return c * ((t = t/d - 1) * t * ((s + 1) * t + s) + 1) + b; 146 | }, 147 | easeInOut: function(t, b, c, d, s) { 148 | if (typeof s == "undefined") s = 1.70158; 149 | if ((t /= d / 2) < 1) return c / 2 * (t * t * (((s *= (1.525)) + 1) * t - s)) + b; 150 | return c / 2*((t -= 2) * t * (((s *= (1.525)) + 1) * t + s) + 2) + b; 151 | } 152 | }, 153 | Bounce: { 154 | easeIn: function(t, b, c, d) { 155 | return c - Tween.Bounce.easeOut(d-t, 0, c, d) + b; 156 | }, 157 | easeOut: function(t, b, c, d) { 158 | if ((t /= d) < (1 / 2.75)) { 159 | return c * (7.5625 * t * t) + b; 160 | } else if (t < (2 / 2.75)) { 161 | return c * (7.5625 * (t -= (1.5 / 2.75)) * t + .75) + b; 162 | } else if (t < (2.5 / 2.75)) { 163 | return c * (7.5625 * (t -= (2.25 / 2.75)) * t + .9375) + b; 164 | } else { 165 | return c * (7.5625 * (t -= (2.625 / 2.75)) * t + .984375) + b; 166 | } 167 | }, 168 | easeInOut: function(t, b, c, d) { 169 | if (t < d / 2) { 170 | return Tween.Bounce.easeIn(t * 2, 0, c, d) * .5 + b; 171 | } else { 172 | return Tween.Bounce.easeOut(t * 2 - d, 0, c, d) * .5 + c * .5 + b; 173 | } 174 | } 175 | } 176 | } 177 | Math.tween = Tween; -------------------------------------------------------------------------------- /main.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 我是一只鱼 8 | 9 | 10 | 11 | 12 | 13 | 117 | 118 | 119 | 120 |
121 |
122 |
123 | 124 |
125 |
126 | 140 | 144 | 145 | 146 | 147 | 148 | 149 | 150 | 151 | 152 | 153 | 156 | 157 | -------------------------------------------------------------------------------- /manifest.json: -------------------------------------------------------------------------------- 1 | { 2 | "@platforms": ["android", "iPhone", "iPad"], 3 | "id": "H53E208C6",/*应用的标识,创建应用时自动生成,勿手动修改*/ 4 | "name": "testM",/*应用名称,程序桌面图标名称*/ 5 | "version": { 6 | "name": "1.0.0",/*应用版本名称*/ 7 | "code": "83" 8 | }, 9 | "description": "",/*应用描述信息*/ 10 | "icons": { 11 | "72": "icon.png" 12 | }, 13 | "launch_path": "index.html",/*应用的入口页面,默认为根目录下的index.html;支持网络地址,必须以http://或https://开头*/ 14 | "developer": { 15 | "name": "",/*开发者名称*/ 16 | "email": "",/*开发者邮箱地址*/ 17 | "url": "http://www.dcloud.io" 18 | }, 19 | "permissions": { 20 | "Accelerometer": { 21 | "description": "访问加速度感应器" 22 | }, 23 | "Audio": { 24 | "description": "访问麦克风" 25 | }, 26 | "Cache": { 27 | "description": "管理应用缓存" 28 | }, 29 | "Camera": { 30 | "description": "访问摄像头" 31 | }, 32 | "Console": { 33 | "description": "跟踪调试输出日志" 34 | }, 35 | "Contacts": { 36 | "description": "访问系统联系人信息" 37 | }, 38 | "Device": { 39 | "description": "访问设备信息" 40 | }, 41 | "Downloader": { 42 | "description": "文件下载管理" 43 | }, 44 | "Events": { 45 | "description": "应用扩展事件" 46 | }, 47 | "File": { 48 | "description": "访问本地文件系统" 49 | }, 50 | "Gallery": { 51 | "description": "访问系统相册" 52 | }, 53 | "Geolocation": { 54 | "description": "访问位置信息" 55 | }, 56 | "Invocation": { 57 | "description": "使用Native.js能力" 58 | }, 59 | "Messaging": { 60 | "description": "访问通讯能力" 61 | }, 62 | "Orientation": { 63 | "description": "访问方向感应器" 64 | }, 65 | "Proximity": { 66 | "description": "访问距离感应器" 67 | }, 68 | "Storage": { 69 | "description": "管理应用本地数据" 70 | }, 71 | 72 | "Uploader": { 73 | "description": "管理文件上传任务" 74 | }, 75 | "Runtime": { 76 | "description": "访问运行期环境" 77 | }, 78 | "XMLHttpRequest": { 79 | "description": "跨域网络访问" 80 | }, 81 | "Zip": { 82 | "description": "文件压缩与解压缩" 83 | }, 84 | "Barcode": { 85 | "description": "管理二维码扫描插件" 86 | }, 87 | "Maps": { 88 | "description": "管理地图插件" 89 | }, 90 | "Speech": { 91 | "description": "管理语音识别插件" 92 | }, 93 | "Webview":{ 94 | "description": "窗口管理" 95 | }, 96 | "NativeUI":{ 97 | "description": "原生UI控件" 98 | }, 99 | "Navigator":{ 100 | "description": "浏览器信息" 101 | }, 102 | "NativeObj":{ 103 | "description": "原生对象" 104 | } 105 | }, 106 | "plus": { 107 | "splashscreen": { 108 | "autoclose": true,/*是否自动关闭程序启动界面,true表示应用加载应用入口页面后自动关闭;false则需调plus.navigator.closeSplashscreen()关闭*/ 109 | "waiting": true 110 | }, 111 | "runmode": "liberate",/*应用的首次启动运行模式,可取liberate或normal,liberate模式在第一次启动时将解压应用资源(Android平台File API才可正常访问_www目录)*/ 112 | "signature": "Sk9JTiBVUyBtYWlsdG86aHIyMDEzQGRjbG91ZC5pbw==",/*可选,保留给应用签名,暂不使用*/ 113 | "distribute": { 114 | "apple": { 115 | "appid": "",/*iOS应用标识,苹果开发网站申请的appid,如io.dcloud.HelloH5*/ 116 | "mobileprovision": "",/*iOS应用打包配置文件*/ 117 | "password": "",/*iOS应用打包个人证书导入密码*/ 118 | "p12": "",/*iOS应用打包个人证书,打包配置文件关联的个人证书*/ 119 | "devices": "universal",/*iOS应用支持的设备类型,可取值iphone/ipad/universal*/ 120 | "frameworks": [] 121 | }, 122 | "google": { 123 | "packagename": "",/*Android应用包名,如io.dcloud.HelloH5*/ 124 | "keystore": "",/*Android应用打包使用的密钥库文件*/ 125 | "password": "",/*Android应用打包使用密钥库中证书的密码*/ 126 | "aliasname": "",/*Android应用打包使用密钥库中证书的别名*/ 127 | "permissions": ["","","","","","","","","","","","","","","","","","","","","","","",""] 128 | }, 129 | "orientation": ["portrait-primary", "portrait-secondary"],/*应用支持的方向,portrait-primary:竖屏正方向;portrait-secondary:竖屏反方向;landscape-primary:横屏正方向;landscape-secondary:横屏反方向*/ 130 | "icons": { 131 | "ios": { 132 | "prerendered": true, /*应用图标是否已经高亮处理,在iOS6及以下设备上有效*/ 133 | "auto": "", /*应用图标,分辨率:512x512,用于自动生成各种尺寸程序图标*/ 134 | "iphone": { 135 | "normal": "",/*iPhone普通屏幕程序图标,分辨率:57x57*/ 136 | "retina": "",/*iPhone高分屏程序图标,分辨率:114x114*/ 137 | "retina7": "",/*iPhone iOS7高分屏程序图标,分辨率:120x120*/ 138 | "spotlight-normal": "", /*iPhone Spotlight搜索程序图标,分辨率:29x29*/ 139 | "spotlight-retina": "", /*iPhone高分屏Spotlight搜索程序图标,分辨率:58x58*/ 140 | "spotlight-retina7": "",/*iPhone iOS7高分屏Spotlight搜索程序图标,分辨率:80x80*/ 141 | "settings-normal": "", /*iPhone设置页面程序图标,分辨率:29x29*/ 142 | "settings-retina": "" 143 | }, 144 | "ipad": { 145 | "normal": "", /*iPad普通屏幕程序图标,分辨率:72x72*/ 146 | "retina": "", /*iPad高分屏程序图标,分辨率:144x144*/ 147 | "normal7": "", /*iPad iOS7程序图标,分辨率:76x76*/ 148 | "retina7": "", /*iPad iOS7高分屏程序图标,分辨率:152x152*/ 149 | "spotlight-normal": "", /*iPad Spotlight搜索程序图标,分辨率:50x50*/ 150 | "spotlight-retina": "", /*iPad高分屏Spotlight搜索程序图标,分辨率:100x100*/ 151 | "spotlight-normal7": "",/*iPad iOS7 Spotlight搜索程序图标,分辨率:40x40*/ 152 | "spotlight-retina7": "",/*iPad iOS7高分屏Spotlight搜索程序图标,分辨率:80x80*/ 153 | "settings-normal": "",/*iPad设置页面程序图标,分辨率:29x29*/ 154 | "settings-retina": "" 155 | } 156 | }, 157 | "android": { 158 | "mdpi": "", /*普通屏程序图标,分辨率:48x48*/ 159 | "ldpi": "", /*大屏程序图标,分辨率:48x48*/ 160 | "hdpi": "", /*高分屏程序图标,分辨率:72x72*/ 161 | "xhdpi": "",/*720P高分屏程序图标,分辨率:96x96*/ 162 | "xxhdpi": "" 163 | } 164 | }, 165 | "splashscreen": { 166 | "ios": { 167 | "iphone": { 168 | "default": "", /*iPhone3启动图片选,分辨率:320x480*/ 169 | "retina35": "",/*3.5英寸设备(iPhone4)启动图片,分辨率:640x960*/ 170 | "retina40": "" 171 | }, 172 | "ipad": { 173 | "portrait": "", /*iPad竖屏启动图片,分辨率:768x1004*/ 174 | "portrait-retina": "",/*iPad高分屏竖屏图片,分辨率:1536x2008*/ 175 | "landscape": "", /*iPad横屏启动图片,分辨率:1024x748*/ 176 | "landscape-retina": "", /*iPad高分屏横屏启动图片,分辨率:2048x1496*/ 177 | "portrait7": "", /*iPad iOS7竖屏启动图片,分辨率:768x1024*/ 178 | "portrait-retina7": "",/*iPad iOS7高分屏竖屏图片,分辨率:1536x2048*/ 179 | "landscape7": "", /*iPad iOS7横屏启动图片,分辨率:1024x768*/ 180 | "landscape-retina7": "" 181 | } 182 | }, 183 | "android": { 184 | "mdpi": "", /*普通屏启动图片,分辨率:240x282*/ 185 | "ldpi": "", /*大屏启动图片,分辨率:320x442*/ 186 | "hdpi": "", /*高分屏启动图片,分辨率:480x762*/ 187 | "xhdpi": "", /*720P高分屏启动图片,分辨率:720x1242*/ 188 | "xxhdpi": "" 189 | } 190 | } 191 | } 192 | }, 193 | "dependencies": { 194 | "pages": { 195 | "index.html": { 196 | "resources": [ 197 | "js/mui.min.js", 198 | "css/mui.min.css", 199 | "js/jquery-3.1.1/jquery-3.1.1.min.js", 200 | "common/drawMethod.js", 201 | "common/main.js", 202 | "common/common.js", 203 | "images/background.jpeg", 204 | "game/enemy.js", 205 | "game/main.js", 206 | "images/enemy/blowfish-icon.png", 207 | "images/enemy/octo-icon.png", 208 | "game/actor.js", 209 | "images/starfish-icon.png", 210 | "images/starfish-small.png", 211 | "images/starfish-middle.png", 212 | "game/crash.js", 213 | "game/effects.js", 214 | "game/data.js", 215 | "images/enemy/squid-icon-middle.png", 216 | "images/enemy/crab-icon-middle.png", 217 | "css/bootstrap.min.css" 218 | ], 219 | "refer": [ 220 | "main.html" 221 | ], 222 | "priority": 0 223 | }, 224 | "main.html": { 225 | "resources": [ 226 | "images/starfish-middle5.png", 227 | "images/starfish-middle1.png", 228 | "game/effects.js", 229 | "common/loadPic.js", 230 | "game/actor.js", 231 | "game/crash.js", 232 | "game/data.js", 233 | "images/enemy/crab-icon-middle.png", 234 | "css/bootstrap.min.css", 235 | "images/starfish-middle9.png", 236 | "game/enemy.js", 237 | "images/enemy/octo-icon.png", 238 | "js/jquery-3.1.1/jquery-3.1.1.min.js", 239 | "images/starfish-middle7.png", 240 | "images/starfish-small.png", 241 | "images/starfish-middle8.png", 242 | "images/enemy/blowfish-icon.png", 243 | "images/starfish-middle6.png", 244 | "common/common.js", 245 | "game/main.js", 246 | "images/starfish-middle3.png", 247 | "images/enemy/squid-icon-middle.png", 248 | "images/starfish-middle0.png", 249 | "images/starfish-middle2.png", 250 | "images/starfish-middle4.png", 251 | "images/background.jpeg", 252 | "js/mui.min.js", 253 | "css/mui.min.css" 254 | ], 255 | "refer": [], 256 | "priority": 0 257 | } 258 | }, 259 | "idle": { 260 | "resources": [ 261 | "fonts/mui.ttf", 262 | "js/mui.js", 263 | "css/mui.css" 264 | ] 265 | } 266 | } 267 | } -------------------------------------------------------------------------------- /setting.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 39 | 40 | 41 |
42 |
43 | 游戏难度 44 |
45 | 46 | 47 | 48 |
49 | 50 |
51 |
52 | 游戏模式 53 |
54 | 55 | 56 | 57 |
58 | 59 | 62 | 63 | 64 | 65 | 115 | 116 | 117 | -------------------------------------------------------------------------------- /test.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 40 | 41 | 42 |
43 |
44 |
45 |
46 |
47 | 48 | 49 | 50 | 51 | 71 | 72 | -------------------------------------------------------------------------------- /unpackage/.confirmed_dependencies: -------------------------------------------------------------------------------- 1 | { 2 | "index.html": { 3 | "resources": [ 4 | "js/mui.min.js", 5 | "css/mui.min.css", 6 | "js/jquery-3.1.1/jquery-3.1.1.min.js", 7 | "common/drawMethod.js", 8 | "common/main.js", 9 | "common/common.js", 10 | "images/background.jpeg", 11 | "game/enemy.js", 12 | "game/main.js", 13 | "images/enemy/blowfish-icon.png", 14 | "images/enemy/octo-icon.png", 15 | "game/actor.js", 16 | "images/starfish-icon.png", 17 | "images/starfish-small.png", 18 | "images/starfish-middle.png", 19 | "game/crash.js", 20 | "game/effects.js", 21 | "game/data.js", 22 | "images/enemy/squid-icon-middle.png", 23 | "images/enemy/crab-icon-middle.png", 24 | "css/bootstrap.min.css" 25 | ], 26 | "refer": [ 27 | "main.html" 28 | ] 29 | }, 30 | "main.html": { 31 | "resources": [ 32 | "images/starfish-middle5.png", 33 | "images/starfish-middle1.png", 34 | "game/effects.js", 35 | "common/loadPic.js", 36 | "game/actor.js", 37 | "game/crash.js", 38 | "game/data.js", 39 | "images/enemy/crab-icon-middle.png", 40 | "css/bootstrap.min.css", 41 | "images/starfish-middle9.png", 42 | "game/enemy.js", 43 | "images/enemy/octo-icon.png", 44 | "js/jquery-3.1.1/jquery-3.1.1.min.js", 45 | "images/starfish-middle7.png", 46 | "images/starfish-small.png", 47 | "images/starfish-middle8.png", 48 | "images/enemy/blowfish-icon.png", 49 | "images/starfish-middle6.png", 50 | "common/common.js", 51 | "game/main.js", 52 | "images/starfish-middle3.png", 53 | "images/enemy/squid-icon-middle.png", 54 | "images/starfish-middle0.png", 55 | "images/starfish-middle2.png", 56 | "images/starfish-middle4.png", 57 | "images/background.jpeg", 58 | "js/mui.min.js", 59 | "css/mui.min.css" 60 | ] 61 | } 62 | } --------------------------------------------------------------------------------