Creazione di gestori di input associabili in C ++ che si estendono su due moduli separati

2

Ho un'applicazione wxWidgets. Questo è il primo, modulo principale. Il secondo modulo è un motore openGL. È una struttura modello-view (controller), in cui l'applicazione è la vista (e il controller), mentre il motore è il modello.

.

Questo è il problema che devo risolvere:

Ho bisogno di prendere input dall'applicazione e fare in modo che il motore si cambi in base a quei dati (spostare la fotocamera, evidenziare la selezione, sostituire una mesh / trama con un'altra, ecc.)

Il vincolo è che il sistema non può avere i binding di tasti hardcoded , devono essere modificabili dall'utente senza dover riavviare l'applicazione.

.

Questo è quello che ho scoperto finora:

L'applicazione avrà una classe InputHandler. Questa classe conterrà una mappa che ha keycode come chiave e una struct che conterrà un puntatore a funzione e un elenco di puntatori ai suoi argomenti come valore. Avrà anche un unico metodo che utilizzerà tali dati per costruire una chiamata al metodo completo quando viene ricevuto un codice di accesso.

Questo design consente di modificare dinamicamente i binding dei tasti e rimuoverà la necessità di enormi alberi if..else o di gigantesche istruzioni switch..case.

Ma ora abbiamo un problema nel motore. Tutti questi metodi sono l'interfaccia tra il motore e l'applicazione. Ciò significa che la maggior parte di loro invocerebbe alcuni metodi interni per eseguire il lavoro effettivo (un metodo moveCamera accederà semplicemente alla classe della telecamera interna e invocherà il comando translate con lo stesso argomento che è stato fornito). Se non lo faccio in questo modo, l'applicazione ha più accesso al motore di quanto dovrebbe.

Questo progetto ha due livelli di astrazione, il primo quando si riceve un codice chiave e lo si usa per formare e chiamare un metodo e il secondo dove il metodo chiamato sarebbe in realtà solo un'interfaccia per l'applicazione che chiamerebbe altri metodi che fai il vero lavoro.

A questo punto, vorrei sottolineare che ho passato diverse ore a riscrivere questa domanda e modificare il design, notando nuovi difetti mentre stavo cercando di spiegarlo. Questo è il meglio che ho potuto inventare. Infine, le mie domande sono:

.

Questo è un buon modo per ottenere ciò che ho scritto in grassetto sopra? Quali difetti vedi nel design? C'è un modo per risolverli? Un altro disegno sarebbe forse più adatto per il compito? Come affronteresti questo problema?

    
posta Karlovsky120 05.07.2018 - 01:36
fonte

0 risposte

Leggi altre domande sui tag