Pergunta
Eu tenho uma tela que é 800x600 dentro de uma janela que é 300x300. Quando pressiono uma certa tecla, quero que a tela se mova nessa direção.
Eu fiz isso dentro do código da janela atrás:
protected override void OnKeyDown(KeyEventArgs e) { base.OnKeyDown(e); Key keyPressed = e.Key; if (keyPressed == Key.W) { gcY += 5; } if (keyPressed == Key.S) { gcY -= 5; } if (keyPressed == Key.A) { gcX += 5; } if (keyPressed == Key.D) { gcX -= 5; } gameCanvas.RenderTransform = new TranslateTransform(gcX, gcY); }
Bem, funciona, mas o movimento é espumoso. E se eu me apegar a uma chave, C Por exemplo, ele faz uma pausa por uma fração de segundo, antes de se mover.
Existe alguma maneira de tornar o movimento mais suave e se livrar da pausa quando você segura uma chave?
Obrigado.
Solução
Atualmente, sua configuração está aceitando keyInput com spam (mantendo pressionada uma chave). A maneira como eu vi isso na maioria dos jogos com a entrada baseada no evento é usar uma matriz booleana, keydown[256]
, mapeando o teclado (o índice é o valor -chave); Todos os valores inicializados para false
.
Quando a tecla é pressionada, você define o índice apropriado para true
No método KeyDown e no seu loop de jogo/renderização, você liga gameCanvas.RenderTransform = new TranslateTransform(gcX, gcY);
dependendo de quais chaves na matriz são true
. Você define o valor da chave como false
Quando a chave é lançada no método do evento Keyrelease (não tenho certeza do que é em C#).
Dessa forma, você terá rolagem suave e não terá um atraso no início.
Outras dicas
Sim, você pode incorporar o tempo em seu cálculo. Atualmente, você adiciona/subestrinha 5 sempre que o evento dispara, e isso não é realmente previsível.
Para suavizar o movimento, certifique -se de não disparar com mais frequência do que x vezes por segundo usando um tempo de dados.
Curti:
private static DateTime nextUpdate
if (nextUpdate <= DateTime.Now)
{
//Move
nextUpdate = DateTime.Now.AddMilliseconds(100);
}
Eu não tenho vs agora, então não tenho perfeitamente certeza da sintaxe, mas você entendeu.