Exemplo n.º 1
0
        // Update the game state
        // Called every frame
        // <timeStep> time in seconds since last frame
        protected async override void OnUpdate(float timeStep)
        {
            base.OnUpdate(timeStep);

            // Shield
            foreach (Character c in Characters)
            {
                c.ShieldNode.Position = c.ShieldUp ? c.WorldNode.Position : new Vector3(1000, 10000, -1000);
            }

            // Pickups
            foreach (Character c in Characters)
            {
                foreach (Pickup p in Pickups.ToList())
                {
                    if (c.Collides(p))
                    {
                        if (p.PickUp(c))
                        {
                            if (c is CharacterPlayer)
                            {
                                PlaySound("sounds/effects/pop.ogg", false);
                            }
                            p.WorldNode.Remove();
                            Pickups.Remove(p);

                            c.WorldNode.GetComponent <StaticSprite2D>().Sprite = c.PlayerSpriteAttack;
                        }
                    }
                }
            }

            // Bullets
            foreach (Bullet b in Bullets.ToList())
            {
                if (b.WorldNode.IsDeleted)
                {
                    continue;
                }

                if (b.WorldNode.Position2D.Length > 50f)
                {
                    b.WorldNode.Remove();
                    Bullets.Remove(b);
                    continue;
                }

                bool deleted = false;
                b.WorldNode.SetPosition2D(b.WorldNode.Position2D + (b.Direction * bulletSpeed * timeStep));

                foreach (Character c in Characters)
                {
                    if (b.Owner == c)
                    {
                        continue;
                    }
                    if (c.Collides(b))
                    {
                        c.Hit(b);
                        b.WorldNode.Remove();
                        Bullets.Remove(b);
                        deleted = true;
                        break;
                    }
                }

                if (deleted)
                {
                    continue;
                }

                foreach (WorldObject o in collisionObjects)
                {
                    if (b.WorldNode.IsDeleted || o.WorldNode.IsDeleted)
                    {
                        continue;
                    }

                    if (o.Collides(b))
                    {
                        b.WorldNode.Remove();
                        Bullets.Remove(b);
                        break;
                    }
                }
            }

            // PlayerCharacter may have to be loaded from saved game
            if (PlayerCharacter != null)
            {
                PlayerCharacter.Input.W         = Input.GetKeyDown(Key.W);
                PlayerCharacter.Input.A         = Input.GetKeyDown(Key.A);
                PlayerCharacter.Input.S         = Input.GetKeyDown(Key.S);
                PlayerCharacter.Input.D         = Input.GetKeyDown(Key.D);
                PlayerCharacter.Input.F         = Input.GetKeyDown(Key.F);
                PlayerCharacter.Input.Space     = Input.GetKeyPress(Key.Space);
                PlayerCharacter.Input.LeftClick = Input.GetKeyDown(Key.E);


                Vector2 mousePosition = new Vector2(Input.MousePosition.X, Input.MousePosition.Y);
                Vector2 resolution    = new Vector2(Graphics.Width, Graphics.Height);
                Vector2 mouseUV       = ((2f * mousePosition) - resolution) / resolution.Y;
                mouseUV.Y *= -1f;
                PlayerCharacter.Input.MousePosition = mouseUV;

                foreach (Character c in Characters.ToList())
                {
                    // Death
                    if (c.Health <= 0)
                    {
                        // sound effect
                        // create new node to play sound from, as character will be removed
                        var node = new Scene().CreateChild();
                        node.Position = c.Position;
                        PlaySound("sounds/effects/death.ogg", false);

                        c.WorldNode.Remove();
                        Characters.Remove(c);

                        if (c.LastBullet.Owner is CharacterPlayer)
                        {
                            if (hardcore)
                            {
                                PlayerCharacter.Score += 150;
                            }
                            else
                            {
                                PlayerCharacter.Score += 100;
                            }
                        }

                        if (Characters.Count == 1 && Characters.First() == PlayerCharacter)
                        {
                            gameover      = true;
                            timer.Enabled = false;
                            HandleWin();
                        }
                        else if (c == PlayerCharacter)
                        {
                            gameover      = true;
                            timer.Enabled = false;
                            HandleLose();
                        }

                        continue;
                    }

                    c.UpdateCollision(collisionObjects);
                    c.Update(timeStep);
                }

                PlayerCharacter.Input.LeftClick = false;

                if (Input.GetKeyDown(Key.F1) && !schaubMode)
                {
                    Save("latest.txt");
                    var saved = new Text()
                    {
                        Value = "Game Saved"
                    };

                    saved.SetColor(Color.Cyan);
                    saved.SetFont(font: ResourceCache.GetFont("fonts/FiraSans-Regular.otf"), size: 15);
                    saved.VerticalAlignment   = VerticalAlignment.Center;
                    saved.HorizontalAlignment = HorizontalAlignment.Center;

                    InvokeOnMain(() => { UI.Root.AddChild(saved); });
                    await Task.Delay(500);

                    try
                    {
                        InvokeOnMain(() =>
                        {
                            try { UI.Root.RemoveChild(saved); }
                            catch { return; }
                        });
                    }
                    catch { return; }
                }

                if (Input.GetKeyDown(Key.F2))
                {
                    timer.Enabled = false;
                    Restart();
                }
            }
        }