Як поводитися з введенням миші в XNA?


13

Я розвиваю карткову гру в XNA.

Чи є OnClickв XNA подія для об’єктів?

Я намагаюся змусити карти рухатися, коли гравець клацає на них. У цьому проекті є клас Sprite, який малює карту, але я трохи застряг, бо не знаю, як використовувати OnClickподії чи щось подібне.

Відповіді:


12

Під час роботи з XNA взагалі вам потрібно перейти від парадигми коду, керованої подією, до парадигми коду, керованої циклом. Ваш код оновлення циклічно 60 разів / с. Отже, кожен раз переглядайте стан миші, і якщо кнопка вниз & вказівник знаходиться у вашій прямій частині, то гілка до коду, яку ви зазвичай розміщуєте в події OnClick.


2
Здається, що це може бути семантично правильним, але також неправильним на мою думку. Немає подій, коли ви переходите до перегляду потоку та того, який поточний стан під час кожного циклу. Ось чому ми створюємо власні події та пишемо їх відповідні обробники. Я скажу, що використання контролю потоку для розгалуження кожного екземпляра миші вниз стане божевільним у великому проекті. Натомість зареєструйте подію та напишіть обробники, де потрібно. Події були продумані в першу чергу саме з цієї причини.
Брендон

5
Брендон: Ви не використовуєте контроль потоку для розгалуження на кожен екземпляр миші вниз. Ви записуєте поточний та попередній стан миші один раз на початку кожного кадру, а потім у кожному місці, на яке ваш код відповідає на натиснення миші, яке ви просто робите if(MouseLeftPress()){ DoSomething(); }, де MouseLeftPress()ви пишете метод порівняння поточного та попереднього стану лівої кнопки миші. Мені це легше, ніж впровадження подій більшу частину часу.
Ольховський

4
Просте опитування стає по-справжньому некрасивим за рамки вашого базового аркадного управління. У мене є клас керування введеннями, який фіксує стан геймпада як FlagAttributes і дозволяє відображати делегатів на різні комбінації кнопок. Наступним кроком є ​​реалізація термінів. Вся ця дискусія лише підкреслює думку Стіва Н, але ви даєте систему голосування, і ви можете базуватися на підтримці будь-якої парадигми.
michael.bartnett


6

XNA дає вам лише достатньо для створення власних класів введення - і ви повинні зробити це з урахуванням корисності, яку вони пропонують.

Я б рекомендував клас введення миші, описаний у цій публікації блогу ( вихідний код ). Він виявляє натискання, утримування або відпускання кнопки і дозволяє отримувати цю інформацію через опитування або події.

У відповідній примітці цей самий пост у блозі також містить класи клавіатури та геймпадних пристроїв введення.


3

Фактичний код для перевірки клацання миші в XNA приблизно такий;

    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);
    }

2

Якщо ваша гра 3D, ви можете реалізувати вибір, який описаний тут: http://create.msdn.com/en-US/education/catalog/sample/picking_triangle . В основному це створює промінь від камери до місця, куди клацає миша (з невеликою матрицею, яка не знімає проекції), потім ви перевіряєте, чи не перетинався жоден з ваших об'єктів.

Якщо ваша гра 2D, вам слід досить легко перекладати координати вікон на координати гри. Потім перевірте, чи є вибрані координати в межах будь-якого з ваших об'єктів.


1

Найпростіший спосіб дізнатися, чи натиснули мишу, це такий

//Create this variable
MouseState mouseState;

тепер у методі оновлення додайте це

mouseState = Mouse.GetState();

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

сподіваюся, що це допомогло

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.