Відповіді:
Під час роботи з XNA взагалі вам потрібно перейти від парадигми коду, керованої подією, до парадигми коду, керованої циклом. Ваш код оновлення циклічно 60 разів / с. Отже, кожен раз переглядайте стан миші, і якщо кнопка вниз & вказівник знаходиться у вашій прямій частині, то гілка до коду, яку ви зазвичай розміщуєте в події OnClick.
if(MouseLeftPress()){ DoSomething(); }
, де MouseLeftPress()
ви пишете метод порівняння поточного та попереднього стану лівої кнопки миші. Мені це легше, ніж впровадження подій більшу частину часу.
Вам потрібно буде реалізувати це самостійно. Спробуйте переглянути підручник за адресою: http://bluwiki.com/go/XNA_Tutorials/Mouse_Input
XNA дає вам лише достатньо для створення власних класів введення - і ви повинні зробити це з урахуванням корисності, яку вони пропонують.
Я б рекомендував клас введення миші, описаний у цій публікації блогу ( вихідний код ). Він виявляє натискання, утримування або відпускання кнопки і дозволяє отримувати цю інформацію через опитування або події.
У відповідній примітці цей самий пост у блозі також містить класи клавіатури та геймпадних пристроїв введення.
Фактичний код для перевірки клацання миші в 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);
}
Якщо ваша гра 3D, ви можете реалізувати вибір, який описаний тут: http://create.msdn.com/en-US/education/catalog/sample/picking_triangle . В основному це створює промінь від камери до місця, куди клацає миша (з невеликою матрицею, яка не знімає проекції), потім ви перевіряєте, чи не перетинався жоден з ваших об'єктів.
Якщо ваша гра 2D, вам слід досить легко перекладати координати вікон на координати гри. Потім перевірте, чи є вибрані координати в межах будь-якого з ваших об'єктів.
Найпростіший спосіб дізнатися, чи натиснули мишу, це такий
//Create this variable
MouseState mouseState;
тепер у методі оновлення додайте це
mouseState = Mouse.GetState();
if (mouse.RightButton == ButtonState.Pressed)
{
//Do Stuff
}
сподіваюся, що це допомогло