示例#1
0
        public KnifeTrajectory Throw(KnifeDef knifeDef, float impulse, float startAngle)
        {
            if (knifeDef.gravity > 0)
            {
                throw new ArgumentException("knifeDef.gravity > 0");
            }
            if (impulse <= 0)
            {
                throw new ArgumentOutOfRangeException("impulse <= 0");
            }

            this.knifeDef = knifeDef;

            knifeLength = knifeDef.size;

            impulse *= Knife.PIXELS_TO_UNITS;
            impulse *= 1f;//testOptions.impulseMultipler;


            startAngle = AngleToRad(startAngle);//переводим в радианы

            List <Frame> frames = new List <Frame>();

            float oldY   = -10000;
            bool  flight = true;

            float startSpeed = impulse / knifeMass;

            startY = (knifeLength / 2f) * Cos(startAngle);

            float rorationSpeed = AngleToRad(knifeDef.rotationSpeed);
            float angle         = startAngle;
            float time          = 0;
            float y             = startY;

            frames.Add(new Frame()
            {
                angle          = angle,
                senterOfMassY  = y,
                timeAfterThrow = time
            });

            while (flight)
            {
                if (time > 10)
                {
                    throw new Exception("KnifePhysicsModel.cs time > 10");
                }

                time += timeStep;

                oldY = y;
                y    = startY + startSpeed * time + (Knife.PIXELS_TO_UNITS * knifeDef.gravity) * (float)Math.Pow(time, 2) * 0.5f;
                float speed = (y - oldY) / timeStep;

                // Поворот
                rorationSpeed -= AngleToRad(knifeDef.rotationDecrease) * timeStep;
                if (rorationSpeed < AngleToRad(knifeDef.rotationMinSpeed))
                {
                    rorationSpeed = AngleToRad(knifeDef.rotationMinSpeed);
                }

                angle += rorationSpeed * timeStep;


                var frame = new Frame()
                {
                    angle          = RadToAngle(angle),//обратно в углы переводим
                    senterOfMassY  = y,
                    timeAfterThrow = time,
                    rotationSpeed  = RadToAngle(rorationSpeed),
                    speed          = speed
                };



                // проверка на удар о землю

                // острие
                float bladeX;
                float bladeY;

                if (CheckGroundCollision(y, angle, BladePhaseRotation, out bladeX, out bladeY))
                {
                    if (oldY > y)
                    {
                        flight = false;
                    }
                }

                frame.bladeX = bladeX;
                frame.bladeY = bladeY;

                // ручка
                float handleX;
                float handleY;

                if (CheckGroundCollision(y, angle, HandlePhaseRotation, out handleX, out handleY))
                {
                    if (oldY > y)
                    {
                        flight = false;
                    }
                }

                frame.handleX = handleX;
                frame.handleY = handleY;


                frames.Add(frame);
            }

            return(new KnifeTrajectory(frames));
        }
示例#2
0
 public Knife()
 {
     m_def   = new KnifeDef();
     m_state = KnifeState.Freeze;
 }