Ejemplo n.º 1
0
        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());
        }
Ejemplo n.º 2
0
        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;
                }
            }
        }