예제 #1
0
        public void Camera2D_ContainsRectangle_Test()
        {
            var graphicsDevice = TestHelper.CreateGraphicsDevice();
            var camera         = new Camera2D(graphicsDevice);

            Assert.AreEqual(ContainmentType.Intersects, camera.Contains(new Rectangle(-50, -50, 100, 100)));
            Assert.AreEqual(ContainmentType.Contains, camera.Contains(new Rectangle(50, 50, 100, 100)));
            Assert.AreEqual(ContainmentType.Disjoint, camera.Contains(new Rectangle(850, 500, 100, 100)));
        }
        public void Camera2D_ContainsRectangle_Test()
        {
            var graphicsDevice = TestHelper.CreateGraphicsDevice();
            var camera = new Camera2D(graphicsDevice);

            Assert.AreEqual(ContainmentType.Intersects, camera.Contains(new Rectangle(-50, -50, 100, 100)));
            Assert.AreEqual(ContainmentType.Contains, camera.Contains(new Rectangle(50, 50, 100, 100)));
            Assert.AreEqual(ContainmentType.Disjoint, camera.Contains(new Rectangle(850, 500, 100, 100)));
        }
예제 #3
0
        public void Camera2D_ContainsPoint_Test()
        {
            var graphicsDevice = TestHelper.CreateGraphicsDevice();
            var camera         = new Camera2D(graphicsDevice);

            Assert.AreEqual(ContainmentType.Contains, camera.Contains(new Point(1, 1)));
            Assert.AreEqual(ContainmentType.Contains, camera.Contains(new Point(800, 480)));
            Assert.AreEqual(ContainmentType.Disjoint, camera.Contains(new Point(0, 0)));
            Assert.AreEqual(ContainmentType.Disjoint, camera.Contains(new Point(801, 481)));
        }
예제 #4
0
        public void Camera2D_ContainsPoint_Test()
        {
            var graphicsDevice = TestHelper.CreateGraphicsDevice();
            var camera = new Camera2D(graphicsDevice);

            Assert.AreEqual(ContainmentType.Contains, camera.Contains(new Point(1, 1)));
            Assert.AreEqual(ContainmentType.Contains, camera.Contains(new Point(799, 479)));
            Assert.AreEqual(ContainmentType.Disjoint, camera.Contains(new Point(-1, -1)));
            Assert.AreEqual(ContainmentType.Disjoint, camera.Contains(new Point(801, 481)));
        }
예제 #5
0
        public void Camera2D_ContainsVector2_Test()
        {
            var graphicsDevice = TestHelper.CreateGraphicsDevice();
            var camera         = new Camera2D(graphicsDevice);

            // the edge cases fall on the half pixel boundary
            Assert.AreEqual(ContainmentType.Disjoint, camera.Contains(new Vector2(0.45f, 0.45f)));
            Assert.AreEqual(ContainmentType.Contains, camera.Contains(new Vector2(800.45f, 480.45f)));
            Assert.AreEqual(ContainmentType.Contains, camera.Contains(new Vector2(0.55f, 0.55f)));
            Assert.AreEqual(ContainmentType.Disjoint, camera.Contains(new Vector2(800.55f, 480.55f)));
        }
 public void Camera2D_ContainsVector2_Test()
 {
     var graphicsDevice = TestHelper.CreateGraphicsDevice();
     var camera = new Camera2D(graphicsDevice);
     
     // the edge cases fall on the half pixel boundary
     Assert.AreEqual(ContainmentType.Disjoint, camera.Contains(new Vector2(0.45f, 0.45f)));
     Assert.AreEqual(ContainmentType.Contains, camera.Contains(new Vector2(800.45f, 480.45f)));
     Assert.AreEqual(ContainmentType.Contains, camera.Contains(new Vector2(0.55f, 0.55f)));
     Assert.AreEqual(ContainmentType.Disjoint, camera.Contains(new Vector2(800.55f, 480.55f)));
 }
예제 #7
0
        public void Draw(GameTime gameTime, Camera2D occlusionCam = null)
        {
            for (int x = 0; x < tiles.GetLength(0); x++)
            {
                for (int y = 0; y < tiles.GetLength(1); y++)
                {
                    if (occlusionCam != null)
                    {
                        var occlude = occlusionCam.Contains(tiles[x, y].bounds);
                        switch (occlude)
                        {
                        case ContainmentType.Intersects:
                        case ContainmentType.Contains:
                            tiles[x, y].Draw(gameTime);
                            break;
                        }
                    }
                    else
                    {
                        tiles[x, y].Draw(gameTime);
                    }
                }
            }

            var sortedEntities = entities.OrderBy(e => e.collider.bounds.Bottom).ToList();

            foreach (var e in sortedEntities)
            {
                if (occlusionCam != null)
                {
                    var occlude = occlusionCam.Contains(e.collider.bounds.Center);
                    switch (occlude)
                    {
                    case ContainmentType.Intersects:
                    case ContainmentType.Contains:
                        e.Draw(gameTime);
                        break;
                    }
                }
                else
                {
                    e.Draw(gameTime);
                }
            }
        }
