User Tools

Site Tools


script_llxperiment_boing_no_overlap

====== Differences ====== This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revision Previous revision
Next revision
Previous revision
script_llxperiment_boing_no_overlap [2014/05/17 20:30]
lm13 [About the script]
script_llxperiment_boing_no_overlap [2016/06/28 12:31] (current)
f43nd1r
Line 1: Line 1:
 ====== About the script ====== ====== About the script ======
   * Purpose : This script will bounce all items randomly around,they will bounce off the screen borders and each other.   * Purpose : This script will bounce all items randomly around,they will bounce off the screen borders and each other.
-  * Author : [[https://​plus.google.com/​+LukasMorawietz|LM13]]+  * Author : F43nd1r
   * Concept : This script is based on the [[script_llxperiment_boing|boing script]] by TrianguloY   * Concept : This script is based on the [[script_llxperiment_boing|boing script]] by TrianguloY
-  * Current Version : 1.0+  * Current Version : 1.1
   * Link : https://​plus.google.com/​105066926163073195690/​posts/​BMYiNUEss8B (scroll down in the comments) ​   * Link : https://​plus.google.com/​105066926163073195690/​posts/​BMYiNUEss8B (scroll down in the comments) ​
 +  * Video : https://​plus.google.com/​115366157037831519359/​posts/​SXcGo6A2gDo
  
 ====== Changelog ====== ​ ====== Changelog ====== ​
   * Version 1.0 (3/5/2014): initial release in wiki   * Version 1.0 (3/5/2014): initial release in wiki
 +  * Version 1.1 (18/​5/​2014):​ reduced jumps
  
 ====== How to use the script ====== ====== How to use the script ======
Line 23: Line 25:
  
 ====== Script code ====== ====== Script code ======
-<​code>​var bounciness = 0.95;//​Reduction every tick, between 0 (only one tick) and 1 (always bouncing) [Recommended 0.95] +<​code>​ 
-var inVel = 0.//initial velocity. set it to 0 for random one [recommended 0.5]+var bounciness = 1;//​Reduction every tick, between 0 (only one tick) and 1 (always bouncing) [Recommended 0.95] 
 +var inVel = 0.02 //initial velocity. set it to 0 for random one [recommended 0.5]
  
-var frecuency = 60;//ticks per second [Recommended 60]+var frecuency = 1000;//ticks per second [Recommended 60]
  
  
Line 32: Line 35:
 var event = LL.getEvent();​ var event = LL.getEvent();​
 var cont = event.getContainer();​ var cont = event.getContainer();​
-var items=cont.getItems();​+var items; 
 +items=cont.getItems();​
 for(var i=items.getLength()-1;​ i>​=0;​--i){ for(var i=items.getLength()-1;​ i>​=0;​--i){
 var item=items.getAt(i);​ var item=items.getAt(i);​
 if(item.getType()=="​StopPoint"​)continue;​ if(item.getType()=="​StopPoint"​)continue;​
 var ang = Math.random()*2*Math.PI;​ var ang = Math.random()*2*Math.PI;​
- var invel=inVel;​ if(invel<​=0)invel=Math.random();​+var invel=inVel;​ if(invel<​=0)invel=Math.random();​
 invel*=(cont.getHeight()+cont.getWidth())/​2;​ invel*=(cont.getHeight()+cont.getWidth())/​2;​
 +//saving item specific data in the tag
 var data=new Object(); var data=new Object();
 data.vel = [ Math.cos(ang)*invel , Math.sin(ang)*invel ]; data.vel = [ Math.cos(ang)*invel , Math.sin(ang)*invel ];
- +
 data.size = [ item.getWidth()*item.getScaleX() , item.getHeight()*item.getScaleY() ]; data.size = [ item.getWidth()*item.getScaleX() , item.getHeight()*item.getScaleY() ];
 item.setTag(JSON.stringify(data));​ item.setTag(JSON.stringify(data));​
Line 48: Line 53:
  
 function tick(){ function tick(){
-var changed=false;​+var changed=false;​//value if something changed
 for(var a=items.getLength()-1;​ a>​=0;​--a){ for(var a=items.getLength()-1;​ a>​=0;​--a){
 var i=items.getAt(a);​ if(i.getType()=="​StopPoint"​)continue;​ var i=items.getAt(a);​ if(i.getType()=="​StopPoint"​)continue;​
 var data=JSON.parse(i.getTag());​ var data=JSON.parse(i.getTag());​
- //exit statement+//continue ​statement
 if((Math.abs(data.vel[0])<​0.2 && Math.abs( data.vel[1])<​0.2)||LL.isPaused()) continue; if((Math.abs(data.vel[0])<​0.2 && Math.abs( data.vel[1])<​0.2)||LL.isPaused()) continue;
 var changed=true;​ var changed=true;​
  
- //​Reduction +//​Reduction 
-  data.vel=[ data.vel[0]*bounciness , data.vel[1]*bounciness ​]; + ​data.vel=[ data.vel[0]*bounciness , data.vel[1]*bounciness ];
-  +
- var newpos = [ i.getPositionX()+ data.vel[0] , i.getPositionY()+ data.vel[1] ​];+
  
 +var newpos = [ i.getPositionX()+ data.vel[0] , i.getPositionY()+ data.vel[1] ];
 +
 +//checking all other items after the current for overlap
 for(var b=a-1; b>​=0;​--b){ for(var b=a-1; b>​=0;​--b){
 var i2=items.getAt(b);​ if(i2.getType()=="​StopPoint"​)continue;​ var i2=items.getAt(b);​ if(i2.getType()=="​StopPoint"​)continue;​
 var data2=JSON.parse(i2.getTag());​ var data2=JSON.parse(i2.getTag());​
 var newpos2 = [ i2.getPositionX()+ data2.vel[0] , i2.getPositionY()+ data2.vel[1] ]; var newpos2 = [ i2.getPositionX()+ data2.vel[0] , i2.getPositionY()+ data2.vel[1] ];
-var p; +var p;//new position of the item with the smaller width/​height 
-var p2; +var p2;//higher width/​height 
-var s; +var s;//size of the item with the smaller width/​height 
-var s2;+var s2; //higher width/​height 
 +//​horizonatal:​
 if(data.size[0]<​data2.size[0]) if(data.size[0]<​data2.size[0])
 { {
 + //the first item is smaller
 p=newpos[0] p=newpos[0]
 p2=newpos2[0];​ p2=newpos2[0];​
Line 78: Line 86:
 else else
 { {
 + //the second item is smaller
 p=newpos2[0] p=newpos2[0]
 p2=newpos[0];​ p2=newpos[0];​
Line 83: Line 92:
 s2= data.size[0];​ s2= data.size[0];​
 } }
-var overx= ((p2<​p&&​p<​p2+s2)||(p2<​p+s&&​p+s<​p2+s2));​+var overx= ((p2<​p&&​p<​p2+s2)||(p2<​p+s&&​p+s<​p2+s2));​//check if horizontal coordinates match 
 +//the same again, but for vertical
 if(data.size[1]<​data2.size[1]) if(data.size[1]<​data2.size[1])
 { {
Line 100: Line 110:
 var overy= ((p2<​p&&​p<​p2+s2)||(p2<​p+s&&​p+s<​p2+s2));​ var overy= ((p2<​p&&​p<​p2+s2)||(p2<​p+s&&​p+s<​p2+s2));​
 if(overx && overy){ if(overx && overy){
- distl=newpos2[0]+data2.size[0]-newpos[0];​ + //the distances on the sides of the first items, how far it overlaps 
- distr=newpos[0]+data.size[0]-newpos2[0];​ +distl=newpos2[0]+data2.size[0]-newpos[0];​ 
- distt=newpos2[1]+data2.size[1]-newpos[1];​ +distr=newpos[0]+data.size[0]-newpos2[0];​ 
- distb=newpos[1]+data.size[1]-newpos2[1];​ +distt=newpos2[1]+data2.size[1]-newpos[1];​ 
- if(data.vel[0]>​0) +distb=newpos[1]+data.size[1]-newpos2[1];​ 
-+if(distr<​distb ​&& distr<​distt && distr<​distl)//​overlapping right 
- if(data.vel[1]>​0) +
-+newpos[0]-=2*distr;​ 
- if(distr<​distb) +data.vel[0]=-data.vel[0];​ 
- +data2.vel[0]=-data.vel[0];​ 
- newpos[0]-=2*distr;​ +
- data.vel[0]=-data.vel[0];​ +else if(distb<​distt && distb<​distl)//​overlapping bottom 
- data2.vel[0]=-data.vel[0];​ +
- +newpos[1]-=2*distb;​ 
- else +data.vel[1]=-data.vel[1];​ 
- +data2.vel[1]=-data.vel[1];​ 
- newpos[1]-=2*distb;​ +
- data.vel[1]=-data.vel[1];​ +else if(distt<distl)//​overlapping top 
- data2.vel[1]=-data.vel[1];​ +
- +newpos[1]+=2*distt
- +data.vel[1]=-data.vel[1]; 
- else +data2.vel[1]=-data.vel[1]; 
-+
- if(distr<distt+else //​overlapping left 
- +
- newpos[0]-=2*distr+newpos[0]+=2*distl
- data.vel[0]=-data.vel[0]; +data.vel[0]=-data.vel[0]; 
- data2.vel[0]=-data.vel[0]; +data2.vel[0]=-data.vel[0];
- +
- else +
- +
- newpos[1]+=2*distt+
- data.vel[1]=-data.vel[1]; +
- data2.vel[1]=-data.vel[1]; +
-+
- }+
 } }
-else{ 
- if(data.vel[1]>​0) 
- { 
- if(distl<​distb) 
- { 
- newpos[0]+=2*distl;​ 
- data.vel[0]=-data.vel[0];​ 
- data2.vel[0]=-data.vel[0];​ 
- } 
- else 
- { 
- newpos[1]-=2*distb;​ 
- data.vel[1]=-data.vel[1];​ 
- data2.vel[1]=-data.vel[1];​ 
- } 
- } 
- else{ 
- if(distl<​distt) 
- { 
- newpos[0]+=2*distl;​ 
- data.vel[0]=-data.vel[0];​ 
- data2.vel[0]=-data.vel[0];​ 
- } 
- else 
- { 
- newpos[1]+=2*distt;​ 
- data.vel[1]=-data.vel[1];​ 
- data2.vel[1]=-data.vel[1];​ 
- } 
- } 
- 
 } }
 i2.setTag(JSON.stringify(data2));​ i2.setTag(JSON.stringify(data2));​
 } }
-  + 
-  + 
- var t; +var t; 
- //right +//right 
- t=(newpos[0]+ data.size[0])-( cont.getPositionX()+cont.getWidth()/​cont.getPositionScale() ) ; +t=(newpos[0]+ data.size[0])-( cont.getPositionX()+cont.getWidth()/​cont.getPositionScale() ) ; 
- if(t>​0){newpos[0]-=2*t;​ data.vel[0]=-data.vel[0];​} +if(t>​0){newpos[0]-=2*t;​ data.vel[0]=-data.vel[0];​} 
-  + 
- //bottom +//bottom 
- t=(newpos[1]+ data.size[1])-( cont.getPositionY()+cont.getHeight()/​cont.getPositionScale() ) ; +t=(newpos[1]+ data.size[1])-( cont.getPositionY()+cont.getHeight()/​cont.getPositionScale() ) ; 
- if(t>​0){newpos[1]-=2*t;​ data.vel[1]=-data.vel[1];​} +if(t>​0){newpos[1]-=2*t;​ data.vel[1]=-data.vel[1];​} 
-  + 
- //left +//left 
- t= newpos[0]- cont.getPositionX();​ +t= newpos[0]- cont.getPositionX();​ 
- if(t<​0){newpos[0]-=2*t;​ data.vel[0]=-data.vel[0];​} +if(t<​0){newpos[0]-=2*t;​ data.vel[0]=-data.vel[0];​} 
-  + 
- //top +//top 
- t= newpos[1]- cont.getPositionY();​ +t= newpos[1]- cont.getPositionY();​ 
- if(t<​0){newpos[1]-=2*t;​ data.vel[1]=-data.vel[1];​} +if(t<​0){newpos[1]-=2*t;​ data.vel[1]=-data.vel[1];​} 
-  + 
- //​set ​and repeat +//set 
- i.setPosition(newpos[0] , newpos[1] );+i.setPosition(newpos[0] , newpos[1] );
 i.setTag(JSON.stringify(data));​ i.setTag(JSON.stringify(data));​
- +
- if(!changed)return;​ +if(!changed)return;​ 
- setTimeout(tick,​1000/​frecuency);​+//repeat 
 +setTimeout(tick,​1000/​frecuency);​
 } }
 </​code>​ </​code>​
script_llxperiment_boing_no_overlap.1400358640.txt.gz · Last modified: 2014/05/17 20:30 by lm13