예제 #1
0
파일: Pong.cs 프로젝트: Maskl/MetroRetro
        public override void Update(DeviceContext context, TargetBase target, DeviceManager deviceManager, Point screenSize, float dt, float elapsedTime)
        {
            if (AfterStartFreeze)
            {
                // Player moving
                _playerPos =
                    _playerPos.Add(_playerDir.Mul(_playerSpd).Mul(dt)).Clamp(GamesParams.Margin0.Add(_padSize.Half()),
                                                                             GamesParams.Margin1.Sub(_padSize.Half()));

                // Ball moving
                _ballPos = _ballPos.Add(_ballDir.Mul(_ballSpd).Mul(dt));

                // Ball collision with borders
                if (!_ballPos.IsInside(GamesParams.Margin0.Add(_ballSize.Half()),
                                       GamesParams.Margin1.Sub(_ballSize.Half())))
                {
                    _ballDir.Y = -_ballDir.Y;

                    if (_ballPos.X < GamesParams.MarginX0 + 0.001f)
                    {
                        NewGame();
                        _gameManager.Die();
                        return;
                    }

                    if (_ballPos.X > GamesParams.MarginX1 - 0.001f)
                    {
                        _gameManager.Win(500);
                        _ballPos = new Point(0.5f, 0.5f);
                        _ballDir = new Point(1.0f, 0.0f).AddNoise().Normalise();
                        return;
                    }
                }

                _ballPos = _ballPos.Clamp(GamesParams.Margin0.Add(_ballSize.Half()),
                                          GamesParams.Margin1.Sub(_ballSize.Half()));

                // Ball collision with player pad
                if (_ballPos.IsInside(_playerPos.Sub(_padSize.Half()).Sub(_ballSize.Half()),
                                      _playerPos.Add(_padSize.Half()).Add(_ballSize.Half())))
                {
                    _ballDir.X = 1;
                    _ballDir.Y = _ballPos.Sub(_playerPos).Y/_padSize.Half().Y;
                    _ballDir = _ballDir.Normalise();

                    _ballSpd += _ballSpdInc;

                    _gameManager.AddPoints(75);
                }

                // Ball collision with enemy pad
                if (_ballPos.IsInside(_enemyPos.Sub(_padSize.Half()).Sub(_ballSize.Half()),
                                      _enemyPos.Add(_padSize.Half()).Add(_ballSize.Half())))
                {
                    _ballDir.X = -1;
                    _ballDir.Y = _ballPos.Sub(_enemyPos).Y/_padSize.Half().Y;
                    _ballDir = _ballDir.Normalise();

                    _ballSpd += _ballSpdInc;
                }

                // Enemy moving
                if (Math.Abs(_ballPos.Y - _enemyPos.Y) < _padSize.Div(3).Y)
                {
                    _enemyDir.Y = 0;
                }
                else
                {
                    if (_ballPos.Y > _enemyPos.Y)
                        _enemyDir.Y = 1;
                    else
                        _enemyDir.Y = -1;

                    _enemyPos =
                        _enemyPos.Add(_enemyDir.Mul(_enemySpd).Mul(dt)).Clamp(GamesParams.Margin0.Add(_padSize.Half()),
                                                                              GamesParams.Margin1.Sub(_padSize.Half()));
                }
            }

            // Drawing
            var playerBox = _playerPos.ToBox(_padSize);
            var enemyBox = _enemyPos.ToBox(_padSize);
            var ballBox = _ballPos.ToBox(_ballSize);

            context.FillRectangle(screenSize.ApplyTo(playerBox), GamesParams.PlayerColor);
            context.FillRectangle(screenSize.ApplyTo(enemyBox), GamesParams.EnemyColor);

            context.FillRectangle(screenSize.ApplyTo(ballBox), GamesParams.AdditionalColor);

            base.Update(context, target, deviceManager, screenSize, dt, elapsedTime);
        }
