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)); } } } }