Domanda

Ho una tela di 800x600 all'interno di una finestra di 300x300. Quando premo un determinato tasto, voglio che la tela si sposti in quella direzione.
L'ho fatto all'interno del codice della finestra dietro:

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);
}

Bene, funziona, ma il movimento è a scatti. E se tengo premuto un tasto, ad esempio W , si ferma per una frazione di secondo, prima di spostarsi.
Esiste un modo per rendere il movimento più fluido e liberarsi della pausa quando si tiene premuto un tasto?
Grazie.

È stato utile?

Soluzione

Attualmente, la tua configurazione accetta l'inserimento di chiavi spam (tenendo premuto un tasto). Il modo in cui l'ho visto fare nella maggior parte dei giochi con input basato sugli eventi è usare un array booleano, keydown [256] , mappando la tastiera (l'indice è il valore chiave); tutti i valori inizializzati su false .

Quando si preme il tasto, si imposta l'indice appropriato su true nel metodo keydown e nel ciclo di gioco / rendering, si chiama gameCanvas.RenderTransform = new TranslateTransform (gcX, gcY); a seconda delle chiavi dell'array che sono true . Impostate il valore della chiave su false quando la chiave viene rilasciata nel metodo dell'evento keyrelease (non sono sicuro di cosa sia in C #).

In questo modo otterrai uno scorrimento fluido e non avrai ritardi nell'avvio.

Altri suggerimenti

Sì, potresti incorporare il tempo nel tuo calcolo. Attualmente aggiungi / sottrai 5 ogni volta che l'evento si attiva e non è molto prevedibile.

Per rendere più fluido il movimento, assicurati di non sparare più spesso di X volte al secondo usando un DateTime.

come:

private static DateTime nextUpdate

if (nextUpdate <= DateTime.Now)
{
//Move
nextUpdate = DateTime.Now.AddMilliseconds(100);
}

Non ho VS in questo momento, quindi non sono perfettamente sicuro della sintassi, ma hai capito.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top