Va bene chiamare le funzioni quando si verifica un evento o dopo?

0

Quindi non ero sicuro di come strutturare questo titolo, sentiti libero di modificarlo.

La mia domanda è: Quando ho un Game Loop, ho 3 blocchi principali. Gestisci gli eventi, aggiorna lo stato del gioco e disegna. Diciamo per esempio che controllo gli eventi di tastiera / mouse e voglio spostare il mio carattere quando i pulsanti sono premuti. Ogni volta che si verifica l'evento KEYDOWN , dovrei chiamare immediatamente Player.move ? O dovrei alternare move_left/move_right bools e quindi chiamare Player.move quando sono nel blocco di stato del gioco di aggiornamento.

Mi chiedevo perché, ad esempio, una funzione esegue un lungo algoritmo e la chiamo quando si verifica un evento, chiamando la funzione ci vorrà del tempo, e nel frattempo potrei premere più pulsanti / eventi. Penso che perderò alcuni di quegli eventi perché in quel momento la funzione algitmica stava scorrendo.

Oppure, posso attivare o disattivare un bool quando si verifica l'evento, e dopo aver controllato TUTTI gli eventi, eseguo funzioni basate sui bool.

PS: sentiti libero di modificare questo post in una domanda più costruttiva.

    
posta dragons 06.10.2013 - 02:03
fonte

3 risposte

2

Bene, in poche parole:

  • se si utilizza il metodo "toggle booleans" si rischia di "perdere" gli input dell'utente. A volte l'utente fa clic su 3 volte per consentire al suo clic di essere "riconosciuto" da un tale meccanismo di gestione degli input. Per qualcosa come un gioco di combattimento che supporta combo e tale effetto sarebbe molto pronunciato.

  • se fai qualcosa in cui il gestore di eventi di input altera direttamente il tuo stato di gioco (ignorando il ciclo di gioco) è negativo per diversi motivi: il tuo codice non sarà più separato bene; anche se tecnicamente non c'è un evento di input dell'utente che viene saltato, potrebbe sembrare ANCORA simile al giocatore umano, dato che alcune modifiche allo stato di input possono accadere così velocemente che il rendering grafico non le tiene in considerazione (immagina un rosso-blu, lampeggiante velocemente luce, che cambia colore quando il giocatore preme un pulsante)

  • l'uso di una coda di input è probabilmente il modo migliore per andare. Qualcosa come:

    function processInput() {
       while(!inputEventsQueue.isEmpty()) {
            //you may decide to cap the maximum number of events delt with in one step
            InputEvent e = inputEventsQueue.pop();
            for(Entity e:gameEntities) {
                e.processInput(e)
            }
       }
    }
    

    // ciclo di gioco
    mentre(...) {   ProcessInput ();   updateState ();   updateGraphics (); }

risposta data 07.10.2013 - 15:09
fonte
0

Non devi saltare input utente validi. Se la tua funzione di gioco deve rispondere a un singolo input, non hai altra scelta che rispondere immediatamente a quell'input. È possibile mettere in coda gli input dell'utente e riprodurli in sequenza il prima possibile. Questo funzionerebbe quando stai giocando una partita a giocatore singolo. Un'altra opzione è bloccare il dispositivo di input (tastiera, ecc.) Finché la funzione non viene elaborata dopo aver indicato che il sistema sta elaborando l'input precedente. In tutti i casi, provare a ottimizzare la funzione di lunga durata. Le probabilità sono con i computer di oggi, puoi farlo con un po 'di lavoro.

    
risposta data 06.10.2013 - 05:15
fonte
0

Dipende dal tipo di gioco che stai facendo.

Per un FPS si desidera rispondere a ciò che l'utente sta facendo proprio in questo momento. In tal caso, sì, elaborerei tutti gli eventi e determinerei ciò che l'utente sta facendo in questo momento. Quindi fallo nella funzione di aggiornamento.

Per un RTS il significato dell'ingresso corrente dipende dall'input precedente. Saltare per tracciare solo l'ultima azione potrebbe rovinare tutto. Vale a dire selezionare l'unità 1, attaccare l'unità 3, selezionare l'unità 2, attaccare l'unità 4, rilasciare l'unità di selezione 2 perché non era l'ultima azione sulla coda degli eventi, ora l'unità 1 sta attaccando l'unità 4, l'unità 2 non sta facendo nulla , l'unità 3 è ancora viva e non impegnata.

Per il tuo gioco cosa significherebbe inserire un input? Potrebbe significare che il tuo gioco rimane reattivo anche se il frame rate balbetta. Potrebbe significare rovinare lo stato di input perché un evento dipende da un evento precedente nello stream.

    
risposta data 07.10.2013 - 16:35
fonte

Leggi altre domande sui tag