예제 #8
0
        public void Camera2D_ContainsVector2_Test()
        {
            var graphicsDevice = TestHelper.CreateGraphicsDevice();
            var camera         = new Camera2D(graphicsDevice);

            Assert.AreEqual(ContainmentType.Contains, camera.Contains(new Vector2(799.5f, 479.5f)));
            Assert.AreEqual(ContainmentType.Contains, camera.Contains(new Vector2(0.5f, 0.5f)));
            Assert.AreEqual(ContainmentType.Disjoint, camera.Contains(new Vector2(-0.5f, -0.5f)));
            Assert.AreEqual(ContainmentType.Disjoint, camera.Contains(new Vector2(800.5f, 480.5f)));
            Assert.AreEqual(ContainmentType.Disjoint, camera.Contains(new Vector2(-0.5f, 240f)));
            Assert.AreEqual(ContainmentType.Contains, camera.Contains(new Vector2(0.5f, 240f)));
            Assert.AreEqual(ContainmentType.Contains, camera.Contains(new Vector2(799.5f, 240f)));
            Assert.AreEqual(ContainmentType.Disjoint, camera.Contains(new Vector2(800.5f, 240f)));
        }
예제 #9
0
        public void Camera2D_ContainsVector2_Test()
        {
            var graphicsDevice = TestHelper.CreateGraphicsDevice();
            var camera = new Camera2D(graphicsDevice);

            Assert.AreEqual(ContainmentType.Contains, camera.Contains(new Vector2(799.5f, 479.5f)));
            Assert.AreEqual(ContainmentType.Contains, camera.Contains(new Vector2(0.5f, 0.5f)));
            Assert.AreEqual(ContainmentType.Disjoint, camera.Contains(new Vector2(-0.5f, -0.5f)));
            Assert.AreEqual(ContainmentType.Disjoint, camera.Contains(new Vector2(800.5f, 480.5f)));
            Assert.AreEqual(ContainmentType.Disjoint, camera.Contains(new Vector2(-0.5f, 240f)));
            Assert.AreEqual(ContainmentType.Contains, camera.Contains(new Vector2(0.5f, 240f)));
            Assert.AreEqual(ContainmentType.Contains, camera.Contains(new Vector2(799.5f, 240f)));
            Assert.AreEqual(ContainmentType.Disjoint, camera.Contains(new Vector2(800.5f, 240f)));
        }
예제 #10
0
        public void Draw(SpriteBatch sprite_batch, Camera2D camera)
        {
            camera.LookAt(Focus);
            sprite_batch.Begin(transformMatrix: camera.GetViewMatrix());
            sprite_batch.Draw(base_world.Current.TiledMap);
            Vector2 size = base_world.Current.Size;

            foreach (EntityObject e in base_world.Entities)
            {
                Point           location = GetPosition(e);
                Rectangle       rect     = new Rectangle(location, size.ToPoint());
                ContainmentType contains = camera.Contains(rect);
                if (contains != ContainmentType.Disjoint)
                {
                    RenderEntity r = GetRenderEntity(e);
                    r.Draw(sprite_batch, rect);
                }
            }
            sprite_batch.End();
        }
예제 #11
0
        public bool Contains(Rectangle rectangle)
        {
            var contains = Camera.Contains(rectangle);

            return(contains != ContainmentType.Disjoint);
        }
