2012-02-02 8 views
7

Inizierò a programmare un gioco 2D basato su tile in Qt e leggerò le classi QGraphicsScene e QGraphicsView che sono destinate alla visualizzazione e alla gestione di molti 2D oggetti.Iniziare con un gioco basato su tile in Qt utilizzando QGraphicsScene e QGraphicsView

La mia domanda è che sarà possibile creare un mondo con molte tessere usando QGraphicsScene? Posso aggiungere il mondo intero allo stesso tempo tile-by-tile o dovrei provare a implementare qualcosa per limitare un po 'l'area? Ho letto che QGraphicsScene è in grado di gestire "migliaia di elementi", ma una mappa di tessere 2D può facilmente diventare veramente, davvero grande (200 x 200 tessere? Non così tante, ma sono già 40.000 oggetti che è molto).

La mappa è anche andando a essere più o meno statico quindi potrebbe essere possibile disegnare come una grande mappa di pixel, ma questo in realtà impedisce di utilizzare tutte le cose di fantasia in QGraphicsScene come gestire clic del mouse sulle voci indipendenti ecc On top di quello ho intenzione di disegnare il giocatore, gli NPC e così via che non saranno allineati alla griglia delle tessere. Ci sono alcuni elementi di ottimizzazione per l'utilizzo di molti oggetti statici e alcuni dinamici su di essi?

Utilizzare QGraphicsScene e QGraphicsView è una buona idea o dovrei provare a cercare un'alternativa all'interno di Qt o forse una libreria diversa, più orientata al gioco?

Grazie in anticipo

+0

Con i recenti versioni di Qt, è possibile aumentare le prestazioni in modo significativo specificando OpenGL come renderer invece del renderer software di default: 'UI-> graphicsView -> setViewport (nuovo QOpenGLWidget); ' – vsz

risposta

8

È necessario utilizzare QGraphicsView.

Il 40,000 Chips int la documentazione Qt è il tuo miglior esempio da esaminare da vicino. Si occupa della complessità di un gran numero di elementi, disegnandoli su più scale e molto di più.

Gioca con l'esempio e vedrai che tutti i chip in realtà compongono una foto grande se rimpicciolisci e che puoi selezionare e trascinare e rilasciare più chip in qualsiasi vista, oppure puoi ingrandire abbastanza per vedere un po 'di testo su un singolo chip. Ci vorrà del tempo per capire ogni parte, ma questo è un esempio molto approfondito da esaminare.

Nell'origine chips.cpp, viene mostrato come può essere eseguito rapidamente utilizzando un "LevelOfDetail" o un'istruzione di commutazione variabile basata sulla trasformazione memorizzata in un'opzione di stile.

Qt Graphics View è stato ottimizzato per fare molte delle cose di cui hai parlato nella tua domanda, ma ci vuole un po 'per capire come affrontarlo.

Se si riscontrano ancora problemi con la dimensione della mappa che si desidera utilizzare, memorizzerei i layout di tile sull'unità disco rigido e caricherò quelli necessari quando necessario, e rimuoverli da quelli non necessari della scena, se necessario.

+0

I collegamenti sono morti. – mrgloom

+0

Collegamenti fissi. Godere. – phyatt

1

QGraphicsScene ha la capacità di dipingere solo ciò che viene rappresentato nella vista, tutto il resto si trova proprio di l'indice della scena. Hai diverse opzioni per configurare come funzionano la scena e la vista per ottimizzare il tuo uso specifico. Solo perché hai 40k tessere nel tuo indice scena, non significa che devi dipingerne così tante. Ne hai davvero tanti quanti ne vengono visualizzati nella risoluzione della tua vista.

Inoltre, ci sono opzioni di memorizzazione nella cache se i tuoi articoli sono statici, quindi devono essere calcolati solo una volta e possono essere recuperati da una cache pixmap.

In definitiva penso che valga completamente il vostro tempo per provarlo. Dovrebbe essere abbastanza facile per te prendere in giro un test in cui popola la scena con un numero molto elevato di tessere e semplicemente prova a scorrere intorno alla vista. Sento che non è tanto una preoccupazione per quante piastrelle hai, ma piuttosto quanto sia complessa la grafica all'interno della vista reale che viene dipinta.

+0

Grazie per l'ottima risposta! Ho intenzione di provarlo. Come hai detto, anche se non funziona, non è come se avessi perso un'enorme quantità di tempo per farlo. – Maush

2

Sto lavorando a un progetto simile e sto utilizzando una griglia 30x30 di persistenti QGraphicsPixmapItems. Quando la vista della mappa cambia, il QGraphicsscene esegue l'iterazione sulla parte dell'array di mappe attualmente visualizzato, chiamando setPixmap su ogni riquadro per cambiarlo nel nuovo tipo di riquadro. Sta funzionando abbastanza bene e non ho alcun reclamo di prestazioni fino ad ora.

2

Sono d'accordo con quanto è stato detto. Sto facendo da QGraphicsView-based games per anni (se sei su Linux, chiedi al tuo gestore di pacchetti per KDiamond o Palapeli se vuoi), e mentre il rendering delle prestazioni è stato un problema quando QGraphicsView è uscito per la prima volta anni fa, questi problemi ora sono generalmente risolto.

Ciò che dovresti preoccupare è il consumo di memoria. L'esempio dei chip può avere tanti chip quanti ne vuoi avere, ma quei chip non sono tenuti in memoria come pixmap. Se ogni piastrella è un'immagine di dimensioni fisse 50x50px, che è già

32bits*50px*50px*200*200 = 381,9 MiB 
+0

Grazie mille, Palapeli è molto gentile. Ora, devo ancora provare KDiamond ... – CapelliC