MonoGame je knihovna, která vznikla jako nástupce XNA a jejímž cílem je umožnit vývoj her pro všechny platformy. Pomocí Xamarinu lze kompilovat pro Android a iOS a lze v ní vyvíjet jak klasické okenní Windows hry, tak i Windows Store aplikace.
API této knihovny je až na pár detailů stejné jako u XNA, takže teoreticky stačí hru překompilovat oproti jiným knihovnám – názvy tříd, namespaců a funkcí jsou stejné. V praxi ovšem narazíte na mnoho drobných rozdílů daných omezeními jednotlivých platforem.
Tak například funkce Mouse.SetPosition, která má za úkol nastavit kurzor myši na danou souřadnici na obrazovce. Používá se typicky v situaci, kdy píšete hru s first person kamerou a myš používá uživatel pro míření na cíl. Kurzor myši potřebujete mít neustále uprostřed obrazovky a jakmile se pohne, tak jen posunete kameru, ale kurzor vrátíte zase zpět.
Potíž je v tom, že ve WinRT nemůže aplikace pozici myši měnit. Naštěstí je ale možné myš přepnout do tzv. relativního módu, kdy je kurzor skrytý a v aplikaci dostáváte události, že se myš pohnula, přičemž se neberou v úvahu okraje obrazovky, takže můžete jet libovolným směrem “donekonečna”. Tento mód je určen pro hry, takže pokud chcete first person kameru implementovat v MonoGame ve Windows Store aplikaci, je potřeba použít následující postup.
Nejprve je nutné skrýt kurzor myši a zaregistrovat odběr události MouseMoved.
private Vector2 lastMouseMovement;
public Game1()
{
...
Windows.UI.Xaml.Window.Current.CoreWindow.PointerCursor = null;
Windows.Devices.Input.MouseDevice.GetForCurrentView().MouseMoved += (sender, args) =>
{
lastMouseMovement = new Vector2(args.MouseDelta.X, args.MouseDelta.Y);
};
}
Ve chvíli, kdy se pozice myši změní, bude naše událost zavolána, a do proměnné lastMouseMovement si uložíme hodnoty, o které se myš posunula.
Ve funkci Update pak stačí na tyto hodnoty zareagovat (a proměnnou vynulovat, abyste ji nepoužili opakovaně).
Pokud píšete hru, asi nikdy nebudete potřebovat tento režim vypnout (platí jen pro vaši aplikaci - vypne se, jakmile uživatel aplikaci opustí nebo ukončí). Nicméně pokud byste potřebovali tento režim vypnout (nedají se v něm pomocí myši otevřít systémové boční panely), tak stačí do vlastnosti PointerCursor vrátit zpět to, co v ní bylo, a odebrat handler na danou událost.