- Author:
- Eugene Formanenko
- Twitter:
- @
- GitHub:
- Facebook:
- Google+:
- +
- Reddit:
- /r/
- Pouet:
- Website:
- Compo:
- canvas
- Demo link:
- https://js1k.com/2015-hypetrain/demo/2241
- Shortlink:
- https://js1k.com/2241
- Blog post:
- please update here!
- Bytes:
- 1024
- Chars:
- 1024
- Submission
for(_='p.~~xW,WUq.T,TQ+=O*(N};K=d.J.4*H,h=G*L+E("D-1B0;@~y,(d){functionup==(){&&(=M?0,c.for();B.5N),)1>~Jpage)?1H-Y,VstrokeMath.O3<abs( w in if(q=p[d])onmouse~a=W,~b=JkeyCodesqrt(g*g+h*h)=max(min(n)p=n[w],c)c[w[0]+[w[6]]]=c[w];Y=55@V=M=38@mM=!M;n=[];S=1;L50:35;x7:12;C.15:.5;P60:9@v=R=F=a=b=@v<L-2@v++)u=@u<L;u++)n.push({d:v?1:!M&&u%2,x:2Eu*x,y:v*x,l:u?n[vE(uB)]:t:v?n[(vB)Eu]:0}KAce(i=sR(IDl"IDt"~d||!S?(Rg=W-aG-b,20>~a=Wa-e~b=b-f))r=(W-~a)N==VB?.9:.99t=(-~b)NS?.99:1)+C*S,UOrOtU rx||W>Yr: ty||>Vt:WYBU)VB))):(W=~a=~bXDt"XDl"fxDVr:"+LNL-20)+" Ls:"+i,115requestAnimationFrame(A)K Xba(arc(W,~d?F:2,2*PIm(Wl(TxQyM&&--w||(Style="hslD+[160N1-Tc100*Tc*!M+"%,58%)"]()} Ig=Tx-WGTy-,k=,l=(x-k)/k,y=k/P,i++,1<yp[d]=0g=Hg*lGHh*lQxOgQyOhQc=yU-=g-=h}onkeyS^71?S:!S;F^86?F:!F;77=&&m()Kdown=RJtype[7]Kmove=e=a;f=b;aX;bYKm(A(';g=/[^ -?ACFILMPRSVX-}]/.exec(_);)with(_.split(g))_=join(shift());eval(_)
- Description
- Control: M-switch mode G-toggle gravity V-show all vertices
Try to tear the curtain with mouse. Also you can throw up broken parts!
- Base64 encoded
Zm9yKF89J3Aufn54VyxXVXEuVCxUUSs9TyooTn07Sz1kLkouNCpILGg9RypMK0UoIkQtMUIwO0B+eR8sHx4oZCl7HWZ1bmN0aW9uHHVwPRwdGz0cKCl7GiYmKBk9TT8YMCwXYy4WZm9yKBUpOxRCLjVOEyksEikZMT5+EUpwYWdlECk/MUgtDxcXWSxWDhZzdHJva2UMTWF0aC4LTzM8C2FicygJFXcgaW4gCGlmKHE9cFtkXSkHb25tb3VzZQZ+YT1XLH5iPR8FSmtleUNvZGUEC3NxcnQoZypnK2gqaCkDPQttYXgoFwttaW4oAhQIbilwPW5bd10sAQhjKWNbd1swXStbd1s2XV1dPWNbd107WT01NUBWPU09MzhAbRpNPSFNO249W107Uz0xO0wYNTA6MzU7eBg3OjEyO0MYLjE1Oi41O1AYNjA6OUAVdj1SPUY9YT1iPUB2PEwtMkB2KyspFXU9QHU8TDt1Kyspbi5wdXNoKHtkOnY/MTohTSYmdSUyLHg6MkV1KngseTp2KngsbDp1P25bdkUodUIpXToXdDp2P25bKHZCKUV1XTowfQEFS0EaFmNlKGk9DhQWc1IoDgFJRGwiEklEdCIBfmR8fCFTPyhSGWc9Vy1hRx8tYiwyMD4DGX5hPVcTYS1lEn5iPR8TYi1mKSkScj0oVy1+YSlOHz09VkI/Ljk6Ljk5EnQ9KB8tfmIpTlM/Ljk5OjEpK0MqUywFVU9yHk90VQlyEXh8fFc+WQ9yOhcfCXQReXx8Hz5WD3Q6F1cCWUJVKRIfAlZCHikpKTooVz1+YR49fmISWER0IhJYRGwiFBZmeERWcjoiK0xOTC0yMCkrIiBMczoiK2ksMRcxNRRyZXF1ZXN0QW5pbWF0aW9uRnJhbWUoQSlLHCBYHRZiYSgUFmFyYyhXHix+ZD9GOjIsFzIqC1BJFAcWbShXHhIWbChUeFF5Ek0mJi0td3x8KAxTdHlsZT0iaHNsRCtbMTYwTjEtVGMSMTAwKlRjKiFNKyIlLDU4JSkiXRQMKCl9HCBJHQdnPVR4LVdHVHktHyxrPQMsbD0oeC1rKS9rLHk9ay9QLGkrKywxPHkZcFtkXT0wEmc9SGcqbEdIaCpsUXhPZ1F5T2hRYz15VS09Zx4tPWh9b25rZXkbUwReNzE/UzohUztGBF44Nj9GOiFGOzc3PQQmJm0oKUsGZG93bj0GG1JKdHlwZVs3XUsGbW92ZT0cHWU9YTtmPWI7YRBYO2IQWUttKBRBKBQnO2c9L1teIC0/QUNGSUxNUFJTVlgtfV0vLmV4ZWMoXyk7KXdpdGgoXy5zcGxpdChnKSlfPWpvaW4oc2hpZnQoKSk7ZXZhbChfKQ==
- Original source
//Width
W = 550;
//Height and Mode
H = M = 380;
z = function () {
// Toggle mode
M = !M
// Points
P = []
// Gravity enable
G = 1
// Horizontal number of points
w = M ? 50 : 35
// Length between points
s = M ? 7 : 12
// Gravity force
g = M ? .15 : .5
// Tear j
d = M ? 60 : 90
for (y=m=E=r=t=0; y < w-20; y ) {
for (x=0; x<w; x ) {
P.push({
//If points is dynamic
dynamic: !y ? !M && x%2 : 1,
x: w*2 x*s,
y: y*s,
'l': x ? P[y * w (x-1)] : 0,
't': y ? P[(y-1) * w x] : 0
})
}
}
// Cache initial value of x && y
for (i in P) {
p = P[i]
p.X = p.x
p.Y = p.y
}
}
//Animation function
A = function () {
c.clearRect(C=0, 0, W, H)
c.strokeRect(0, 0, W, H)
for (i in P) {
p = P[i];
S('l') , S('t')
}
for (i in P) {
p = P[i];
if (p.dynamic || !G) {
if (m) {
x = p.x - r;
y = p.y - t;
if (Math.sqrt(x*x y*y) < 20) {
p.X = p.x - (r - R) * 1.8
p.Y = p.y - (t - T) * 1.8
}
}
u = (p.x - p.X) * (p.y == H - 1 ? .9 :.99)
v = (p.y - p.Y) * (G ? .99 : 1) g * G;
p.X = p.x
p.Y = p.y
p.x = u;
p.y = v;
p.x = Math.abs(u) > 3 && (p.x<1 || p.x>W) ? -u * 1.4 : 0
p.y = Math.abs(v) > 3 && (p.y<1 || p.y>H) ? -v * 1.4 : 0
p.x = Math.max(0, Math.min(W-1, p.x))
p.y = Math.max(0, Math.min(H-1, p.y))
}
else {
p.x = p.X
p.y = p.Y
}
D('t') , D('l')
}
c.fillText('Vr:' w*(w-20) ' Ls:' C, 10, 15)
requestAnimationFrame(A)
}
function D(a) {
c.beginPath();
c.arc(p.x, p.y, p.dynamic ? E : 2, 0, 2*Math.PI)
if (l = p[a]) {
c.moveTo(p.x, p.y)
c.lineTo(l.x, l.y)
if (!M || i - 1 == 0) {
c.strokeStyle = 'hsl(' [(1-l.d)*160, 100 *l.d * !M '%,58%)']
}
}
c.stroke()
}
function S(a) {
if (l = p[a]) {
x = l.x - p.x
y = l.y - p.y
j = Math.sqrt(x*x y*y)
J = (s-j)/j
e = j/d
C ;
if (e > 1) {
p[a] = 0
}
x *= J*.4
y *= J*.4
l.x = x
l.y = y
l.d = e
p.x -= x
p.y -= y
}
}
onkeyup = function (e) {
G = e.keyCode ^ 71 ? G : !G
E = e.keyCode ^ 86 ? E : !E
if (e.keyCode == 77) {
z()
}
}
onmousedown = onmouseup = function (e) {
m = e.type[7]
}
onmousemove = function (e) {
//Mouse positions
R = r
T = t
r = e.pageX
t = e.pageY
}
z();
A();