public override void Update(float dt) { base.Update(dt); //update puck CCPoint ballNextPosition = _ball.NextPosition; CCPoint ballVector = _ball.Vector; ballVector = CCPointExHelper.ccpMult(ballVector, 0.98f); ballNextPosition.X += ballVector.X; ballNextPosition.Y += ballVector.Y; //test for puck and mallet collision float squared_radii = (float)Math.Pow(_player1.radius + _ball.radius, 2); GameSprite player; CCPoint playerNextPosition; CCPoint playerVector; for (int p = 0; p < _players.Length; p++) { //if (p == 0) // continue; player = _players[p]; playerNextPosition = player.NextPosition; playerVector = player.Vector; float diffx = ballNextPosition.X - player.PositionX; float diffy = ballNextPosition.Y - player.PositionY; float distance1 = CCMathExHelper.pow(diffx, 2) + CCMathExHelper.pow(diffy, 2); float distance2 = CCMathExHelper.pow(_ball.PositionX - playerNextPosition.X, 2) + CCMathExHelper.pow(_ball.PositionY - playerNextPosition.Y, 2); if (distance1 <= squared_radii || distance2 <= squared_radii) { float mag_ball = CCMathExHelper.pow(ballVector.X, 2) + CCMathExHelper.pow(ballVector.Y, 2); float mag_player = CCMathExHelper.pow(playerVector.X, 2) + CCMathExHelper.pow(playerVector.Y, 2); float force = CCMathExHelper.sqrt(mag_ball + mag_player); float angle = CCMathExHelper.atan2(diffy, diffx); ballVector.X = force * CCMathExHelper.cos(angle); ballVector.Y = (force * CCMathExHelper.sin(angle)); ballNextPosition.X = playerNextPosition.X + (player.radius + _ball.radius + force) * CCMathExHelper.cos(angle); ballNextPosition.Y = playerNextPosition.Y + (player.radius + _ball.radius + force) * CCMathExHelper.sin(angle); PlayHit(); //CCSimpleAudioEngine.SharedEngine.PlayEffect("hit"); } } ////check collision of ball and sides if (ballNextPosition.X < _ball.radius) { ballNextPosition.X = _ball.radius; ballVector.X *= -0.8f; PlayHit(); //CCSimpleAudioEngine.SharedEngine.PlayEffect("hit"); } if (ballNextPosition.X > _screenSize.Width - _ball.radius) { ballNextPosition.X = _screenSize.Width - _ball.radius; ballVector.X *= -0.8f; PlayHit(); //CCSimpleAudioEngine.SharedEngine.PlayEffect("hit"); } //ball and top of the court if (ballNextPosition.Y > _screenSize.Height - _ball.radius) { if (_ball.PositionX < _screenSize.Width * 0.5f - GOAL_WIDTH * 0.5f || _ball.PositionX > _screenSize.Width * 0.5f + GOAL_WIDTH * 0.5f) { ballNextPosition.Y = _screenSize.Height - _ball.radius; ballVector.Y *= -0.8f; PlayHit(); //CCSimpleAudioEngine.SharedEngine.PlayEffect("hit"); } } //ball and bottom of the court if (ballNextPosition.Y < _ball.radius) { if (_ball.PositionX < _screenSize.Width * 0.5f - GOAL_WIDTH * 0.5f || _ball.PositionX > _screenSize.Width * 0.5f + GOAL_WIDTH * 0.5f) { ballNextPosition.Y = _ball.radius; ballVector.Y *= -0.8f; PlayHit(); } } ////finally, after all checks, update ball's vector and next position _ball.Vector = ballVector; _ball.NextPosition = ballNextPosition; ////check for goals! if (ballNextPosition.Y < -_ball.radius * 2) { playerScore(2); } //} if (ballNextPosition.Y > _screenSize.Height + _ball.radius * 2) { playerScore(1); } ////move pieces to next position _player1.Position = _player1.NextPosition; // ->setPosition(_player1->getNextPosition()); _player2.Position = _player2.NextPosition; //->setPosition(_player2->getNextPosition()); _ball.Position = _ball.NextPosition; //->setPosition(_ball->getNextPosition()); }
public override void Update(float dt) { base.Update(dt); if (!_running) { return; } int count; int i; CCSprite sprite; //update timers _meteorTimer += dt; if (_meteorTimer > _meteorInterval) { _meteorTimer = 0; resetMeteor(); } _healthTimer += dt; if (_healthTimer > _healthInterval) { _healthTimer = 0; resetHealth(); } _difficultyTimer += dt; if (_difficultyTimer > _difficultyInterval) { _difficultyTimer = 0; increaseDifficulty(); } if (_bomb.Visible) { if (_bomb.ScaleX > 0.3f) { if (_bomb.Opacity != 255) { _bomb.Opacity = 255; } } } //check collision with shockwave if (_shockWave.Visible) { count = _fallingObjects.Count; float diffx; float diffy; for (i = count - 1; i >= 0; i--) { sprite = (CCSprite)_fallingObjects[i]; diffx = _shockWave.PositionX - sprite.PositionX; diffy = _shockWave.PositionY - sprite.PositionY; if (CCMathExHelper.pow(diffx, 2) + CCMathExHelper.pow(diffy, 2) <= CCMathExHelper.pow(_shockWave.BoundingBox.Size.Width * 0.5f, 2)) { sprite.StopAllActions(); sprite.RunAction(_explosion); CCSimpleAudioEngine.SharedEngine.PlayEffect("music/boom"); if (sprite.Tag == kSpriteMeteor) { _shockwaveHits++; _score += _shockwaveHits * 13 + _shockwaveHits * 2; } //play sound _fallingObjects.RemoveAt(i); } } _scoreDisplay.Text = String.Format("{0}", _score); } //move clouds count = _clouds.Count; for (i = 0; i < count; i++) { sprite = _clouds[i]; sprite.PositionX = sprite.PositionX + dt * 20; if (sprite.PositionX > _screenSize.Width + sprite.BoundingBox.Size.Width * 0.5f) { sprite.PositionX = -sprite.BoundingBox.Size.Width * 0.5f; } } }