Esempio n. 1
0
        public void Shoot(Vector2 sourcePosition, Vector2 destinationPosition, List <ICollidable> mapObjects, List <IEntity> entities)
        {
            var rnd = new Random();                     // generator liczb losowych

            // Sprawdz czy jest amunicja i czy można strzelić
            if (!(GunInventory[CurrentGun].AmmoCount > 0) | !(GunCooldown > GunInventory[CurrentGun].RateOfFire))
            {
                return;
            }

            GunInventory[CurrentGun].AmmoCount -= 1;
            GunCooldown = 0;

            for (int i = 0; i < GunInventory[CurrentGun].PelletCount; i++)       // dla każdego pocisku
            {
                //soundeffect.

                GameState.soundEffects[0].Play();

                float rndOffset    = (float)rnd.Next(-GunInventory[CurrentGun].Spread, GunInventory[CurrentGun].Spread);  // Oblicz losowe odchylenie zgodne z Spread
                float radRndOffset = (float)(rndOffset * (Math.PI / 180));

                float baseAngle = (float)Math.Atan2(destinationPosition.Y - sourcePosition.Y, destinationPosition.X - sourcePosition.X); // Oblicz startowy kąt między pozycją gracza i myszki

                double shootAngle = baseAngle + radRndOffset;                                                                            // Oblicz kąt strzału z odchyleniem


                // Sprawdzanie kolizji
                bool   colided           = false;
                bool   outOfRange        = false;
                int    distanceTravelled = 0;
                double xToCheck          = sourcePosition.X;
                double yToCheck          = sourcePosition.Y;

                while (!colided & !outOfRange)
                {
                    foreach (var entity in entities)
                    {
                        if (entity.Hitbox.Contains((int)xToCheck, (int)yToCheck) && entity.IsSolid)
                        {
                            entity.Hurt(GunInventory[CurrentGun].Damage);        // Dodać metode do przeciwników która odejmuje zdrowie
                            colided = true;
                        }
                    }

                    foreach (var mapObj in mapObjects)
                    {
                        // Kolizja ze scianą, oknem, drzwiami
                        if (mapObj.Hitbox.Contains((int)xToCheck, (int)yToCheck) && mapObj.IsSolid)
                        {
                            colided = true;
                        }
                    }
                    // Przesuń sprawdzany punkt
                    if (!colided)
                    {
                        xToCheck = xToCheck + Math.Cos(shootAngle) * 1.02;
                        yToCheck = yToCheck + Math.Sin(shootAngle) * 1.02;
                    }

                    // Sprawdz czy nie jest za ekranem
                    if (xToCheck > 2000 | yToCheck > 2000 | xToCheck < 0 | yToCheck < 0)
                    {
                        outOfRange = true;
                    }

                    if (colided)
                    {
                        HM.Enqueue(new Vector2((float)xToCheck - 16, (float)yToCheck - 16));
                    }
                }
            }
        }