예제 #2
0
        public override void Update(DeviceContext context, TargetBase target, DeviceManager deviceManager, Point screenSize, float dt, float elapsedTime)
        {
            if (AfterStartFreeze)
            {
                // Player moving
                _playerPos =
                    _playerPos.Add(_playerDir.Mul(_playerSpd).Mul(dt)).Clamp(GamesParams.Margin0.Add(_padSize.Half()),
                                                                             GamesParams.Margin1.Sub(_padSize.Half()));

                // Ball moving
                var oldBallPos = _ballPos;
                _ballPos = _ballPos.Add(_ballDir.Mul(_ballSpd).Mul(dt));

                // Ball collision with borders
                if (!_ballPos.IsInside(GamesParams.Margin0.Add(_ballSize.Half()),
                                       GamesParams.Margin1.Sub(_ballSize.Half())))
                {
                    if (_ballPos.X - GamesParams.MarginX0 < _ballPos.Y - GamesParams.MarginY0 ||
                        GamesParams.MarginX1 - _ballPos.X < _ballPos.Y - GamesParams.MarginY0)
                        _ballDir.X = -_ballDir.X;
                    else
                        _ballDir.Y = -_ballDir.Y;

                    if (_ballPos.Y > GamesParams.MarginY1 - 0.01f)
                    {
                        _playerPos =
                            new Point(0.5f, GamesParams.MarginY1).Clamp(GamesParams.Margin0.Add(_padSize.Half()),
                                                                        GamesParams.Margin1.Sub(_padSize.Half()));
                        _ballPos = _playerPos.Sub(new Point(0, 0.1f));
                        _ballDir = new Point(0.0f, -1.0f).AddNoise().Normalise();
                        _gameManager.Die();
                        return;
                    }
                }

                _ballPos = _ballPos.Clamp(GamesParams.Margin0.Add(_ballSize.Half()),
                                          GamesParams.Margin1.Sub(_ballSize.Half()));

                // Ball collision with player pad
                if (_ballPos.IsInside(_playerPos.Sub(_padSize.Half()).Sub(_ballSize.Half()),
                                      _playerPos.Add(_padSize.Half()).Add(_ballSize.Half())))
                {
                    _ballDir.Y = -1;
                    _ballDir.X = _ballPos.Sub(_playerPos).X/_padSize.Half().X;
                    _ballDir = _ballDir.Normalise();

                    _ballSpd += _ballSpdInc;
                }

                // Ball collision with player pad
                foreach (var block in _blockPos)
                {
                    if (_ballPos.IsInside(block.Sub(_blockSize.Half()).Sub(_ballSize.Half()),
                                          block.Add(_blockSize.Half()).Add(_ballSize.Half())))
                    {
                        if (oldBallPos.X < block.Sub(_blockSize.Half()).Sub(_ballSize.Half()).X ||
                            oldBallPos.X > block.Add(_blockSize.Half()).Add(_ballSize.Half()).X)
                            _ballDir.X = -_ballDir.X;
                        else
                            _ballDir.Y = -_ballDir.Y;

                        block.X = -100;
                        block.Y = -100;

                        _gameManager.AddPoints(100);
                    }
                }
            }

            // Drawing
            var anyBlock = false;
            foreach (var block in _blockPos)
            {
                if (block.X < 0)
                    continue;

                anyBlock = true;
                var box = block.ToBox(_blockSize);
                context.FillRectangle(screenSize.ApplyTo(box), GamesParams.EnemyColor);
            }

            if (!anyBlock)
            {
                NewGame();
                _gameManager.Win(3000);
                return;
            }

            var playerBox = _playerPos.ToBox(_padSize);
            var ballBox = _ballPos.ToBox(_ballSize);
            context.FillRectangle(screenSize.ApplyTo(playerBox), GamesParams.PlayerColor);
            context.FillRectangle(screenSize.ApplyTo(ballBox), GamesParams.AdditionalColor);

            base.Update(context, target, deviceManager, screenSize, dt, elapsedTime);
        }
