====== 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 10:24] lm13 |
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 : ... | + | * 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> |