예제 #12
0
        public override void Update(GameTime gameTime)
        {
            base.Update(gameTime);

            // Helpers
            if (_stageCompleted)
            {
                _stageCompletedHelper.Update(gameTime);
            }
            _backgroundHelper.Update(_camera);
            _pauseHelper.Update(gameTime);

            if (_pauseHelper.Paused)
            {
                return;
            }

            _time += gameTime.ElapsedGameTime.Duration();
            DebugValues["Timer"] = _time.ToString();

            var bossCollapsing = GameMap.Instance.CurrentMapId == 5 && _enemies.Count > 0 && ((Boss)_enemies[0]).Collapsing;

            _player.Update(gameTime, _stageCompleted || bossCollapsing);

            if (_player.RequestRespawn)
            {
                HandlePlayerRespawn();
            }

            foreach (var projectile in _projectiles)
            {
                projectile.Update(gameTime);
                if (projectile.Subject == ProjectileSubject.FromEnemy && projectile.BoundingBox.Intersects(_player.BoundingRectangle))
                {
                    var lastHearts = _player.HP;
                    _player.ReceiveAttack(projectile.Damage, projectile.LastPosition);
                    if (lastHearts - _player.HP > 0)
                    {
                        _heartsLost += lastHearts - _player.HP;
                    }
                }

                if (projectile.RequestErase)
                {
                    _projectilesToRemove.Add(projectile);
                }
            }

            foreach (var enemy in _enemies)
            {
                enemy.Update(gameTime);

                if (enemy.HasViewRange && enemy.ViewRangeCooldown <= 0f &&
                    _camera.Contains(enemy.BoundingRectangle) != ContainmentType.Disjoint &&
                    enemy.ViewRange.Intersects(_player.BoundingRectangle))
                {
                    enemy.PlayerOnSight(_player.Position);
                }

                if (!enemy.Dying && enemy.ContactDamageEnabled && enemy.BoundingRectangle.Intersects(_player.BoundingRectangle))
                {
                    var lastHearts = _player.HP;
                    _player.ReceiveAttackWithRect(1, enemy.BoundingRectangle);
                    if (lastHearts - _player.HP > 0)
                    {
                        _heartsLost += lastHearts - _player.HP;
                    }
                }

                foreach (var projectile in _projectiles)
                {
                    if (projectile.Subject == ProjectileSubject.FromPlayer)
                    {
                        if (!enemy.Dying && !enemy.IsImunity && enemy.CanReceiveAttacks && projectile.BoundingBox.Intersects(enemy.BoundingRectangle))
                        {
                            if (enemy.EnemyType == EnemyType.TurtleWheel && enemy.InWheelMode)
                            {
                                projectile.Acceleration = new Vector2(projectile.Acceleration.X * -1.7f, _rand.Next(-4, 5));
                                _deflectSe.PlaySafe();
                                CreateSparkParticle(projectile.Position);
                                projectile.Subject = ProjectileSubject.FromEnemy;
                            }
                            else
                            {
                                enemy.ReceiveAttack(projectile.Damage, projectile.LastPosition);
                                projectile.Destroy();
                            }
                        }
                    }
                    else if (projectile.BoundingBox.Intersects(_player.BoundingRectangle))
                    {
                        var lastHearts = _player.HP;
                        _player.ReceiveAttack(projectile.Damage, projectile.LastPosition);
                        if (lastHearts - _player.HP > 0)
                        {
                            _heartsLost += lastHearts - _player.HP;
                        }
                        projectile.Destroy();
                    }

                    if (projectile.RequestErase)
                    {
                        _projectilesToRemove.Add(projectile);
                    }
                }

                if (enemy is Boss)
                {
                    var boss = (Boss)enemy;
                    if (boss.RequestingHatDrop)
                    {
                        _player.PerformHatDrop();
                    }
                    if (boss.Collapsing)
                    {
                        SoundManager.SetBgmVolume(0.3f);
                        if (_ambienceSe != null)
                        {
                            _ambienceSe.Volume = 0.3f;
                        }
                    }
                }
                if (enemy.RequestErase)
                {
                    _enemiesToRemove.Add(enemy);
                    _enemiesDefeated++;
                }
            }

            foreach (var spike in GameMap.Instance.Spikes)
            {
                if (_player.BoundingRectangle.Intersects(spike) && !_player.TouchedSpikes)
                {
                    _heartsLost += _player.HP;
                    _player.CharacterSprite.RemoveImmunity();
                    _player.ReceiveAttackWithRect(999, spike);
                    _player.TouchedSpikes = true;
                }
            }

            foreach (var coin in _coins)
            {
                coin.Update(gameTime);
                var sprite = coin.CoinSprite;
                if (sprite.TextureRegion.Name.IndexOf("CoinSparkle") > 0 && sprite.Looped)
                {
                    _coinsToRemove.Add(coin);
                }
                else if (sprite.TextureRegion.Name.IndexOf("CoinSparkle") < 0 && _player.BoundingRectangle.Intersects(sprite.BoundingBox))
                {
                    _coinsCollected += 1;
                    PlayerManager.Instance.AddCoins(1);
                    sprite.SetTexture(ImageManager.loadMisc("CoinSparkle"), false);
                    sprite.SetDelay(80);
                    _coinsSe.PlaySafe();
                }
            }

            foreach (var shop in _shops)
            {
                if (shop.IsActive && !_player.BoundingRectangle.Intersects(shop.BoundingRectangle))
                {
                    shop.SetActive(false);
                }
                else if (!shop.IsActive && _player.BoundingRectangle.Intersects(shop.BoundingRectangle))
                {
                    shop.SetActive(true);
                }

                if (shop.IsActive && ((_player.IsAttacking && !shop.IsDenied()) || shop.NeedDeny()))
                {
                    shop.SetArrowDenyState();
                }
                else if (shop.IsDenied() && !_player.IsAttacking)
                {
                    shop.SetArrowNormalState();
                }
                shop.Update(gameTime);
            }

            foreach (var checkpoint in _checkpoints)
            {
                if (!checkpoint.IsChecked && _player.BoundingRectangle.Intersects(checkpoint.BoundingBox))
                {
                    if (checkpoint.IsEndFlag)
                    {
                        FinishStage(false);
                    }
                    else
                    {
                        checkpoint.OnPlayerCheck();
                        var checkpointData = new CheckpointData()
                        {
                            Activated      = true,
                            Checkpoint     = checkpoint,
                            MapEnemies     = new List <Enemy>(_enemies.Select(enemy => enemy.Clone <Enemy>())),
                            MapCoins       = new List <GameCoin>(_coins.Select(coin => coin.Clone())),
                            Ammo           = PlayerManager.Instance.Ammo,
                            Coins          = PlayerManager.Instance.Coins,
                            CoinsCollected = _coinsCollected
                        };
                        _lastCheckpoint = checkpointData;
                    }
                }
                checkpoint.Update(gameTime);
            }

            foreach (var enemy in _enemiesToRemove)
            {
                enemy.DisposeEnemyTextures();
                enemy.Dispose();
                _enemies.Remove(enemy);
            }

            foreach (var projectile in _projectilesToRemove)
            {
                _projectiles.Remove(projectile);
            }

            foreach (var coin in _coinsToRemove)
            {
                _coins.Remove(coin);
            }

            _enemiesToRemove.Clear();
            _projectilesToRemove.Clear();
            _coinsToRemove.Clear();

            UpdateCamera();
        }
