override internal void Update(double elapsedTime, GameTime gameTime) { BodyReference body = Body(); UpdateOrientation(body); Brakement((float)elapsedTime, body); Movement((float)elapsedTime, body); Aligment((float)elapsedTime); Rotation((float)elapsedTime); emitter.Position = Position(); emitter.Forward = forward; emitter.Up = upDirection; emitter.Velocity = body.Velocity.Linear.ToVector3(); if (Input.Accelerate()) { lastTurbo = gameTime.TotalGameTime.TotalMilliseconds; } if (gameTime.TotalGameTime.TotalMilliseconds > lastTurbo + turboRegenerationTime) { turbo = Math.Min(turbo + turboRegeneration * (float)elapsedTime, maxTurbo); } }
private void Brakement(float elapsedTime, BodyReference body) { Vector3 velocity = Velocity(); float brakmentForce = -acceleration / 10; Vector3 forwardBreakment = (!Input.Accelerate() || turbo == 0) ? forward : Vector3.Zero; float horizontalSpeed = Vector3.Dot(velocity, rightDirection) / (rightDirection.Length() * rightDirection.Length()); Vector3 horizontalBrakment = horizontalSpeed != 0 ? Vector3.Normalize(rightDirection * horizontalSpeed) : Vector3.Zero; float verticalSpeed = Vector3.Dot(velocity, upDirection) / (upDirection.Length() * upDirection.Length()); Vector3 verticalBrakment = verticalSpeed != 0 ? Vector3.Normalize(upDirection * verticalSpeed) : Vector3.Zero; AddLinearVelocity(body, (forwardBreakment + horizontalBrakment + verticalBrakment) * brakmentForce * elapsedTime); }
private void Movement(float elapsedTime, BodyReference body) { if (Input.Accelerate()) { float speed = acceleration * elapsedTime; speed = Math.Min(speed, turbo); AddLinearVelocity(body, forward * speed); turbo -= speed; } else { AddLinearVelocity(body, Vector3.Zero); } }