CBall.js 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190
  1. function CBall(CGameRef){
  2. var _bFrozen = false;
  3. var _fMass = INIT_BALLMASS_NORMAL;
  4. var _fTheta = 0;
  5. var _fAngVel = 0;
  6. var _fFriction = FRICTION_NORMAL;
  7. var _fEdgesFriction = EDGEFRICTION_NORMAL;
  8. var _fRotationSpeed = ROTATIONSPEED_NORMAL;
  9. var _fMaxXKickForce = HORIZ_KICKFORCE_NORMAL;
  10. var _fMaxYKickForce = VERT_KICKFORCE_NORMAL;
  11. var _fBounceKickForce = RESTITUTION_KICKFORCE_NORMAL;
  12. var _v2Pos;
  13. var _v2Vel;
  14. var _v2Acc;
  15. var _v2Gravity = new CVector2(0, INIT_GRAVITY_NORMAL);
  16. var _oSprite;
  17. var _oShadowSprite;
  18. var _oHitSprite;
  19. var _oHitArea;
  20. var _refCGame;
  21. this._init = function(CGameRef){
  22. var szBallType = "ball_" + Math.floor(Math.random()*3 + 1);
  23. _oSprite = createBitmap(s_oSpriteLibrary.getSprite(szBallType));
  24. _oSprite.regX = BALL_SIZE/2;
  25. _oSprite.regY = BALL_SIZE/2;
  26. _oSprite.x = CANVAS_WIDTH/2;
  27. _oSprite.y = CANVAS_HEIGHT/2;
  28. _oShadowSprite = createBitmap(s_oSpriteLibrary.getSprite('shadow'));
  29. _oShadowSprite.regX = SHADOW_WIDTH/2;
  30. _oShadowSprite.regY = SHADOW_HEIGHT/2;
  31. _oShadowSprite.x = _oSprite.x;
  32. _oShadowSprite.y = CANVAS_HEIGHT - BALL_BOUNCE_YOFFSET;
  33. _oShadowSprite.alpha = 0.65;
  34. _oHitSprite = createBitmap(s_oSpriteLibrary.getSprite('ball_hit'));
  35. _oHitSprite.regX = BALL_SIZE/2;
  36. _oHitSprite.regY = BALL_SIZE/2;
  37. _oHitSprite.x = CANVAS_WIDTH/2;
  38. _oHitSprite.y = CANVAS_HEIGHT/2;
  39. _oHitSprite.alpha = 0;
  40. _oHitArea = createBitmap(s_oSpriteLibrary.getSprite('hit_area_ball'));
  41. _oHitArea.regX = BALL_SIZE/2;
  42. _oHitArea.regY = BALL_SIZE/2;
  43. _oHitArea.x = CANVAS_WIDTH/2;
  44. _oHitArea.y = CANVAS_HEIGHT/2;
  45. s_oStage.addChild(_oShadowSprite);
  46. s_oStage.addChild(_oSprite);
  47. s_oStage.addChild(_oHitSprite);
  48. s_oStage.addChild(_oHitArea);
  49. _oHitArea.on("mousedown",this.clicked,this);
  50. _v2Pos = new CVector2(_oSprite.x,_oSprite.y);
  51. _v2Vel = new CVector2(0,0);
  52. _v2Acc = new CVector2(0,0);
  53. _refCGame = CGameRef;
  54. };
  55. this.unload = function(){
  56. s_oStage.removeChild(_oSprite,_oShadowSprite,_oHitSprite);
  57. _oSprite = undefined;
  58. };
  59. this.update = function(){
  60. _v2Acc.addV(_v2Gravity);
  61. this._friction();
  62. _v2Vel.addV(_v2Acc);
  63. _v2Pos.addV(_v2Vel);
  64. _v2Acc._init(0,0);
  65. _oSprite.x = _v2Pos.getX();
  66. _oSprite.y = _v2Pos.getY();
  67. _fAngVel = _v2Vel.getX();
  68. _fTheta += _fAngVel;
  69. _oSprite.rotation = _fTheta * _fRotationSpeed;
  70. _oShadowSprite.x = _oSprite.x;
  71. _oShadowSprite.scaleX = _oShadowSprite.scaleY = _oSprite.y / (CANVAS_HEIGHT - BALL_SIZE/2 - BALL_BOUNCE_YOFFSET);
  72. _oShadowSprite.alpha = _oSprite.y / (CANVAS_HEIGHT - BALL_SIZE/2 - BALL_BOUNCE_YOFFSET);
  73. _oHitSprite.x = _oSprite.x;
  74. _oHitSprite.y = _oSprite.y;
  75. _oHitSprite.rotation = _fTheta * _fRotationSpeed;
  76. _oHitArea.x = _v2Pos.getX();
  77. _oHitArea.y = _v2Pos.getY();
  78. };
  79. this.checkEdges = function(){
  80. if (_v2Pos.getX() < BALL_SIZE/2) {
  81. _v2Pos.set(BALL_SIZE/2,_v2Pos.getY());
  82. _v2Vel.set(-(1- _fEdgesFriction)*_v2Vel.getX(),_v2Vel.getY());
  83. } else if (_v2Pos.getX() > CANVAS_WIDTH - BALL_SIZE/2) {
  84. _v2Pos.set(CANVAS_WIDTH - BALL_SIZE/2,_v2Pos.getY());
  85. _v2Vel.set(-(1- _fEdgesFriction)*_v2Vel.getX(),_v2Vel.getY());
  86. };
  87. if (_v2Pos.getY() > CANVAS_HEIGHT - BALL_SIZE/2 - BALL_BOUNCE_YOFFSET) {
  88. _v2Pos.set(_v2Pos.getX(),CANVAS_HEIGHT - BALL_SIZE/2 - BALL_BOUNCE_YOFFSET);
  89. _v2Vel.set(_v2Vel.getX(),-(1- _fEdgesFriction)*_v2Vel.getY());
  90. return true;
  91. };
  92. };
  93. this.applyForce = function(v2Force){
  94. var f = new CVector2(v2Force.getX(),v2Force.getY());
  95. f.scalarDivision(_fMass);
  96. _v2Acc.addV(f);
  97. };
  98. this.clicked = function(evt){
  99. if(s_bClickBall === false){
  100. return;
  101. }
  102. playSound("tap", 1, false);
  103. _refCGame.increaseScore();
  104. _refCGame.playerAnim(_v2Pos.getX(),_v2Pos.getY());
  105. // "bounce" preserved force
  106. _v2Vel.set(-(_fBounceKickForce)*_v2Vel.getX(),
  107. -(_fBounceKickForce)*_v2Vel.getY());
  108. var point = _oHitArea.globalToLocal(evt.rawX, evt.rawY);
  109. var _v2ClickDiff = new CVector2( -8 * ( (point.x - BALL_SIZE/2) ), - 1 * Math.abs(point.y - (_v2Pos.getY() - BALL_SIZE/2)));
  110. _v2ClickDiff.normalize();
  111. var _v2KickForce = new CVector2(_v2ClickDiff.getX()*_fMaxXKickForce,
  112. _v2ClickDiff.getY()*_fMaxYKickForce - 0);
  113. this.applyForce(_v2KickForce);
  114. // click tween
  115. if(_bFrozen === false){
  116. _bFrozen = true;
  117. createjs.Tween.get(_oSprite)
  118. .to({scaleX:1.15,scaleY:0.85}, 100,createjs.Ease.cubicIn)
  119. .call(function(){
  120. createjs.Tween.get(_oSprite).
  121. to({scaleX:1,scaleY:1}, 100,createjs.Ease.cubicOut)
  122. });
  123. createjs.Tween.get(_oHitSprite)
  124. .to({scaleX:1.15,scaleY:0.85,alpha: 0.4}, 100,createjs.Ease.cubicIn)
  125. .call(function(){
  126. createjs.Tween.get(_oHitSprite).
  127. to({scaleX:1,scaleY:1,alpha: 0}, 100,createjs.Ease.cubicOut).
  128. call(function(){
  129. _bFrozen = false;
  130. });
  131. });
  132. };
  133. };
  134. this._friction = function(){
  135. var v2Friction = new CVector2(_v2Vel.getX(),_v2Vel.getY());
  136. v2Friction.scalarProduct(-1);
  137. v2Friction.normalize();
  138. v2Friction.scalarProduct(_fFriction);
  139. this.applyForce(v2Friction);
  140. };
  141. this._v2Limit = function(v2,fLimit){
  142. if (v2.length() >= fLimit) {
  143. v2.normalize();
  144. v2.scalarProduct(fLimit);
  145. };
  146. };
  147. this._init(CGameRef);
  148. }