private static void MakeRifleShoot(Environment environment, MachineGun machineGun) { var mousePosition = MouseExtension.Position; var rifleBound = machineGun.Sprite.GetLocalBounds(); var rifleLength = rifleBound.Width * machineGun.Sprite.Scale.X; //В случае, если юзверь тыкнул на позицию игрока с винтовкой, пуля не должна вылетать //DIMAN UPDATE: Почему? Лучше пусть стреляет. Только здесь ошибка в коде: если нажать слишком близко, //то пуля летит обратно //TODO: поправить с.м. выше if (rifleLength >= VectorMath.GetLength(machineGun.Sprite.Position, mousePosition)) { return; } //Левая верхня точка спрайта оружия var barrelPosition = VectorMath.GetPointOnVector(rifleLength, machineGun.Sprite.Position, mousePosition); //Точка, относительно которой вращалась винтовка var barrelOrigin = machineGun.Sprite.Origin.RotateAt(new Vector2f(), machineGun.Sprite.Rotation); //угол поворота винтовки var rifleAngle = VectorMath.ConvertToRadians(machineGun.Sprite.Rotation); //центр винтовки по Y var rifleYCenter = rifleBound.Height * machineGun.Sprite.Scale.Y / 2.0f; //Смещение дула до центра с поворота на угол rifleAngle var barrelOffset = rifleYCenter * new Vector2f( -(float)Math.Sin(rifleAngle), (float)Math.Cos(rifleAngle) ); var moveUnitVector = barrelPosition.GetUnitVectorTo(mousePosition); environment.Bullets.Add(CreateBullet(barrelPosition + barrelOffset - barrelOrigin, moveUnitVector)); //Звук выстрела из винтовки machineGun.Sound.Play(); }