TadpoleTail.js 2.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475
  1. var TadpoleTail = function(tadpole) {
  2. var tail = this;
  3. tail.joints = [];
  4. var tadpole = tadpole;
  5. var jointSpacing = 1.4;
  6. var animationRate = 0;
  7. tail.update = function() {
  8. animationRate += (.2 + tadpole.momentum / 10);
  9. for(var i = 0, len = tail.joints.length; i < len; i++) {
  10. var tailJoint = tail.joints[i];
  11. var parentJoint = tail.joints[i-1] || tadpole;
  12. var anglediff = (parentJoint.angle - tailJoint.angle);
  13. while(anglediff < -Math.PI) {
  14. anglediff += Math.PI * 2;
  15. }
  16. while(anglediff > Math.PI) {
  17. anglediff -= Math.PI * 2;
  18. }
  19. tailJoint.angle += anglediff * (jointSpacing * 3 + (Math.min(tadpole.momentum / 2, Math.PI * 1.8))) / 8;
  20. tailJoint.angle += Math.cos(animationRate - (i / 3)) * ((tadpole.momentum + .3) / 40);
  21. if(i == 0) {
  22. tailJoint.x = parentJoint.x + Math.cos(tailJoint.angle + Math.PI) * 5;
  23. tailJoint.y = parentJoint.y + Math.sin(tailJoint.angle + Math.PI) * 5;
  24. } else {
  25. tailJoint.x = parentJoint.x + Math.cos(tailJoint.angle + Math.PI) * jointSpacing;
  26. tailJoint.y = parentJoint.y + Math.sin(tailJoint.angle + Math.PI) * jointSpacing;
  27. }
  28. }
  29. };
  30. tail.draw = function(context) {
  31. var path = [[],[]];
  32. for(var i = 0, len = tail.joints.length; i < len; i++) {
  33. var tailJoint = tail.joints[i];
  34. var falloff = (tail.joints.length - i) / tail.joints.length;
  35. var jointSize = (tadpole.size - 1.8) * falloff;
  36. var x1 = tailJoint.x + Math.cos(tailJoint.angle + Math.PI * 1.5) * jointSize;
  37. var y1 = tailJoint.y + Math.sin(tailJoint.angle + Math.PI * 1.5) * jointSize;
  38. var x2 = tailJoint.x + Math.cos(tailJoint.angle + Math.PI / 2) * jointSize;
  39. var y2 = tailJoint.y + Math.sin(tailJoint.angle + Math.PI / 2) * jointSize;
  40. path[0].push({x: x1, y: y1});
  41. path[1].push({x: x2, y: y2});
  42. }
  43. for(var i = 0; i < path[0].length; i++) {
  44. context.lineTo(path[0][i].x, path[0][i].y);
  45. }
  46. path[1].reverse();
  47. for(var i = 0; i < path[1].length; i++) {
  48. context.lineTo(path[1][i].x, path[1][i].y);
  49. }
  50. };
  51. (function() {
  52. for(var i = 0; i < 15; i++) {
  53. tail.joints.push({
  54. x: 0,
  55. y: 0,
  56. angle: Math.PI*2,
  57. })
  58. }
  59. })();
  60. }