'use strict'; var apploaded = false; $( window ).load( function() { console.log('window loaded'); RemoveLoadingScreen(); } ) var paddleAnimation = 'blit'; // 'transition' // Piano notes based on set from University of Iowa Electronic Music Studios // http://theremin.music.uiowa.edu/MISpiano.html var numberoctaves = 8; var gameenabled = true; var gamerunning = false; var tickspersec = 60; var whitekeys = {}; whitekeys.Width = 20; whitekeys.Height = (5)*whitekeys.Width; var blackkeys = {}; blackkeys.Width = (1/2)*whitekeys.Width; blackkeys.Height = (2/3)*whitekeys.Height var rotateoffsety = (1/4)*numberoctaves*(whitekeys.Height-2*whitekeys.Width); var fontsize = (1/3)*whitekeys.Width; var appmargin = {}; appmargin.Left = 2*whitekeys.Width; appmargin.Right = 2*whitekeys.Width; appmargin.Top = 7*whitekeys.Width; appmargin.Bottom = 2*whitekeys.Width; var notelist = [ 'A0','Bb0','B0', 'C1','Db1','D1','Eb1','E1','F1','Gb1','G1','Ab1','A1','Bb1','B1', 'C2','Db2','D2','Eb2','E2','F2','Gb2','G2','Ab2','A2','Bb2','B2', 'C3','Db3','D3','Eb3','E3','F3','Gb3','G3','Ab3','A3','Bb3','B3', 'C4','Db4','D4','Eb4','E4','F4','Gb4','G4','Ab4','A4','Bb4','B4', 'C5','Db5','D5','Eb5','E5','F5','Gb5','G5','Ab5','A5','Bb5','B5', 'C6','Db6','D6','Eb6','E6','F6','Gb6','G6','Ab6','A6','Bb6','B6', 'C7','Db7','D7','Eb7','E7','F7','Gb7','G7','Ab7','A7','Bb7','B7', 'C8' ]; var keysarray = []; for (var ii=0; ii= paddle.Left) { if (ball.LeftNext <= paddle.Right) { if (ball.BottomNext >= paddle.Top) { if (ball.TopNext <= paddle.Bottom) { paddle.Intersected = true; } } } } if (paddle.Intersected === true) { // console.log('intersected'); ball.VX = ball.VX + paddle.VX; ball.VY = ball.VY + paddle.VY; if (ball.Left <= paddle.Left || ball.Left >= paddle.Right) { ball.VX = -1*ball.VX; // ball.VXNext = -1*ball.VX; // ball.LeftNext = ball.Left + 1*ball.VXNext*(1/tickspersec); } if (ball.Top >= paddle.Bottom || ball.Top <= paddle.Top) { ball.VY = -1*ball.VY; // ball.VYNext = -1*ball.VY; // ball.TopNext = ball.Top + 1*ball.VYNext*(1/tickspersec); } } if (paddleAnimation === 'blit') { if (keysdown['ArrowLeft']) { if (paddle.LeftNext <= gamemargin.Left) { paddle.LeftNext = gamemargin.Left; } else { paddle.LeftNext = paddle.LeftNext + -1*500/tickspersec; } } if (keysdown['ArrowRight']) { if (paddle.LeftNext >= gamemargin.Right - paddle.Width) { paddle.LeftNext = gamemargin.Right - paddle.Width; } else { paddle.LeftNext = paddle.LeftNext + 500/tickspersec; } } if (keysdown['ArrowUp']) { if (paddle.TopNext <= gamemargin.Top) { paddle.TopNext = gamemargin.Top; } else { paddle.TopNext = paddle.TopNext + -1*500/tickspersec; } } if (keysdown['ArrowDown']) { if (paddle.TopNext >= gamemargin.Bottom - paddle.Height) { paddle.TopNext = gamemargin.Bottom - paddle.Height; } else { paddle.TopNext = paddle.TopNext + 500/tickspersec; } } d3.select('.paddle').attr('x', paddle.LeftNext); d3.select('.paddle').attr('y', paddle.TopNext); } else if (paddleAnimation === 'transition') { d3.select('.paddle') .transition() .attr('x', function() { if (keysdown['ArrowLeft']) { return paddle.Left - 2000/tickspersec; } else if (keysdown['ArrowRight']) { return paddle.Left + 2000/tickspersec; } else { return paddle.Left; } }) .attr('y', function() { if (keysdown['ArrowUp']) { return paddle.Top - 2000/tickspersec; } else if (keysdown['ArrowDown']) { return paddle.Top + 2000/tickspersec; } else { return paddle.Top; } }) .duration(1000/tickspersec) .ease('linear'); } d3.select('.ball') // .transition() .attr('x', function() { if (ball.LeftNext <= gamemargin.Left) { ball.VXNext = -1*ball.VX; ball.LeftNext = ball.Left + 1*ball.VXNext*(1/tickspersec); shaking = true; shakex = shakefactor*10*(-1*ball.VX/(1+Math.abs(ball.VX))); // shakex = 0; shakey = 0; } else if (ball.RightNext >= gamemargin.Right) { ball.VXNext = -1*ball.VX; ball.LeftNext = ball.Left + 1*ball.VXNext*(1/tickspersec); shaking = true; shakex = shakefactor*10*(-1*ball.VX/(1+Math.abs(ball.VX))); // shakex = 0; shakey = 0; } else { ball.VXNext = ball.VX; } ball.VX = ball.VXNext; return ball.LeftNext; }) .attr('y', function() { if (ball.TopNext <= gamemargin.Top) { ball.VYNext = -1*ball.VY; ball.TopNext = ball.Top + 1*ball.VYNext*(1/tickspersec); shaking = true; shakex = 0; shakey = shakefactor*10*(-1*ball.VY/(1+Math.abs(ball.VY))); shakey = 0; } else if (ball.BottomNext >= gamemargin.Bottom) { ball.VYNext = -1*ball.VY; ball.TopNext = ball.Top + 1*ball.VYNext*(1/tickspersec); shaking = true; shakex = 0; shakey = shakefactor*10*(-1*ball.VY/(1+Math.abs(ball.VY))); // shakey = 0; } else { ball.VYNext = ball.VY; } ball.VY = ball.VYNext; return ball.TopNext; }) // .duration(1000/tickspersec) // .ease('linear'); ; if (shaking === true) { ShakeViewBox(shakex, shakey); shaking = false; } } function DrawLoadingScreen() { var tempsvg = body .append('svg') .classed('loading', true) .style('position', 'absolute') .style('top', '0px') .style('left', '0px') .attr('width', 1150) .attr('height', 650) .attr('opacity', 0.9); tempsvg.append('rect') // .style('pointer-events', 'all') // .attr('x', -500) // .attr('y', -500) .attr('x', 0) .attr('y', 0) .attr('width', 1150) .attr('height', 650) .attr('fill', 'white'); tempsvg.append('text') // .style('pointer-events', 'none') .attr('y', 200) .attr('font-size', 50) .text('Loading...'); } function RemoveLoadingScreen() { d3.selectAll('.loading').transition() .ease('exp-in') .duration(1000) .attr('opacity', 0) .each('end', function() { d3.selectAll('.loading').remove(); apploaded = true; }); } function ElementAnimationScale(tempthis, thiswidth, tscale) { var thisx = parseFloat(tempthis.getAttribute('x')); var thisy = parseFloat(tempthis.getAttribute('y')); return d3.select(tempthis).transition() .attr('transform', function() { var step1 = 'translate(' + String(thisx+thiswidth/2) + ',' + String(thisy+thiswidth/2) + ')'; var step2 = 'scale(' + String(tscale) + ')'; var step3 = 'translate(' + String(-thisx-thiswidth/2) + ',' + String(-thisy-thiswidth/2) + ')'; return step1 + ' ' + step2 + ' ' + step3;}) .duration(scaleduration) .ease(scaleease); } function angleTween(d, sign, chirality) { if (chirality === 'clockwise') { var angle = (-1)*360*rotations.magnitude*d.Left; } if (chirality === 'counterclockwise') { var angle = (1)*360*rotations.magnitude*d.Left; } if (sign === -1) { var interpolater = d3.interpolate(0, angle); } if (sign === 1) { var interpolater = d3.interpolate(angle, 0); } return function(t) { return 'rotate(' + interpolater(t) + ' ' + rotations.originx + ',' + rotations.originy + ')'; }; } function HammerStrike(passedthis) { d3.select(passedthis.parentNode).select('.hammers') .transition() .attr('transform', 'translate(0,'+String((-1)*whitekeys.Width)+')') .duration(hammerupduration) .ease(hammerupease) .each('end', function() { StringStrike(passedthis); }); } function HammerReturn(passedthis, passeddelay) { d3.select(passedthis.parentNode).select('.hammers') .transition() .attr('transform', 'translate(0)') .duration(hammerdownduration) .ease(hammerdownease) .delay(passeddelay); } function StringStrike(passedthis) { d3.select(passedthis.parentNode).select('.strings') .transition() .attr('transform', 'translate(0,'+String((-1)*whitekeys.Width/2)+')') .duration(200) .ease('circle-out') .transition() .attr('transform', 'translate(0)') .duration(200) .ease('circle-in') .transition() .attr('transform', 'translate(0,'+String((1)*whitekeys.Width/2)+')') .duration(200) .ease('circle-out') .transition() .attr('transform', 'translate(0)') .duration(200) .ease('circle-in'); } function ShakeViewBox(shakex, shakey) { d3.select(svg[0][0]).transition() .attr('viewBox', shakex+','+shakey+','+svgmargin.Width+','+svgmargin.Height) .duration(shakeoutduration) .ease(shakeoutease) .transition() .attr('viewBox', 0+','+0+','+svgmargin.Width+','+svgmargin.Height) .duration(shakeinduration) .ease(shakeinease) // .transition() // .attr('viewBox', (-1*shakex)+','+(-1*shakey)+','+svgmargin.Width+','+svgmargin.Height) // .duration(shakeduration) // .ease(shakeease) // .transition() // .attr('viewBox', 0+','+0+','+svgmargin.Width+','+svgmargin.Height) // .duration(shakeduration) // .ease(shakeease) ; } function endall(transition, callback) { var n = 0; transition .each(function() { ++n; }) .each('end', function() { if (!--n) callback.apply(this, arguments); }); } function CheckCollision() { d3.selectAll('.keys') .attr('collision', function(d, i) { var thiskey = d3.select(this); keyleft = parseFloat(thiskey.attr('x')); keyright = keyleft + d.Width; keytop = parseFloat(thiskey.attr('y')); keybottom = keytop + d.Height; if (ball.LeftNext >= keyleft) { if (ball.LeftNext <= keyright) { // if (ball.TopNext >= keytop) { if (ball.TopNext <= keybottom) { if (keypressedarray[i] === false) { keypressedarray[i] = true; lastkeypressed = this; thiskey.attr('fill', 'red'); HammerStrike(this); d.Note.pause(); d.Note.currentTime = 0; d.Note.play(); thiskey.transition() .duration(500) .ease('circle-out') .attr('fill', d.Color) .each('end', function() { keypressedarray[i] = false; }); HammerReturn(this, 150); } } // } } } }) } function GameStart() { gamerunning = true; gametimer = setInterval(GameLoop, 1000/tickspersec); } function GameStop() { gamerunning = false; clearInterval(gametimer); }