2014-02-05 5 views
0

Я начал создавать класс Player для своей игры, поэтому из-за количества элементов управления для игры я использовал массив Ключа в переключатель, чтобы сделать его простым. Он работает правильно со всеми ключами, кроме одного.Проблема XNA C# с клавиатурой клавиатуры

Когда я нажимаю клавишу пробела и клавиши со стрелками, он одновременно обнаруживает одну из клавиш со стрелками и пробел. Но это происходит только с пробелом. Я пытался решить это, но я прокомментировал часть пространства, и он делает то же самое.

Это не происходит, если я использую метод isDown.

Вот код:

for (int Key = 0; Key < Keyboard.GetState().GetPressedKeys().Count(); Key++) 
{ 
    switch (Keyboard.GetState().GetPressedKeys()[Key]) 
    { 
     case Keys.Up: 
      Move(Direction.Up); 
      Console.WriteLine("Up"); 
      break; 
     case Keys.Down: 
      Move(Direction.Down); 
      Console.WriteLine("Down"); 
      break; 
     case Keys.Left: 
      Move(Direction.Left); 
      Console.WriteLine("Left"); 
      break; 
     case Keys.Right: 
      Move(Direction.Right); 
      Console.WriteLine("Right"); 
      break; 
     case Keys.LeftShift: 
      if (!isShifting) 
       isShifting = true; 
      break; 
     case Keys.A: 
      if (!oldKeyboardState.IsKeyDown(Keys.A)) 
       CastSkill(1); 
      break; 
     case Keys.Space: 
      shootMgr.Shoot(); 
      break; 
    } 
} 
+0

ли нажатие на пробел и стрелка в то же время работает в другом месте? На клавиатуре есть физическое ограничение, на котором вы можете нажать клавиши. –

+0

Да, он работает в любой другой игре или приложении – user3273343

ответ

0

Я бы лично это сделать в МФС вместо вашего для и переключателя.

var keys = Keyboard.GetState(); 

if (keys.IsKeyDown(Keys.Up) { 
    Move(Direction.Up); 
    Console.WriteLine("Up"); 
} 
if (keys.IsKeyDown(Keys.Down) { 
    ... 
} 

Но если вы хотите сделать это с петлей и выключателем, что происходит, когда вы включаете его вокруг:

var keys = Keyboard.GetState().GetPressedKeys(); 
for (var i = 0; i < keys.Count(); i++) { 
    switch (keys[i]) { 
     case: Keys.Up: 
      ... 
      break; 
     case: Keys.Down: 
      ... 
      break; 
    } 
} 

Я считаю, что ваша проблема исходит от вызова и получения нового массива из GetPressedKeys() каждую итерацию вашего цикла.

+0

Я использовал метод IsKeyDown, и он делает то же самое с пробелом:/ – user3273343

+0

Я протестировал вход в новый проект, и он делает то же самое. Пробел делает то же самое с другими клавишами. – user3273343

+0

кажется, что он не работает в некоторых таких двигателях, как Multimedia Fusion 2, но в других играх, таких как S4 League, я думаю, что это проблема с клавиатурой, но как некоторые игры решили это тогда ..? – user3273343

0

Сколько ключей вы нажимаете одновременно. Если нажать на много, в то же время и будет получать «Keyboard ореолов»: http://www.microsoft.com/appliedsciences/antighostingexplained.mspx

Теперь, если это не так, я хотел бы узнать, что ваш Move(Direction.Up) делает.

Я бы лично не использовать для переключателя но:

if (Keyboard.GetState().IsKeyDown(Keys.D)) 
{ 
    velocity.Y = 0f; 
    velocity.X = 2f;     
} 

Поместите это в обновление от вашего класса игрока (в случае, если вы не знаете: S)

+0

Кажется, это проблема с призрачной клавиатурой. Я думаю, что нет решения, кроме изменения контроля над игрой. – user3273343

+0

Вы решили проблему? – MCollard

Смежные вопросы