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.

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top