====== Differences ====== This shows you the differences between two versions of the page.
| 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 | + | * 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.5 //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> | ||