Advertisement
terorama

jQuery Billiard

Nov 20th, 2012
68
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
jQuery 11.28 KB | None | 0 0
  1. //--------------------------------------------------
  2. _glo = {
  3.  
  4.   startc:'',
  5.   finc:'',
  6.  
  7.   stringl:[],
  8.   balls:[],
  9.   looses:[],
  10.   //-------------------------
  11.   hex2dec: function(hnumber) {
  12.     return parseInt(hnumber,16);
  13.   },
  14.   //-------------------------
  15.   dec2hex: function(dnumber) {
  16.      return dnumber.toString(16);
  17. },
  18.  
  19.   //-------------------------
  20.   step100: function(start,fin, step) {
  21.    
  22.     return Math.floor(start+(fin - start)/100*step);
  23.   },
  24.   //-------------------------
  25.  
  26.   col2rgb: function(hcolor) {
  27.  
  28.   var cols=[];  
  29.   var c = hcolor.slice(1);
  30.     cols.push(this.hex2dec(c.slice(0,2)));
  31.     cols.push(this.hex2dec(c.slice(2,4)));
  32.     cols.push(this.hex2dec(c.slice(4,6)));
  33.    
  34.    return cols;          
  35. },
  36.  
  37.   tr: function(mes) {
  38.     this.informer.append($('<p/>').html(mes));
  39.   }
  40.  
  41. }
  42.  
  43. //--------------------------------------------------
  44.  
  45.   _hc = {
  46.    
  47.  
  48.     //----------------------
  49.     rn : function (x) {
  50.    
  51.     var x = x || 255;
  52.      
  53.     var colors=[];
  54.      
  55.       for (var i=0; i<3;i++) {
  56.         colors.push(Math.floor(Math.random()*x));
  57.       }
  58.      
  59.     return 'rgb('+colors[0]+','+colors[1]+','+colors[2]+')';
  60.          
  61.   },
  62.     //----------------------
  63.     grad : function(step) {
  64.      
  65.       var startC = _glo.col2rgb(_glo.startc);
  66.       var finC = _glo.col2rgb(_glo.finc);
  67.      
  68.      
  69.       var r = _glo.step100(finC[0] ,startC[0],step);
  70.       var g = _glo.step100(finC[1] ,startC[1],step);
  71.       var b = _glo.step100(finC[2] ,startC[2],step);
  72.      
  73.       return 'rgb('+r+','+g+','+b+')';
  74.      
  75.    
  76.   }
  77.    
  78.    
  79.   }
  80.  
  81. //--------------------------------------------------
  82. _hlp = {
  83.  
  84.  
  85.  
  86.   apel: function(class4,x,y, par) {
  87.  
  88.   var par = par || $(document.body);
  89.  
  90.   var el= $('<div/>',{class:class4})
  91.     .css({'left':x, 'top':y});
  92.  
  93.  
  94.   $(par).append(el);
  95.    
  96.     return el;
  97. },
  98.  
  99.   //-----------------------------------
  100.   apels: function (class4, x,y, count4, par) {
  101.    
  102.     elarr = new Array();
  103.    
  104.     for (var i=0; i<count4; i++) {
  105.      
  106.       var el =this.apel(class4,x,y,par);
  107.       elarr.push(el);
  108.     }
  109.    
  110.     return elarr;
  111.   },
  112.  
  113.   //-----------------------------------
  114.   setbg: function(els, func) {
  115.    
  116.  
  117.     for (var i=0; i<els.length; i++) {
  118.      
  119.       var step = Math.floor((i/els.length)*100);
  120.       var color= func(step);
  121.      
  122.       els[i].css('background-color', color);
  123.     }
  124.    
  125.     },
  126.  
  127.   //-----------------------------------
  128.   setpos: function(els, coords) {
  129.    
  130.     for (var i=0; i<els.length; i++) {
  131.      
  132.       var step = Math.floor((i/els.length)*100);
  133.      
  134.       var x = _glo.step100(coords.x1,coords.x2,step);
  135.       var y = _glo.step100(coords.y1,coords.y2,step);
  136.      
  137.       els[i].css('left',x);
  138.       els[i].css('top',y);
  139.     }
  140.   },
  141.   //-----------------------------------
  142.   shoot: function(els, targ) {
  143.    
  144.     return $.Deferred(
  145.      
  146.     function(dfd) {
  147.    
  148.     var numfin=0;  
  149.     for (var i=0; i<els.length; i++) {
  150.      
  151.       els[i].animate({
  152.            left: targ.offset().left+16,
  153.         top: targ.offset().top+16},{duration:200,easing:'',
  154.        
  155.                        complete: function() {
  156.                        numfin++;
  157.                        
  158.                        if (numfin==els.length) {
  159.                          dfd.resolve();
  160.                        }
  161.                                     }}
  162.                      
  163.                     )
  164.     }
  165.        
  166.    
  167.     });
  168.    
  169.   },
  170.   //-----------------------------------
  171.   moveball: function(targ_) {
  172.    
  173.     _selfh=this;
  174.    
  175.     if (targ_.data('bint'))
  176.        clearInterval(targ_.data('bint'));
  177.    
  178.       targ_.data('bint', setInterval(
  179.         //----------------------------------
  180.         function() {
  181.          
  182.            var l = targ_.offset().left;
  183.            var t = targ_.offset().top;
  184.          
  185.            var w = targ_.width();
  186.            var h = targ_.height();
  187.          
  188.            var dx = targ_.data('vector').dx;
  189.            var dy = targ_.data('vector').dy;
  190.          
  191.            
  192.          
  193.           if ((l+dx>window.innerWidth-w) || (l+dx<0)) {
  194.             l-=dx;
  195.             dx=-dx/2;
  196.            
  197.           }
  198.          
  199.           if ((t+dy>window.innerHeight-h) || (t+dy<0)) {
  200.             t-=dy;
  201.             dy=-dy/2;
  202.            
  203.           }
  204.           dx*=0.995;
  205.           dy*=0.995;
  206.            
  207.             if ((Math.abs(dx)<0.3) && (Math.abs(dy)<0.3)) {
  208.               clearInterval(targ_.data('bint'));
  209.             }
  210.          
  211.          
  212.            targ_.css('left',l+dx);
  213.            targ_.css('top',t+dy);
  214.           targ_.data('vector',{dx:dx,dy:dy})
  215.          
  216.          
  217.           var wt=targ_.data('waitout');
  218.           if (wt>0)
  219.              targ_.data('waitout',wt-1);
  220.           else    
  221.              for (var i=0; i<_glo.balls.length; i++) {
  222.                 _selfh.isCollide(targ_, _glo.balls[i]);
  223.              };
  224.          
  225.          
  226.           for (var i=0; i<_glo.looses.length; i++) {
  227.              _selfh.isGoal(targ_, _glo.looses[i]);
  228.            }
  229.          
  230.        
  231.        
  232.      
  233.     },10));
  234.   },
  235.  
  236.   //-----------------------------------
  237.   isCollide :function(targ_, ball_, check) {
  238.    
  239.      var l = targ_.offset().left;
  240.      var t = targ_.offset().top;
  241.    
  242.      var l3 = ball_.offset().left;
  243.      var t3 = ball_.offset().top;
  244.    
  245.      var rad = targ_.width()/2;
  246.      var xc = l+rad;
  247.      var yc = t+rad;
  248.    
  249.      var rad3 = ball_.width()/2;
  250.      var xc3 = l3+rad3;
  251.      var yc3 = t3+rad3;
  252.    
  253.      if (targ_.get(0)===ball_.get(0))
  254.         return;
  255.    
  256.      if (Math.sqrt(Math.pow(xc-xc3,2)+Math.pow(yc-yc3,2))>rad+rad3)
  257.         return false;
  258.    
  259.      if (check) return true;
  260.      
  261.      //_glo.tr('collide');
  262.    
  263.      //this.fireworks(targ_);
  264.      targ_.data('waitout',2);
  265.      ball_.data('waitout',2);
  266.    
  267.    
  268.      var dx = targ_.data('vector').dx;
  269.      var dy = targ_.data('vector').dy;
  270.    
  271.      var vmod = Math.sqrt(dx*dx+dy*dy); //----module of 1 ball before
  272.  
  273.      var phi = Math.asin(dy/vmod); //----angle of first ball
  274.    
  275.      var dx3 = xc3-xc;
  276.      var dy3 = yc3-yc;
  277.      var vmod3 = Math.sqrt(dx3*dx3+dy3*dy3); //---distance between centers
  278.    
  279.      var psy = Math.asin(dy3/vmod3); //----angle between centers
  280.      
  281.      
  282.    
  283.      var vmod4 = vmod*Math.cos(phi-psy);//---module of 2 ball
  284.      var vmod5 = vmod*Math.sin(phi-psy); //--module of 1 ball after
  285.    
  286.      vmod4z = vmod4;// * vmod / (vmod4+vmod5);
  287.      vmod5z = vmod5;// * vmod / (vmod4+vmod5);
  288.  
  289.      var dx4 = vmod4z*Math.cos(psy);  //---vector of 2 ball
  290.      var dy4 = vmod4z*Math.sin(psy);
  291.    
  292.      var dx5 = vmod5z*Math.cos(1.57+psy);
  293.      var dy5 = vmod5z*Math.sin(1.57+psy);
  294.    
  295.    
  296.     ball_.data('vector',{dx: dx4, dy: dy4});
  297.     targ_.data('vector',{dx: dx5, dy: dy5});
  298.    
  299.    
  300.     this.moveball(ball_);
  301.    
  302.   },
  303.  
  304.   //-----------------------------------
  305.   isGoal: function(targ_,loose_) {
  306.    
  307.      var l = targ_.offset().left;
  308.      var t = targ_.offset().top;
  309.    
  310.      var l3 = loose_.offset().left;
  311.      var t3 = loose_.offset().top;
  312.    
  313.      var rad = targ_.width()/2;
  314.      var xc = l+rad;
  315.      var yc = t+rad;
  316.    
  317.      var rad3 = loose_.width()/2;
  318.      var xc3 = l3+rad3;
  319.      var yc3 = t3+rad3;
  320.    
  321.    
  322.    
  323.      if (Math.sqrt(Math.pow(xc-xc3,2)+Math.pow(yc-yc3,2))>rad+rad3)
  324.         return false;
  325.    
  326.      clearInterval(targ_.data('bint'));
  327.      _glo.tr('goal');
  328.    
  329.      this.fireworks(targ_);
  330.      targ_.remove();
  331.   },
  332.  
  333.   //-----------------------------------
  334.   fireworks : function(targ_) {
  335.    
  336.     for (i=0; i<40; i++) {
  337.       var el = this.apel('dot',targ_.offset().left, targ_.offset().top);
  338.       el.css('background-color',_hc.rn(255));
  339.              
  340.              el.animate(
  341.              {left:Math.random()*window.innerWidth-200,
  342.               top:Math.random()*window.innerHeight-200, opacity:0},
  343.           500)
  344.           .queue(function() {$(this).remove()})      
  345.     }
  346.   },
  347.   //-----------------------------------
  348.   appwEvs: function(el) {
  349.    
  350.     if (!_glo.evman)
  351.        _glo.evman = new Evman();
  352.    
  353.     _glo.evman.hook(el);
  354.    
  355.  
  356.  
  357. }}
  358.  
  359. //--------------------------------------------------
  360. //--------------------------------------------------
  361.   Evman = function() {
  362.    
  363.     _self=this;
  364.    
  365.    
  366.     this.hook = function(el) {
  367.      
  368.       el.on('mousedown', this.mouseDown);
  369.      
  370.      
  371.     }
  372.    
  373.     //--------------------------------
  374.     this.mouseDown = function(ev) {
  375.      
  376.       var ev = ev || event;
  377.    
  378.       _self.targ=$(this);
  379.      
  380.       if (_self.targ.data('bint')) {
  381.         clearInterval(_self.targ.data('bint'));
  382.       }
  383.      
  384.        $(window).on('mouseup', _self.mouseUp);
  385.        $(window).on('mousemove',_self.mouseMove);
  386.      
  387.        if (ev.preventDefault)
  388.           ev.preventDefault();
  389.        else
  390.          ev.returnValue=false;
  391.     }
  392.      
  393.     //--------------------------------
  394.       this.mouseMove = function(ev) {
  395.        
  396.         var ev = ev || event;
  397.        
  398.         mouseX = ev.clientX;
  399.         mouseY = ev.clientY;
  400.        
  401.         tX = _self.targ.offset().left+16;
  402.         tY = _self.targ.offset().top+16;
  403.        
  404.        
  405.         _self.targ.data('vector',{dx:(tX-mouseX)/20, dy:(tY-mouseY)/20});
  406.        
  407.         _hlp.setpos(_glo.stringl,
  408.                     {x1:tX,x2:mouseX,y1:tY, y2:mouseY});
  409.        
  410.         if (!_self.vis) {
  411.            $('.dot').fadeIn('fast');
  412.            _self.vis=true;
  413.         }
  414.       }
  415.    
  416.      
  417.     //--------------------------------
  418.         this.mouseUp = function(ev) {
  419.          
  420.           var ev = ev || event;
  421.          
  422.          
  423.           $(this).off('mouseup');
  424.           $(this).off('mousemove');
  425.          
  426.          
  427.          
  428.           $.when(_hlp.shoot(_glo.stringl, _self.targ)).done(
  429.            
  430.             function() {
  431.              
  432.                $('.dot').fadeOut('fast');
  433.             _self.vis=false;
  434.             //_hlp.fireworks(_self.targ);
  435.             _hlp.moveball(_self.targ);
  436.            
  437.             });
  438.         }
  439.   }
  440.  
  441.  
  442.  
  443. $(document).ready(
  444.   init
  445. )
  446.                  
  447.  
  448.   //--------------------------------------------------
  449.   //--------------------------------------------------
  450.   function init() {
  451.  
  452.    _glo.informer = _hlp.apel('informer',100,0);
  453.    _glo.tr('start');
  454.    _glo.stringl = _hlp.apels('dot',200,200,20);
  455.     $('.dot').css('display','none');
  456.  
  457.    _glo.startc='#0000ff';
  458.    _glo.finc='#ff0000';
  459.    
  460.    
  461.    _hlp.setbg(_glo.stringl, _hc.grad);
  462.     _hlp.setpos(_glo.stringl, {x1:100,x2:400,y1:100,y2:400});
  463.    
  464.    
  465.     for (var i=0; i<15; i++) {
  466.        var el=_hlp.apel('ball',
  467.                     100+Math.random()*(window.innerWidth-250),
  468.          100+Math.random()*(window.innerHeight-250));
  469.        _hlp.appwEvs(el);
  470.        _glo.balls.push(el);
  471.     }
  472.    
  473.     _hlp.setbg(_glo.balls, function() {return _hc.rn(255);});
  474.    
  475.     var lx=[0, window.innerWidth-110, window.innerWidth/2];
  476.     var ly=[0, window.innerHeight-110, window.innerHeight/2];
  477.     for (var i=0; i<9; i++) {
  478.      
  479.        if (i==8) continue;
  480.        var el=_hlp.apel('loose',
  481.                     lx[i % 3], ly[Math.floor(i/3)]);
  482.        
  483.        
  484.        _glo.looses.push(el);
  485.     }
  486.   }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement