MonoGame a Mouse.SetPosition ve Windows Store aplikaci

Tomáš Herceg       17. 4. 2015       C#, XNA       3920 zobrazení

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.

 

hodnocení článku

0       Hodnotit mohou jen registrované uživatelé.

 

Nový příspěvek

 

Příspěvky zaslané pod tento článek se neobjeví hned, ale až po schválení administrátorem.

                       
Nadpis:
Antispam: Komu se občas házejí perly?
Příspěvek bude publikován pod identitou   anonym.

Nyní zakládáte pod článkem nové diskusní vlákno.
Pokud chcete reagovat na jiný příspěvek, klikněte na tlačítko "Odpovědět" u některého diskusního příspěvku.

Nyní odpovídáte na příspěvek pod článkem. Nebo chcete raději založit nové vlákno?

 

  • Administrátoři si vyhrazují právo komentáře upravovat či mazat bez udání důvodu.
    Mazány budou zejména komentáře obsahující vulgarity nebo porušující pravidla publikování.
  • Pokud nejste zaregistrováni, Vaše IP adresa bude zveřejněna. Pokud s tímto nesouhlasíte, příspěvek neodesílejte.

Příspěvky zaslané pod tento článek se neobjeví hned, ale až po schválení administrátorem.

přihlásit pomocí externího účtu

přihlásit pomocí jména a hesla

Uživatel:  
Heslo:  

zapomenuté heslo

 

založit nový uživatelský účet

zaregistrujte se

 
zavřít

Nahlásit spam

Opravdu chcete tento příspěvek nahlásit pro porušování pravidel fóra?

Nahlásit Zrušit

Chyba

zavřít

feedback