예제 #13
0
        public override void Update(GameTime gameTime)
        {
            base.Update(gameTime);

            // Helpers
            if (_stageCompleted)
            {
                _stageCompletedHelper.Update(gameTime);
            }
            _backgroundHelper.Update(_camera);
            _pauseHelper.Update(gameTime);

            if (_pauseHelper.Paused)
            {
                return;
            }

            _time += gameTime.ElapsedGameTime.Duration();
            DebugValues["Timer"] = _time.ToString();

            _player.Update(gameTime, _stageCompleted);

            if (_player.RequestRespawn)
            {
                HandlePlayerRespawn();
            }

            for (var i = 0; i < _projectiles.Count; i++)
            {
                _projectiles[i].Update(gameTime);
                if (_projectiles[i].Subject == ProjectileSubject.FromEnemy && _projectiles[i].BoundingBox.Intersects(_player.BoundingRectangle))
                {
                    _player.ReceiveAttack(_projectiles[i].Damage, _projectiles[i].LastPosition);
                }

                if (_projectiles[i].RequestErase)
                {
                    _projectiles.Remove(_projectiles[i]);
                }
            }

            for (var i = 0; i < _enemies.Count; i++)
            {
                _enemies[i].Update(gameTime);

                if (_enemies[i].HasViewRange &&
                    _enemies[i].ViewRangeCooldown <= 0f &&
                    _camera.Contains(_enemies[i].BoundingRectangle) != ContainmentType.Disjoint &&
                    _enemies[i].ViewRange.Intersects(_player.BoundingRectangle))
                {
                    _enemies[i].PlayerOnSight(_player.Position);
                }

                if (!_enemies[i].Dying && _enemies[i].ContactDamageEnabled && _enemies[i].BoundingRectangle.Intersects(_player.BoundingRectangle))
                {
                    var lastHearts = _player.HP;
                    _player.ReceiveAttackWithRect(1, _enemies[i].BoundingRectangle);
                    if (lastHearts - _player.HP > 0)
                    {
                        _heartsLost += lastHearts - _player.HP;
                    }
                }

                for (var j = 0; j < _projectiles.Count; j++)
                {
                    if (_projectiles[j].Subject == ProjectileSubject.FromPlayer)
                    {
                        if (!_enemies[i].Dying && !_enemies[i].IsImunity && _enemies[i].CanReceiveAttacks && _projectiles[j].BoundingBox.Intersects(_enemies[i].BoundingRectangle))
                        {
                            if (_enemies[i].EnemyType == EnemyType.TurtleWheel && _enemies[i].InWheelMode)
                            {
                                _projectiles[j].Acceleration = new Vector2(_projectiles[j].Acceleration.X * -1.7f, _rand.Next(-4, 5));
                                CreateSparkParticle(_projectiles[j].Position);
                                _projectiles[j].Subject = ProjectileSubject.FromEnemy;
                            }
                            else
                            {
                                _enemies[i].ReceiveAttack(_projectiles[j].Damage, _projectiles[j].LastPosition);
                                _projectiles[j].Destroy();
                            }
                        }
                    }
                    else if (_projectiles[j].BoundingBox.Intersects(_player.BoundingRectangle))
                    {
                        var lastHearts = _player.HP;
                        _player.ReceiveAttack(_projectiles[j].Damage, _projectiles[j].LastPosition);
                        if (lastHearts - _player.HP > 0)
                        {
                            _heartsLost += lastHearts - _player.HP;
                        }
                        _projectiles[j].Destroy();
                    }

                    if (_projectiles[j].RequestErase)
                    {
                        _projectiles.Remove(_projectiles[j]);
                    }
                }

                if (_enemies[i].RequestErase)
                {
                    _enemies.Remove(_enemies[i]);
                    _enemiesDefeated++;
                }
            }

            for (var i = 0; i < GameMap.Instance.Spikes.Count; i++)
            {
                var spike = GameMap.Instance.Spikes[i];
                if (_player.BoundingRectangle.Intersects(spike) && !_player.TouchedSpikes)
                {
                    _heartsLost += _player.HP;
                    _player.CharacterSprite.RemoveImmunity();
                    _player.ReceiveAttackWithRect(999, spike);
                    _player.TouchedSpikes = true;
                }
            }

            for (var i = 0; i < _coins.Count; i++)
            {
                _coins[i].Update(gameTime);
                var sprite = _coins[i].CoinSprite;
                if (sprite.TextureRegion.Name.IndexOf("CoinSparkle") > 0 && sprite.Looped)
                {
                    _coins.Remove(_coins[i]);
                }
                else if (sprite.TextureRegion.Name.IndexOf("CoinSparkle") < 0 && _player.BoundingRectangle.Intersects(sprite.BoundingBox))
                {
                    _coinsCollected += 1;
                    PlayerManager.Instance.AddCoins(1);
                    sprite.SetTexture(ImageManager.loadMisc("CoinSparkle"), false);
                    sprite.SetDelay(80);
                    SoundManager.PlaySafe(_coinsSe);
                }
            }

            for (var i = 0; i < _shops.Count; i++)
            {
                if (_shops[i].IsActive && !_player.BoundingRectangle.Intersects(_shops[i].BoundingRectangle))
                {
                    _shops[i].SetActive(false);
                }
                else if (!_shops[i].IsActive && _player.BoundingRectangle.Intersects(_shops[i].BoundingRectangle))
                {
                    _shops[i].SetActive(true);
                }

                if (_shops[i].IsActive && _player.IsAttacking && !_shops[i].IsDenied())
                {
                    _shops[i].SetArrowDenyState();
                }
                else if (_shops[i].IsDenied() && !_player.IsAttacking)
                {
                    _shops[i].SetArrowNormalState();
                }
                _shops[i].Update(gameTime);
            }

            for (var i = 0; i < _checkpoints.Count; i++)
            {
                if (!_checkpoints[i].IsChecked && _player.BoundingRectangle.Intersects(_checkpoints[i].BoundingBox))
                {
                    if (_checkpoints[i].IsEndFlag)
                    {
                        FinishStage(false);
                    }
                    else
                    {
                        _checkpoints[i].OnPlayerCheck();
                        var checkpointData = new CheckpointData()
                        {
                            Activated      = true,
                            Checkpoint     = _checkpoints[i],
                            MapEnemies     = new List <Enemy>(_enemies.Select(enemy => enemy.Clone <Enemy>())),
                            MapCoins       = new List <GameCoin>(_coins.Select(coin => coin.Clone())),
                            Ammo           = PlayerManager.Instance.Ammo,
                            Coins          = PlayerManager.Instance.Coins,
                            CoinsCollected = _coinsCollected
                        };
                        _lastCheckpoint = checkpointData;
                    }
                }
                _checkpoints[i].Update(gameTime);
            }

            UpdateCamera();
        }