In un gioco basato su tessere 2D, qual è un buon metodo per lo scorrimento?


9

Sto usando Direct3D con il wrapper D3DXSPRITE per disegnare le piastrelle sullo schermo. Ho una classe di tessere che contiene membri come collisione e tipo di tessera, quindi ho una serie di tessere ad es

Griglia per piastrelle [256] [256];

Quale sarebbe un metodo migliore?

-Disegna il giocatore al centro dello schermo e sfalsa dove viene disegnata la mappa.

-Spostare il lettore con la videocamera seguente.

Stavo usando il primo metodo, ma è diventato davvero complicato quando arrivi sul bordo superiore sinistro della mappa e quando altri giocatori / nemici sono sulla mappa e si muovono allo stesso tempo

se faccio in modo che la telecamera segua il lettore, dovrei chiamare spriteBatch-> Draw (...) per ogni singola griglia, anche se solo pochi possono adattarsi allo schermo?

Risposte:


4

Probabilmente è meglio fare tutti gli aggiornamenti e i calcoli in "reali", unità mondiali e spostare la telecamera. Il tuo spriteBatch può eseguire l'abbattimento stesso, ma se è troppo lento puoi provare a determinare quali tessere devono essere visualizzate sullo schermo e disegnarle solo.


Probabilmente vorrai scrivere codice per disegnare solo gli sprite che sono visibili, soprattutto se scopri che devi aumentare le dimensioni della tua griglia.

2

Spostare la telecamera nelle coordinate del mondo e far muovere il tuo personaggio in tutto il mondo è il modo più semplice per affrontare questo problema, lavorare con le coordinate del mondo significa che non devi fare calcoli extra quando si riduce a tutti gli altri sistemi che devono funzionare su un sistema di coordinate relative e capire anche dove si trovano nelle coordinate mondiali.

Dato che stai lavorando in 2D un altro buon consiglio è quello di fare un partizionamento spaziale il modo più semplice sarebbe quello di creare un sistema di griglia del mondo virtuale, questo ti permetterà di gestire ogni riquadro singolarmente associando gli sprite e altre risorse su una base per riquadro, quindi in sostanza il processo sarebbe:

  • creare una classe di tessere che può contenere le coordinate al contorno per la tessera e qualsiasi risorsa di cui la tessera specifica potrebbe aver bisogno (folletti, nemici, ecc.).

  • decidi la dimensione del tuo mondo e crea un array 2D (puoi usare una dimensione e accedervi come 2D) di piastrelle ognuna che rappresenta un po 'del tuo mondo con tutte le sue risorse associate.

  • attingere risorse solo dalla tessera in cui si trova il giocatore e dai suoi vicini.

Con una griglia puoi facilmente scoprire in quale tessera si trova il giocatore in base alla sua posizione rispetto all'inizio della griglia.

Per ovviare al problema che hai citato in merito alla videocamera, devi rendere il lettore e la videocamera due sistemi indipendenti in cui la videocamera non viaggerà oltre il centro delle tessere di bordo, quindi quando il giocatore si sposta su quella tessera può comunque viaggiare attraverso intera tessera poiché è vincolata da coordinate mondiali (ovvero non più centrata sullo schermo) ma la videocamera è bloccata.


0

Uso una superficie. Creo il mondo intero su una superficie fuori schermo e mantengo una coordinata xey. Li altero mentre il giocatore si muove e ogni fotogramma disegna un rettangolo 1028 x 768 dalla superficie al backbuffer usando xey.

per quanto riguarda le altre persone, do loro una xey e le lascio muovere per il mondo a loro piacimento, quando disegno controllo se ci sono xe y nel rettangolo 1028 x 768 e, in tal caso, le disegno (uso trame per le persone) .

Ho il giocatore al centro dello schermo e controllo se il limite del mondo ha raggiunto il limite dello schermo. In questa circostanza il giocatore si sposta sullo schermo verso il bordo del mondo e torna al centro, quindi il mondo ricomincia a muoversi. sembra difficile e mi ci è voluto un po ', ma non è poi così male.

Uso tessere 64 x 64 e il mondo più grande che ho usato finora è di 50 x 60 tessere.

Tutto questo è fatto in x diretto con c ++


1
Sembra un ENORME porco di memoria. Mantenere il mondo intero disegnato in una superficie fuori dallo schermo ti farà incorrere in problemi di memoria una volta che inizi a voler fare cose come avere più livelli (animati) per il tuo mondo e espanderlo oltre ciò che hai ora. Sarebbe molto meglio conservare le informazioni sul mondo e disegnare solo le parti / gli oggetti che devono essere disegnati quando devono essere disegnati. Solo i miei 2 centesimi. :)
Richard Marskell - Drackir,

@Drackir Penso che tu fraintenda. solo il mondo è disegnato fuori dallo schermo, cose come le altre persone sono tracciate e disegnate sul buffer backer quando sono necessarie. inoltre non mi vedo fare più di quel mondo 70 x 70. quando dico mondo intendo area, questa potrebbe essere una città un sotterraneo o l'interno di una casa, quando il giocatore si muove tra di loro viene ricostruita la superficie fuori dallo schermo. sì, ci vuole memoria, ma le tessere 2D sulle moderne unità di terrabite lo rendono trascurabile e pochi secondi di caricamento è un piccolo prezzo da pagare per lo scorrimento e l'animazione fluidi. ma sì, ci sono modi migliori e più difficili :)
Skeith,

La superficie deve essere archiviata nella memoria della scheda GFX, non sul disco rigido. Tuttavia, credo che se la memoria della scheda GFX è troppo grande, sposterà le superfici sull'HD che rallenterebbe notevolmente le cose. Certo, è da un po 'che non mi occupo di quelle cose, quindi non ricordo esattamente come ha funzionato, ma immagino che se non disegnerai un mondo troppo grande sarebbe ok. :)
Richard Marskell - Drackir,

@Drackir È interessante da sapere, non ci avevo mai pensato in quel modo. Ho scoperto che in questo modo mi dà una pergamena più liscia che se disegnassi dinamicamente nuove tessere, quindi penso che vada bene, ma dovrò esaminarlo.
Skeith,

Stavo lavorando a un gioco in cui avevo le mappe 31x31 ma erano attaccate fianco a fianco. Stavo provando a lavorare dal motore di qualcun altro e loro avrebbero disegnato tutte le mappe che circondavano quella su cui era il giocatore; quindi nove mappe in totale. Ogni mappa aveva diversi (credo 6) livelli. Quindi, come 31x31x9x6 = 51894 tessere disegnate (massimo ovviamente; non tutte le tessere erano piene) ogni volta che l'utente cambia mappa. È stato un grande rallentamento per me, quindi ho riscritto la routine di disegno per disegnare solo le tessere che circondano il giocatore fino a 1 tessera oltre il bordo dello schermo (per gestire tessere parziali mentre si muovono).
Richard Marskell - Drackir,

0

È abbastanza normale che il codice provi un po 'di dolore negli angoli di un mondo piastrellato, quando si determina quali livelli disegnare e contemporaneamente si assicura che la videocamera non vada fuori dal mondo. Questi casi limite sono fondamentalmente la cosa più convincente dell'implementazione di un mondo basato su piastrelle 2D che è più grande della risoluzione dello schermo. Diventa molto più complesso se si supporta lo zoom avanti e lo zoom su cursore: D

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.