MonoGame.Forms is the easiest way of integrating a MonoGame render window into your Windows Forms project. It should make your life much easier, when you want to create your own editor environment.
Do you like my tools? Feel free to refresh me (🌞 Summer is hot 🌡️):
- The MonoGame.Forms.DX project uses a modified version of the MonoGame.Framework 3.8.0.270, which is already precompiled and included in this repo.
- The MonoGame.Forms.GL project uses a modified version of the MonoGame.Framework based on the development build from 16th of JULY 2018.
The OpenGL version of the library currently renders differently than the DirectX one, which makes it generally slower. If you need as much perormance as possible, you should definitley use the DirectX library.
- Boost performance of a custom OpenGL control by raising its DrawIntervall with the property window during design time (try 50ms or 100ms. 1ms aims to 60 fps)
- Never use DoubleBuffering on a custom control. This counts for the OpenGL library as well as for the DirectX library! It will cause flickering and slow downs.
- If you need to have the MonoGame-PipelineTool integrated into your MonoGame.Forms project, you should check out the PipelineTool-Tutorial! NEW: Now you can also directly install the Visual Studio templates or use the combined NuGet-Packages [DX | GL] !
First you need to make your MonoGame.Forms library ready to use. This step is very easy; you just need to compile either the MonoGame.Forms.DX or the MonoGame.Forms.GL PCL from source and then just add the compiled DLL's to your project.
↳ This is the prefered route, when you want to make you own custom changes to the library or extend it.
Another option is to install the library with the NuGet package manager:
↳ This is the prefered and easiest route to be automatically up to date.
Note: You need to set the .Net Framework version to 4.5.1 to install from NuGet!
The following tutorial is working exactly the same on both libraries (DX and GL).
Creating a simple InvalidationControl
Let's start using the MonoGame.Forms library by creating a simple control to render stuff!
(it's assumed that you already have created a new Windows Forms project with the installed library)
- Create a new class and name it DrawTest
- Inherit from MonoGame.Forms.Controls.InvalidationControl
- Override its Initialize() method
- Override its Draw() method
- Save & Build your solution
- Double Click on Form1.cs so that the Designer opens
- Open the Toolbox
- Drag & Drop the newly created control onto the Form1 control
- Open the Properties of the new control and set the Dock option to Fill
This is how it should look now:
- Now run the solution and see the classical CornflowerBlue-Screen you are (surly) familiar with! ;-)
And yes, as you can see: it is realy THAT EASY!
Now I bet you wonder how to draw something to this control, right? I bet you think that this is now the difficult part, right? Well... it's not!
More than that it's basically the same like you are used to do in the MonoGame.Framework. Just with a small difference (no it's still not difficult!)
In MonoGame you could draw someting to the screen with the SpriteBatch. In MonoGame.Forms you will do the same but you need to use GFXService for this.
In the InvalidationControl and MonoGameControl class this service is called Editor. To draw something to the SpriteBatch you need to do this:
Editor.spriteBatch.DrawString();
Do you see? Easy! :)
The GFXService class contains some MonoGame specific stuff like a ContentManager. Examine everything calmly. I just want to explain a little how MonoGame.Forms works under the hood!
To sum things up, let's take a look at the final DrawTest class:
using Microsoft.Xna.Framework;
using MonoGame.Forms.Controls;
namespace nugetTest
{
public class DrawTest : InvalidationControl
{
string WelcomeMessage = "Hello MonoGame.Forms!";
protected override void Initialize()
{
base.Initialize();
}
protected override void Draw()
{
base.Draw();
Editor.spriteBatch.Begin();
Editor.spriteBatch.DrawString(Editor.Font, WelcomeMessage, new Vector2(
(Editor.graphics.Viewport.Width / 2) - (Editor.Font.MeasureString(WelcomeMessage).X / 2),
(Editor.graphics.Viewport.Height / 2) - (Editor.FontHeight / 2)),
Color.White);
Editor.spriteBatch.End();
}
}
}
Result:
It's pretty much like in the MonoGame.Framework!
Note: If you are changing the drawn contents of the SpriteBatch when your editor project is running (not during design time), then you simply need to call Invalidate() on a custom control for every change you want to see on your control. This command commits those changes and after that your control does not consume CPU power anymore. This process is great when creating preview controls for textures and similar things!
For realtime interactions (game loop) please read the next topic about the MonoGameControl!
Creating a simple MonoGameControl
As you might though right: Yes, this is also very easy. It's the same like for the InvalidationControl. I just want to show you the only difference:
protected override void Update(GameTime gameTime)
{
base.Update(gameTime);
}
The update method makes realtime interactions with your game- / editor environment possible. Even complex mechanics are doable.
I just want to refer to the nice MonoGame.Forms.Test-Project, which is part of this repo. Take a look at it and learn from its samples.
Note: To raise the performance of an OpenGL MonoGameControl, it's recommended to change the DrawIntervall from 1ms to 50ms or 100ms!
Did you notice the BackColor and ForeColor property? Changing these values makes it possible to style your controls to something like this:
Do it to keep the overview and feel of your custom editor project!
Note: The MonoGame logo is placed automatically inside a newly created control to make it clear, that it is a render control with MonoGame functionality!
Here are some pics of some samples included with the repo:
Please watch the following YouTube videos in 1080p @ 60fps to see what is possible with MonoGame.Forms!
Twitter: #RogueEngineEditor
This project is called: "PenumbraPhysics.Editor" and it was the prototype for the Rogue Engine Editor and MonoGame.Forms:
GitHub: PenumbraPhysics.Editor
- nkast and SpiceyWolf from the MonoGame community
- everyone else from the official MonoGame.Forms_Thread
- the awesome MonoGame community itself :)