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)); }
public Knife() { m_def = new KnifeDef(); m_state = KnifeState.Freeze; }