public override void Update(TimeSpan elapsed) { MouseState ms = Mouse.GetState(); GraphicsDevice device = GameContainer.Graphics.GraphicsDevice; if (ms.LeftButton == ButtonState.Pressed) { if (ms.X != msLast.X || ms.Y != msLast.Y) { Vector3 objSpace = device.Viewport.Unproject(new Vector3(ms.X, ms.Y, 0), tmp_proj, tmp_view, Matrix.Identity); Vector3 objSpaceLast = device.Viewport.Unproject(new Vector3(msLast.X, msLast.Y, 0), tmp_proj, tmp_view, Matrix.Identity); objSpace.Z = 0; objSpaceLast.Z = 0; // crazy way of making sure we only continue on mousemoves that were not just pixel to pixel float distance = Vector3.Distance(objSpaceLast, objSpace); if (distance > minMouseMove) { Vector3 moveDirection = Vector3.Normalize(objSpace - objSpaceLast); Vector3 force = (moveDirection * power) * (float)elapsed.TotalSeconds; transform.Position += force; OnShake(new ShakeEventArgs(moveDirection, force)); } } } transform.Position *= friction; ball.Update(camera.View, camera.Projection, Matrix.Identity, device); transform.Rotation = ball.CurrentQuaternion; /* * if (Keyboard.GetState().IsKeyDown(Keys.Left)) { * left += 2 * (float)elapsed.TotalSeconds; * } * if (Keyboard.GetState().IsKeyDown(Keys.Right)) { * left -= 2 * (float)elapsed.TotalSeconds; * } * * if (Keyboard.GetState().IsKeyDown(Keys.Up)) { * up -= 2 * (float)elapsed.TotalSeconds; * } * if (Keyboard.GetState().IsKeyDown(Keys.Down)) { * up += 2 * (float)elapsed.TotalSeconds; * } * * transform.Rotation = Quaternion.CreateFromRotationMatrix(Matrix.CreateRotationZ(left) * Matrix.CreateRotationX(up)); */ msLast = ms; }