예제 #3
0
파일: Snake.cs 프로젝트: Maskl/MetroRetro
        public override void Update(DeviceContext context, TargetBase target, DeviceManager deviceManager, Point screenSize, float dt, float elapsedTime)
        {
            if (AfterStartFreeze)
            {
                // Player moving
                _snakePos = _snakePos.Add(_snakeDir.Mul(_snakeSpd).Mul(dt));

                _sumDt += dt;
                if (_sumDt > 0.05)
                {
                    var s0 = _snakeLastPos;
                    var s1 = _snakePos;
                    var it = s1.Sub(s0);
                    var lp = Math.Round(it.Length()/_snakePartSize.Mul(0.5f).X);
                    it = it.Normalise().Mul(_snakePartSize.Mul(0.5f));
                    var pp = s0;
                    while (lp-- > 0)
                    {
                        // Eating apple
                        if (pp.Sub(_apple).Length() < _snakePartSize.X/2 + _appleSize.X/2)
                        {
                            _snakePossibleSize += 25;
                            _snakeSpd += 0.0125f;
                            PlaceNewApple();
                            _gameManager.Win(500);
                            return;
                        }

                        // Collision with borders
                        if (!pp.IsInside(GamesParams.Margin0.Add(_snakePartSize.Half()),
                                         GamesParams.Margin1.Sub(_snakePartSize.Half())))
                        {
                            NewGame();
                            _gameManager.Die();
                            return;
                        }

                        // Self collision
                        var mm = _snake.Count - 3;
                        if (
                            _snake.TakeWhile(snakePart => --mm > 0).Any(
                                snakePart => snakePart.Sub(pp).Length() < _snakePartSize.X/3*2))
                        {
                            NewGame();
                            _gameManager.Die();
                            return;
                        }

                        _snake.Add(new Point(pp.X, pp.Y));
                        pp = pp.Add(it);
                        _sumDt = 0;
                        _snakeLastPos = _snakePos;
                    }

                    while (_snake.Count > _snakePossibleSize)
                    {
                        _snake.RemoveAt(0);
                    }
                }
            }

            // Drawing
            foreach (var snakePart in _snake)
            {
                var box = snakePart.ToBox(_snakePartSize);
                context.FillRectangle(screenSize.ApplyTo(box), GamesParams.PlayerColor);
            }

            var headBox = _snake.Last().ToBox(_snakePartSize.Mul(0.5f));
            context.FillRectangle(screenSize.ApplyTo(headBox), GamesParams.AdditionalColor);

            var appleBox = _apple.ToBox(_appleSize);
            context.FillRectangle(screenSize.ApplyTo(appleBox), GamesParams.AdditionalColor);
            base.Update(context, target, deviceManager, screenSize, dt, elapsedTime);
        }
예제 #4
0
        public override void Update(DeviceContext context, TargetBase target, DeviceManager deviceManager, Point screenSize, float dt, float elapsedTime)
        {
            if (AfterStartFreeze)
            {
                _timeToNextPossibleJump -= dt;

                if (_jumpTimer >= 0)
                {
                    _jumpTimer += dt * JumpSpeed;
                    _playerPos.Y = GroundY - _playerSize.Y / 2 - (float)Math.Sin(_jumpTimer) * JumpHeight;

                    if (_jumpTimer > Math.PI)
                    {
                        _playerPos.Y = GroundY - _playerSize.Y / 2;
                        _jumpTimer = -1;
                    }
                }
                else
                {
                    _canWin -= dt;
                    if (_canWin < 0)
                    {
                        _canWin = 1000;
                        _gameManager.Win(300);
                        return;
                    }
                }

                // Hole moving
                _holePos = _holePos.Add(_holeDir.Mul(_holeSpd).Mul(dt));
                if (_holePos.X + _holeSize.X / 2 <= GamesParams.MarginX0)
                {
                    AddNewObstacle();
                }
                if (_holePos.X < _playerPos.X && _canWin > 100)
                    _canWin = 0.5f;

                // Ball collision with player pad
                if (_holePos.IsInside(_playerPos.Sub(_playerSize.Half()).Sub(_holeSize.Half()),
                                      _playerPos.Add(_playerSize.Half()).Add(_holeSize.Half())))
                {
                    NewGame();
                    _gameManager.Die();
                    return;
                }
            }

            // Drawing
            context.FillRectangle(screenSize.ApplyTo(new RectangleF(GamesParams.MarginX0, GroundY, GamesParams.MarginX1, GamesParams.MarginY1)), GamesParams.ObstaclesColor);

            var holeBox = _holePos.ToBox(_holeSize);
            if (holeBox.Left < GamesParams.MarginX1)
            {
                if (holeBox.Left < GamesParams.MarginX0)
                    holeBox.Left = GamesParams.MarginX0;

                if (holeBox.Right > GamesParams.MarginX1)
                    holeBox.Right = GamesParams.MarginX1;

                context.FillRectangle(screenSize.ApplyTo(holeBox), _holeIsStone ? GamesParams.ObstaclesColor : GamesParams.BackgroundColor);
            }
            var playerBox = _playerPos.ToBox(_playerSize);
            context.FillRectangle(screenSize.ApplyTo(playerBox), GamesParams.PlayerColor);

            base.Update(context, target, deviceManager, screenSize, dt, elapsedTime);
        }
