Example #1
0
        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();
        }