If you haven't done so already, be sure to visit the Wiki Portal to read about how the wiki works. Especially the Ogre Wiki Overview page.
MOIS is the Mogre .NET wrapper for OIS (Object Oriented Input System). It is an object oriented input library and supports many different devices in three basic device categories (keyboards, mice, and joysticks).
Table of contents
Setup
MOIS is included in the Mogre SDK and used by some Mogre-Samples like ExampleApplication.
Set up the library...
- In your bin/debug directory you need the file MOIS_d.dll.
- In your bin/release directory you need the file MOIS.dll.
- In your project add a link to the MOIS.dll library.
Note: In older releases additonally the file OIS.dll was needed, but now it's already embedded in the MOIS.dll file.
Using
In your code...
- Initialize the MOIS.InputManager and the used devices.
- Capture your devices and respond to button/key presses.
An example for initializing MOIS can be found in the ExampleApplication from the Mogre-Samples.
Here's a snippet from it:
protected MOIS.InputManager inputManager; protected MOIS.Keyboard inputKeyboard; protected MOIS.Mouse inputMouse; public void CreateInput() { MOIS.ParamList pl = new MOIS.ParamList(); IntPtr windowHnd; window.GetCustomAttribute("WINDOW", out windowHnd); // window is your RenderWindow! pl.Insert("WINDOW", windowHnd.ToString()); inputManager = MOIS.InputManager.CreateInputSystem(pl); // Create all devices (except joystick, as most people have Keyboard/Mouse) using unbuffered input. inputKeyboard = (MOIS.Keyboard)inputManager.CreateInputObject(MOIS.Type.OISKeyboard, false); inputMouse = (MOIS.Mouse)inputManager.CreateInputObject(MOIS.Type.OISMouse, false); }
What I found useful is to adjust the mouse range to the dimensions of the viewport to get the actual mouse position in pixels.
The default mouseState.width and .height values are 50, which are obviously too low to get a smooth mouse movement.
Add this at the end of CreateInput():
MOIS.MouseState_NativePtr mouseState = inputMouse.MouseState; mouseState.width = viewport.ActualWidth; mouseState.height = viewport.ActualHeight;
If you are using Visual Studio the Object Browser is good to see which members are available in MOIS.
Unbuffered mode
In FrameStarted() or FrameEnded() do something like this:
// Capture all key presses since last check. inputKeyboard.Capture(); // Capture all mouse movements and button presses since last check. inputMouse.Capture(); // Get current mouse position (e.g. to inject into GUI). mouseState As MOIS.MouseState_NativePtr = _Mouse.MouseState int screenx = mouseState.X.abs; int screeny = mouseState.Y.abs; if (inputKeyboard.IsKeyDown(MOIS.KeyCode.KC_BACK)) { // ... do something when BACK key is down } if (inputKeyboard.IsKeyDown(MOIS.KeyCode.KC_1)) { // ... do something when 1 key is down } if (mouseState.ButtonDown(MOIS.MouseButtonID.MB_Left)) { // ... do something when left mouse button is pressed }
Buffered mode
Change these line in CreateInput():
// Create all devices (except joystick, as most people have Keyboard/Mouse) using unbuffered input. inputKeyboard = (MOIS.Keyboard)inputManager.CreateInputObject(MOIS.Type.OISKeyboard, false); inputMouse = (MOIS.Mouse)inputManager.CreateInputObject(MOIS.Type.OISMouse, false);
to:
// Create all devices (except joystick, as most people have Keyboard/Mouse) using buffered input. inputKeyboard = (MOIS.Keyboard)inputManager.CreateInputObject(MOIS.Type.OISKeyboard, true); inputMouse = (MOIS.Mouse)inputManager.CreateInputObject(MOIS.Type.OISMouse, true);
Capture input events in FrameStart() or FrameEnded():
// Capture all key presses since last check. inputKeyboard.Capture(); // Capture all mouse movements and button presses since last check. inputMouse.Capture();
Add event handlers to your CreateEventHanlder() method. Mine looks like this:
public void CreateEventHandler() { mRoot.FrameStarted += new FrameListener.FrameStartedHandler(FrameStarted); mRoot.FrameEnded += new FrameListener.FrameEndedHandler(FrameEnded); if (inputKeyboard != null) { LogManager.Singleton.LogMessage("Setting up keyboard listeners"); inputKeyboard.KeyPressed += new MOIS.KeyListener.KeyPressedHandler(KeyPressed); inputKeyboard.KeyReleased += new MOIS.KeyListener.KeyReleasedHandler(KeyReleased); } if (inputMouse != null) { LogManager.Singleton.LogMessage("Setting up mouse listeners"); inputMouse.MousePressed += new MOIS.MouseListener.MousePressedHandler(MousePressed); inputMouse.MouseReleased += new MOIS.MouseListener.MouseReleasedHandler(MouseReleased); inputMouse.MouseMoved += new MOIS.MouseListener.MouseMovedHandler(MouseMotion); } }
Create event handler methods:
public bool MouseMotion(MOIS.MouseEvent e) { // you can use e.state.Y.rel for reltive position, and e.state.Y.abs for absolute return true; } public bool MousePressed(MOIS.MouseEvent e, MOIS.MouseButtonID button) { switch (button) { case MOIS.MouseButtonID.MB_Left: break; } return true; } public bool MouseReleased(MOIS.MouseEvent e, MOIS.MouseButtonID button) { return true; } public bool KeyPressed(MOIS.KeyEvent e) { switch (e.key) { case MOIS.KeyCode.KC_ESCAPE: break; } return true; } public bool KeyReleased(MOIS.KeyEvent e) { switch (e.key) { case MOIS.KeyCode.KC_ESCAPE: break; } return true; }
You can still use the isKeyDown() function to determine the state of your keyboard, just as if you were using immediate/unbuffered mode (more information in this forum post).
See Also
- OIS
- Using OIS
- Basic Tutorial 4 - Unbuffered Input using OIS (see section Processing Input)
- Basic Tutorial 5 - Buffered input using OIS (note: this C++ tutorial has an other content than the Mogre Basic Tutorial 5)
- MOIS source code
- German keyboard layout (remapped keys)
- OIS API created with doxygen
- OIS User Forum
Alternatives
- Input handling by WinAPI as alternative to OIS (a little bit more efficient; needed for multiple mice or keyboards)
- SharpInputSystem
- an other input alternative (alpha status, latest code in SVN)
- SlimDX
- an open source framework for easy use of DirectX by C# (e.g. inputs from keyboard, mouse, gamepad - see tutorials in the SlimDX SDK) You just need the file SlimDX.dll and the newest DirectX version.
- Getting all you can out of a keyboard layout
- an alternative how to get key inputs
Contributors to this page: Beauty
and
jacmoe
.
Page last modified on Wednesday 18 of August, 2010 15:00:12 GMT by Beauty
.
The content on this page is licensed under the terms of the Creative Commons Attribution-ShareAlike License.
As an exception, any source code contributed within the content is released into the Public Domain.

