Jak obsługiwać wejście myszy w XNA?

13

Tworzę grę karcianą w XNA.

Czy OnClickw XNA jest jakieś zdarzenie dla obiektów?

Próbuję sprawić, by karty się poruszyły, gdy gracz je kliknie. W tym projekcie jest klasa Sprite, która losuje kartę, ale utknęłam trochę, ponieważ nie wiem, jak używać OnClickzdarzeń lub czegoś podobnego.

Luis
źródło

Odpowiedzi:

12

Podczas pracy z XNA ogólnie musisz przejść od paradygmatu opartego na zdarzeniu do paradygmatu opartego na pętli. Twój kod aktualizacji zapętla się 60 razy / sek. Więc za każdym razem spójrz na stan myszy, a jeśli przycisk jest wciśnięty, a wskaźnik znajduje się w odbytnicy, następnie przejdź do kodu, który zwykle umieszczasz w zdarzeniu OnClick.

Steve H.
źródło
2
Wydaje się, że może to być semantycznie poprawne, ale moim zdaniem również błędne. Nie ma żadnych zdarzeń, kiedy zabierasz się za przeglądanie wątku i jaki jest obecny stan podczas każdej pętli. Dlatego tworzymy własne wydarzenia i piszemy odpowiadające im procedury obsługi. Powiedziałbym, że użycie kontroli przepływu do rozgałęzienia każdego wystąpienia myszy w dół byłoby szalone w dużym projekcie. Zamiast tego zarejestruj zdarzenie i napisz moduły obsługi w dowolnym miejscu. Z tego powodu wymyślono wydarzenia.
brandon
5
Brandon: Nie „używasz kontroli przepływu, aby rozgałęziać się do każdego wystąpienia myszy w dół”. Bieżący i poprzedni stan myszy rejestruje się raz na początku każdej klatki, a następnie w każdym miejscu, w którym kod reaguje na wciśnięty przycisk myszy, po prostu robisz if(MouseLeftPress()){ DoSomething(); }, gdzie MouseLeftPress()jest metoda, którą piszesz, aby porównać obecny i poprzedni lewy przycisk myszy. Uważam to za łatwiejsze niż wdrażanie wydarzeń przez większość czasu.
Olhovsky
4
Proste odpytywanie staje się naprawdę brzydkie poza podstawowymi kontrolkami zręcznościowymi. Mam klasę menedżera wprowadzania, która przechwytuje stan pada jako FlagAttributes i pozwala mapować uczestników na różne kombinacje przycisków. Następnym krokiem jest wdrożenie harmonogramu. Cała ta debata tylko wzmacnia punkt Steve'a H, dajesz system głosowania i możesz go zbudować, aby poprzeć dowolny paradygmat, który preferujesz.
michael.bartnett
6

XNA daje tylko tyle, ile potrzeba do zbudowania własnych klas wejściowych - i powinieneś to zrobić, biorąc pod uwagę oferowane przez nich narzędzie.

Poleciłbym klasę wprowadzania myszy opisaną w tym poście na blogu ( kod źródłowy ). Wykrywa naciśnięcie, przytrzymanie lub zwolnienie przycisku i pozwala uzyskać te informacje za pośrednictwem ankiety lub zdarzeń.

W powiązanej notatce ten sam post na blogu zawiera również klasy urządzeń wejściowych klawiatury i gamepada.

doppelgreener
źródło
3

Rzeczywisty kod sprawdzania kliknięcia myszą w XNA jest mniej więcej taki;

    MouseState previousMouseState;
    protected override void Initialize()
    {
        // TODO: Add your initialization logic here
        //store the current state of the mouse
        previousMouseState = Mouse.GetState();
    }


    protected override void Update(GameTime gameTime)
    {
        // .. other update code


        //is there a mouse click?
        //A mouse click occurs if the goes from a released state
        //in the previous frame  to a pressed state 
        //in the current frame
        if (previousMouseState.LeftButton == ButtonState.Released 
            && Mouse.GetState().LeftButton == ButtonState.Pressed)
        {
            //do your mouse click response...

        }

        //save the current mouse state for the next frame
        // the current 
        previousMouseState = Mouse.GetState();

        base.Update(gameTime);
    }
Rozpoznać
źródło
2

Jeśli twoja gra jest w 3D, możesz zaimplementować komisjonowanie, które opisano tutaj: http://create.msdn.com/en-US/education/catalog/sample/picking_triangle . Zasadniczo tworzy to promień z kamery do miejsca kliknięcia myszką (z niewielką matrycą, która nie powoduje projekcji), a następnie sprawdzasz, czy któryś z twoich obiektów nie został przecięty przez promień.

Jeśli gra jest 2D, powinieneś być w stanie dość łatwo przetłumaczyć współrzędne okna na współrzędne gry. Następnie sprawdź, czy wybrane współrzędne mieszczą się w granicach dowolnego z twoich obiektów.

MichaelHouse
źródło
1

Najprostszym sposobem sprawdzenia, czy kliknięto myszą, jest to

//Create this variable
MouseState mouseState;

teraz w metodzie aktualizacji dodaj to

mouseState = Mouse.GetState();

if (mouse.RightButton == ButtonState.Pressed)
{
     //Do Stuff
}

mam nadzieję, że to pomogło

Battle_Pasture
źródło