Come dovrebbero essere progettate le funzioni di keypoll nei giochi?

4

Quindi sto creando un clone di Super Mario Bros in pygame. A partire da ora sono nel bel mezzo di rendere la mia funzione di keypoll, per controllare tutti i tasti che vengono attualmente premuti. Mi chiedo quale sarebbe meglio:

  1. La funzione keypoll modifica gli attributi marios (ad esempio, la direzione orizzontale), quindi in base a quelli, mario decide quale azione dovrebbe fare (cioè, cammina, corri, salta, ecc.) e chiama la funzione corrispondente azione (es. mario.moveHorz ())

    o

  2. Chiedi alla funzione keypoll di chiamare la funzione dell'azione che dovrebbe eseguire, quindi l'istanza di Mario deciderà in quale stato si trova attualmente.

Ecco un codice semi-pseudo per il primo:

def doAction():
    if mario.horzDir == 'r' or 'l':
        mario.moveHorz()
    elif mario.action == 'jump':
        mario.jump()

 def keyPoll(keys):
    if keys[K_RIGHT]:
        mario.horzDir = 'r'
    elif keys[K_LEFT]:
        mario.horzDir = 'l'
    if keys[K_z]:
        mario.action = 'jump'

Ecco un altro codice semi-pseudo per il secondo:

def keyPoll(keys):
    if keys[K_RIGHT]:
        mario.moveHorz('r')
    elif keys[K_LEFT]:
        mario.moveHorz('l')
    if keys[K_z]:
        mario.jump()

def setProperties():
    if mario.x_vel > 0:
        mario.horzDir = 'r'
    elif mario.x_vel < 0:
        mario.horzDir = 'l'
    elif mario.y > ground:
        mario.action  = 'jump'

Entrambi essenzialmente realizzano la stessa cosa, semplicemente non so quale sia più corretto.

Grazie!

    
posta Robbie 23.07.2015 - 20:22
fonte

1 risposta

3

Poiché il polling dei tasti di solito avviene nella parte superiore del ciclo di gioco, la domanda specifica che stai ponendo è difficile da separare completamente da tutte le altre questioni estremamente importanti di cui bisogna essere a conoscenza quando si progetta un ciclo di gioco (commento di Gilbert sembra riferirsi ad alcuni di loro). Per metterli da parte, ti suggerisco semplicemente di leggere questo: link Ora per rispondere alla tua domanda specifica.

È meglio per la funzione keypoll chiamare i metodi mario piuttosto che impostare% proprietàmario, principalmente perché tutti questi comandi avranno almeno uno o due passaggi aggiuntivi oltre a impostare un campo sull'oggetto. mario può avere una macchina di stato interna che tiene traccia del fatto che il salto o la modifica della direzione sia consentito nel suo stato attuale. Potrebbe tenere traccia di quante volte gli è stato detto di spostarsi a destra oa sinistra nei vari fotogrammi in modo da poter accelerare o rallentare gradualmente. Potrebbe avere ancora più stato per aiutarlo a funzionare quando hai fatto gli input per varie mosse combo speciali. keyPoll() non dovrebbe sapere nulla di tutto ciò.

Impostando un campo e quindi chiamando un metodo per fare tutto questo lavoro, stai essenzialmente facendo in due passaggi cosa potresti fare con un passo. Di solito non è una buona cosa. Sì, è probabile che mario abbia un metodo update () o render () per essere chiamato più tardi, ma questi dovrebbero essere completamente separati dai metodi per gestire l'input.

Ora, se questa è l'opzione migliore dipende dalla complessità del tuo gioco, ma per la maggior parte dei giochi, è meglio andare ancora più lontano, e non avere la tua keyPoll() funzione direttamente riferita a mario a tutti. In linea di principio, l'unica cosa che keyPoll() deve fare è controllare lo stato della tastiera e produrre zero o più oggetti che rappresentano comandi . Se si desidera supportare il rebinding della chiave o più schemi di controllo, tale logica andrebbe in keyPoll() . Quindi il ciclo principale fornisce questi comandi a qualsiasi entità il giocatore stia attualmente controllando, presumibilmente mario . Dissociando la gestione degli input dall'entità di gioco specifica, è facile aggiungere nuove abilità a mario o supportare il rebinding delle chiavi o consentire il passaggio da più personaggi o aggiungere personaggi AI / demo e altre cose interessanti senza doversi preoccupare di entrambi interni di keyPoll() e interni di mario allo stesso tempo.

    
risposta data 23.07.2015 - 23:08
fonte

Leggi altre domande sui tag