XNA установить ключ к освобождению? - PullRequest
1 голос
/ 03 апреля 2012

Я пишу простую игру на XNA, где вы перемещаете спрайт с помощью WSAD. Проблема в том, что если две клавиши одного и того же направления нажимаются одновременно, движение отменяется, и персонаж не двигается. Можно ли вручную установить ключ для освобождения, чтобы избежать этого? Вот код движения ключа:

if (newKeyState.IsKeyDown(Keys.W))
{
     position.Y -= vel;
}
if (newKeyState.IsKeyDown(Keys.S))
{
     position.Y += vel;
}
if (newKeyState.IsKeyDown(Keys.A))
{
     position.X -= vel;
}
if (newKeyState.IsKeyDown(Keys.D))
{
     position.X += vel;
}

Ответы [ 2 ]

1 голос
/ 03 апреля 2012

Состояние клавиши (newKeyState в приведенном выше коде) представляет собой фактическое физическое состояние клавиатуры, поэтому невозможно или нежелательно устанавливать состояние клавиши, отпущенной, когда пользователь все еще удерживает ее нажатой. Однако есть несколько альтернатив, которые позволят вам достичь желаемого конечного результата:

1) Вы можете реструктурировать свой код, например,

if(newKeyState.IsKeyDown(Keys.W))
{
    position.Y -= vel;
}
else if(newKeyState.IsKeyDown(Keys.S))
{
    position.Y += vel;
}
// etc.

2) Вы можете поддерживать свое собственное состояние (т. Е. Кэшированную версию newKeyState) и устанавливать ключи, выпущенные в этом.

1 голос
/ 03 апреля 2012

Можно ли вручную установить ключ разблокировки, чтобы избежать этого?

Нет. Тем не менее, вы можете изменить его на else-if. В этом случае при нажатии W && S будет учитываться только W. Вы можете изменить это, изменив, какой ключ проверяется первым.

if (newKeyState.IsKeyDown(Keys.W)) {
     position.Y -= vel;
} else if (newKeyState.IsKeyDown(Keys.S)) {
     position.Y += vel;
} else if (newKeyState.IsKeyDown(Keys.A)) {
     position.X -= vel;
} else if (newKeyState.IsKeyDown(Keys.D)) {
     position.X += vel;
}

Если вы хотите перемещаться только в одном направлении по каждой оси.

if (newKeyState.IsKeyDown(Keys.W)) {
     position.Y -= vel;
} else if (newKeyState.IsKeyDown(Keys.S)) {
     position.Y += vel;
} 

if (newKeyState.IsKeyDown(Keys.A)) {
     position.X -= vel;
} else if (newKeyState.IsKeyDown(Keys.D)) {
     position.X += vel;
}
...