예제 #5
0
파일: Tigers.cs 프로젝트: Maskl/MetroRetro
        public override void Update(DeviceContext context, TargetBase target, DeviceManager deviceManager, Point screenSize, float dt, float elapsedTime)
        {
            if (AfterStartFreeze)
            {
                _timeToNextPossibleShoot -= dt;
                if (_isShootButtonPressed && _timeToNextPossibleShoot <= 0)
                {
                    var p = _playerPos.Sub(new Point(0, 0.01f));
                    _bulletPos.Add(p);

                    _timeToNextPossibleShoot = ShootInterval;
                }

                // Player moving
                _playerPos =
                    _playerPos.Add(_playerDir.Mul(PlayerSpd).Mul(dt)).Clamp(GamesParams.Margin0.Add(_playerSize.Half()),
                                                                            GamesParams.Margin1.Sub(_playerSize.Half()));

                // Enemies
                for (var e = 0; e < _enemyPos.Count; ++e)
                {
                    var enemyPos = _enemyPos[e];

                    // Enemy reach bottom line
                    _enemyPos[e] = enemyPos.Add(_enemyDir.Mul(EnemySpd).Mul(dt));
                    enemyPos = _enemyPos[e];

                    if (enemyPos.IsInside(GamesParams.Margin0.Sub(_enemySize.Half()).Add(new Point(0, 1)),
                                          GamesParams.Margin1.Add(_enemySize.Half()).Add(new Point(0, 1))))
                    {
                        AddEnemy(e);
                        AddEnemy();
                        AddEnemy();
                    }

                    // Enemy collision with player
                    if (enemyPos.IsInside(_playerPos.Sub(_playerSize.Half()).Sub(_playerSize.Half()),
                                          _playerPos.Add(_playerSize.Half()).Add(_playerSize.Half())))
                    {
                        NewGame();
                        _gameManager.Die();
                        return;
                    }
                }

                // Bullet moving
                for (var i = 0; i < _bulletPos.Count; ++i)
                {
                    var bulletPos = _bulletPos[i];
                    _bulletPos[i] = bulletPos.Add(_bulletDir.Mul(BulletSpd).Mul(dt));
                    bulletPos = _bulletPos[i];

                    // Bullet collision with borders
                    if (!bulletPos.IsInside(GamesParams.Margin0.Sub(_bulletSize.Half()),
                                            GamesParams.Margin1.Add(_bulletSize.Half())))
                    {
                        _bulletPos.RemoveAt(i);
                    }

                    // Bullet collision with enemies
                    for (var e = 0; e < _enemyPos.Count; ++e)
                    {
                        var enemyPos = _enemyPos[e];
                        if (bulletPos.IsInside(enemyPos.Sub(_enemySize.Half()).Sub(_bulletSize.Half()),
                                               enemyPos.Add(_enemySize.Half()).Add(_bulletSize.Half())))
                        {
                            _bulletPos.RemoveAt(i);
                            AddEnemy(e);
                            AddEnemy();
                            _gameManager.AddPoints(50);
                            break;
                        }
                    }
                }
            }

            // Drawing
            foreach (var bullet in _bulletPos)
            {
                var ballBox = bullet.ToBox(_bulletSize);
                context.FillRectangle(screenSize.ApplyTo(ballBox), GamesParams.AdditionalColor);
            }

            foreach (var enemy in _enemyPos)
            {
                var box = enemy.ToBox(_enemySize);
                if (box.Left > GamesParams.MarginX1 || box.Right < GamesParams.MarginX0 || box.Bottom < GamesParams.MarginY0 || box.Top > GamesParams.MarginY1)
                    continue;

                if (box.Left < GamesParams.MarginX0)
                    box.Left = GamesParams.MarginX0;
                if (box.Right > GamesParams.MarginX1)
                    box.Right = GamesParams.MarginX1;
                if (box.Top < GamesParams.MarginY0)
                    box.Top = GamesParams.MarginY0;
                if (box.Bottom > GamesParams.MarginY1)
                    box.Bottom = GamesParams.MarginY1;

                context.FillRectangle(screenSize.ApplyTo(box), GamesParams.EnemyColor);
            }

            var playerBox = _playerPos.ToBox(_playerSize);
            context.FillRectangle(screenSize.ApplyTo(playerBox), GamesParams.PlayerColor);

            base.Update(context, target, deviceManager, screenSize, dt, elapsedTime);
        }