Domanda

Proverò a spiegare il mio scenario nel miglior modo possibile;

Ad ogni applicazione tick interrogo lo stato corrente della tastiera e del mouse e li avvolgo in singole classi e strutture di dati. Per la tastiera è un array del mio enum Keys (un elemento per ciascuno dei tasti che sono attualmente premuti) e per il mouse è una classe contenente delta di coordinate e bool per ogni pulsante premuto.

Ho anche una macchina statale rudimentale gestita tramite una classe manager statale che mantiene lo stack e esegue il marshalling degli stati.

Tutto quello che voglio sapere è, il modo migliore per passare l'input (istantanee) ai singoli stati in cui la mia app può trovarsi in qualsiasi momento?

Vorrei elaborare quanto più input possibile lontano dai singoli stati, in modo da ridurre la logica ripetitiva all'interno degli stati.

O sarebbe meglio mantenere le istantanee di input il più pure possibile e passarle agli stati in modo che possano tenere nascoste le loro logiche specifiche di input?

Nota
Questa struttura è simile a come immagino che un gioco funzioni e, sebbene questa applicazione non sia un gioco, deve essere elaborata il più rapidamente possibile.

È stato utile?

Soluzione

Perché stai interrogando lo stato della tastiera e del mouse ad ogni segno di spunta? Una soluzione molto migliore e tradizionale sarebbe quella di catturare eventi lanciati dalla tastiera e dal mouse. In questo modo devi aggiornare lo stato solo quando DEVI.

Altri suggerimenti

Se esegui semplicemente una query su tastiera e mouse ogni segno di spunta, posso garantire che incontrerai dei problemi. Quando esegui una query su ogni tick, scoprirai che manchi gli input che si verificano rapidamente (nel dominio temporale di un singolo tick). Immagina una situazione in cui l'utente preme e rilascia un tasto / pulsante tra due tick (accadrà più di quanto pensi) - ti perderai completamente l'input.

Soprattutto in C #, che è completamente orientato per eventi di input come questo, dovresti usare eventi.

In XNA, lo fanno rendendo statica la classe della tastiera.

KeyboardState state = Keyboard.GetState();

puoi quindi accedere allo stato chiave corrente con la riga di codice sopra.

Dovresti lanciare eventi e catturare gli argomenti. Sarebbe il modo più semplice ed efficiente per gestirlo.

class YourClass
{    
    //data members ...

    public void OnKeyboardPress(object sender, EventArgs args)
    {
        //handle your logic capturing the state here
    }
}

//elsewhere
someControl.KeyPress += new KeyPressDelegate(yourClassInstance.OnKeyboardPress);
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top