Advertisement
Sheepolution

flux.js

Sep 24th, 2019
146
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. var getFlux;
  2. var getTween;
  3.  
  4. getFlux = function () {
  5.     var flux = { _version : "0.1.5" };
  6.     var tween = getTween();
  7.     flux.list = [];
  8.     flux.objects = {};
  9.  
  10.     flux.tweens = {};
  11.     flux.easing = { linear : function(p) { return p; } };
  12.  
  13.     var easing = {
  14.     quad    : "p * p",
  15.     cubic   : "p * p * p",
  16.     quart   : "p * p * p * p",
  17.     quint   : "p * p * p * p * p",
  18.     expo    : "2 ^ (10 * (p - 1))",
  19.     sine    : "-Math.cos(p * (Math.pi * .5)) + 1",
  20.     circ    : "-(Math.sqrt(1 - (p * p)) - 1)",
  21.     back    : "p * p * (2.7 * p - 1.7)",
  22.     elastic : "-(2^(10 * (p - 1)) * Math.sin((p - 1.075) * (Math.PI * 2) / .3))"
  23.     }
  24.  
  25.     var makefunc = function(str, expr) {
  26.         return new Function("p", str.split("$e").join(expr));
  27.     }
  28.  
  29.     for (var k in easing) {
  30.         var v = easing[k];
  31.  
  32.         flux.easing[k + "in"] = makefunc("return $e", v)
  33.  
  34.         flux.easing[k + "out"] = makefunc(`
  35.         p = 1 - p;
  36.         return 1 - ($e);
  37.         `, v)
  38.  
  39.         flux.easing[k + "inout"] = makefunc(`
  40.         p = p * 2
  41.         if (p < 1) {
  42.             return .5 * ($e);
  43.         }
  44.         else {
  45.             p = 2 - p;
  46.             return .5 * (1 - ($e)) + .5;
  47.         }
  48.         `, v)
  49.     }
  50.  
  51.  
  52.     flux.group = function () {
  53.         return getFlux();
  54.     }
  55.  
  56.     flux.to = function (obj, time, vars) {
  57.         return flux.add(tween.new(obj, time, vars));
  58.     }
  59.  
  60.     flux.update = function (deltatime) {
  61.         for (let i = 0; i < this.list.length; i++) {
  62.             var t = this.list[i];
  63.             if (t._delay > 0) {
  64.                 t._delay = t._delay - deltatime;
  65.             }
  66.             else {
  67.                 if (!t.inited) {
  68.                     flux.clear(t.obj, t.vars);
  69.                     t.init();
  70.                 }
  71.                 if (t._onstart) {
  72.                     t._onstart();
  73.                     t._onstart = null;
  74.                 }
  75.                 t.progress = t.progress + t.rate * deltatime;
  76.                 var p = t.progress;
  77.                 var x = p >= 1 ? 1 : flux.easing[t._ease](p);
  78.                 for (var k in t.vars) {
  79.                     var v = t.vars[k];
  80.                     t.obj[k] = v.start + x * v.diff;
  81.                 }
  82.                 if (t._onupdate) { t._onupdate(); }
  83.                 if (p >= 1) {
  84.                     flux.remove(i);
  85.                     if (t._oncomplete) { t._oncomplete(); }
  86.                 }
  87.             }
  88.         }
  89.     }
  90.  
  91.     flux.clear = function (obj, vars) {
  92.         for (var t in this.objects[obj]) {
  93.             if (t.inited) {
  94.                 for (var k in vars) {
  95.                     t.vars[k] = null;
  96.                 }
  97.             }
  98.         }
  99.     }
  100.  
  101.     flux.add = function (tween) {
  102.         var obj = tween.obj;
  103.         this.objects[obj] = this.objects[obj] || {};
  104.         this.objects[obj][tween] = true;
  105.         this.list.push(tween);
  106.         tween.parent = this;
  107.         return tween;
  108.     }
  109.  
  110.     flux.remove = function (x) {
  111.         if (typeof(x) == "number") {
  112.             var obj = this.list[x].obj;
  113.             delete this.objects[obj][this.list[x]];
  114.             if (Object.keys(this.objects[obj]).length == 0) { delete this.objects[obj] }
  115.  
  116.             this.list[x] = this.list[this.list.length - 1];
  117.             return this.list.pop();
  118.         }
  119.  
  120.         for (let i = 0; i < this.list.length; i++) {
  121.             if (this.list[i] == x) {
  122.                 return this.remove(i);
  123.             }
  124.         }
  125.     }
  126.  
  127.     return flux;
  128. }
  129.  
  130.  
  131. getTween = function() {
  132.     var tween = {}
  133.  
  134.     var makefsetter = function(field) {
  135.       return function(x) {
  136.         if (typeof(x) != "function") {
  137.             console.error("expected function or callable");
  138.         }
  139.         var old = this[field];
  140.         this[field] = old ? function() { old(); x(); } : x;
  141.         return this;
  142.       }
  143.     }
  144.  
  145.     var makesetter = function(field, checkfn, errmsg) {
  146.       return function(x) {
  147.         if (checkfn && !checkfn(x)) {
  148.           console.logerror(errmsg.replace("$x", x.toString()));
  149.         }
  150.         this[field] = x;
  151.         return this;
  152.       }
  153.     }
  154.  
  155.     tween.ease  = makesetter("_ease",
  156.                              function(x) { return flux.easing[x] },
  157.                              "bad easing type '$x'");
  158.     tween.delay = makesetter("_delay",
  159.                              function(x) { return typeof(x) == "number" },
  160.                              "bad delay time; expected number");
  161.     tween.onstart     = makefsetter("_onstart");
  162.     tween.onupdate    = makefsetter("_onupdate");
  163.     tween.oncomplete  = makefsetter("_oncomplete");
  164.  
  165.     tween.new = function(obj, time, vars) {
  166.         var self = getTween();
  167.         self.obj = obj
  168.         self.rate = time > 0 ? 1 / time : 0
  169.         self.progress = time > 0 ? 0 : 1
  170.         self._delay = 0
  171.         self._ease = "quadout"
  172.         self.vars = {}
  173.         for (var k in vars) {
  174.             var v = vars[k];
  175.             if (typeof(v) != "number") {
  176.                 console.error("bad value for key '" + k + "'; expected number");
  177.             }
  178.             self.vars[k] = v
  179.         }
  180.         return self
  181.     }
  182.  
  183.     tween.init = function() {
  184.         for (var k in this.vars) {
  185.             var v = this.vars[k];
  186.             var x = this.obj[k];
  187.             if (typeof(x) != "number") {
  188.                 console.error("bad value on object key '" + k + "'; expected number");
  189.             }
  190.             this.vars[k] = { start : x, diff : v - x };
  191.         }
  192.         this.inited = true
  193.     }
  194.  
  195.     tween.after = function(...args) {
  196.         var t;
  197.         if (args.length == 2) {
  198.             t = tween.new(this.obj, ...args);
  199.         }
  200.         else {
  201.             t = tween.new(...args);
  202.         }
  203.         t.parent = this.parent;
  204.         var that = this;
  205.         this.oncomplete(function () { flux.add.apply(that.parent, [t]) });
  206.         return t;
  207.     }
  208.  
  209.     tween.stop = function () {
  210.         flux.remove.apply(this.parent, [this]);
  211.     }
  212.  
  213.     return tween;
  214. }
  215.  
  216. flux = getFlux();
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement