Realizzare muri nei giochi basati su tessere: cosa mi sto perdendo?


25

Dopo aver trascorso del tempo oggi a scrivere alcune note relative all'implementazione dei muri nel mio gioco basato su piastrelle, improvvisamente mi sono reso conto che non sarebbe stato così semplice come immaginavo prima. Mentre l'attuale fase del mio lavoro non è nemmeno vicina alla realizzazione del codice relativo al muro, ho escogitato tre modi diversi per farlo. In questo momento non sono sicuro di quale delle mie idee funzionerà meglio e se ho perso qualcosa o no.

Importante: un personaggio PUO ' stare su una tessera che ha muri, indipendentemente dalla loro forma.

La cosa comune per tutte e tre le varianti: il tilemap verrà "mantenuto" in un contenitore basato su std :: vector (o simile) a dimensione singola. Le ragioni di ciò sono (sorprendentemente) spiegate nelle risposte a una domanda diversa.

Classi contenitore in giochi basati su tessere.

Di nuovo ai muri.

A) L'approccio semplice.

Niente di speciale qui. Ogni contenitore di tessere può contenere non solo personaggi, ma uno o più oggetti Muro, che sono attaccati al bordo all'interno della tessera.

Primo approccio

Pro: facile da implementare, niente da cambiare nel motore. Contro: due cose. Uno: potrebbe essere solo nella mia testa, ma alcune combinazioni sembrano solo brutte. Secondo: questo approccio consente di realizzare una doppia parete da due tessere adiacenti. La costruzione sarà una parte importante del gioco e le doppie pareti consentiranno ai costruttori di rinunciare eventualmente all'aggiornamento del materiale delle pareti attraverso i mezzi di gioco e raggiungere una maggiore durata con il raddoppio della parete esistente. Non è desiderabile. Certo, potrei includere una procedura che proibisce il doppio muro, ma avrà una brutta sensazione.

B) L'approccio intelligente (?).

Invece di lasciare ai giocatori una doppia parete dell'intera mappa, li batterò su di essa. Ogni muro ha due metà che sono attaccate al bordo della piastrella dall'interno. Quindi, per creare un singolo "Wall unit" dovrò creare due oggetti Half-Wall in due tessere adiacenti.

Secondo approccio

Pro: è simmetrico !!! Inoltre, non è necessario alcun cambiamento significativo delle attuali specifiche del motore. Contro: più problemi, più oggetti e, naturalmente, i "tappi". Come puoi vedere nella figura, un angolo pianterà fondamentalmente per un oggetto "cap". In realtà sono fico, non è così difficile da aggiungere. Ehi, ho già un piano per colonne sottili composte da quattro tappi collegati. Dolce. Tuttavia, ho alcune preoccupazioni per quanto riguarda i possibili problemi relativi al campo visivo e alla linea di vista.

C) La variante di revisione totale.

Oppure, potrei semplicemente creare bordi e angoli come contenitori separati per gli oggetti di gioco. Proprio così.

Terzo approccio

Pro: Neppure sicuro. Bene, è semplice. Decisamente. Contro: richiederà una revisione. Non di codice, per fortuna, ma dell'attuale mentalità della meccanica di gioco - questo è certo. I benefici non sono così evidenti. Inoltre, questo approccio richiede molti più contenitori rispetto ai due precedenti. Anche la matematica di indicizzazione sarà un po 'dolorosa.

Quindi qui ce l'abbiamo - tre modi distinti di fare muri tra le piastrelle. Se ci sono alternative là fuori, sarò felice di darle un'occhiata. Se ci sono vantaggi / svantaggi in uno qualsiasi degli approcci che non ho visto, ti preghiamo di segnalarli.


2
A.2: Come A, solo che solo due lati - ad esempio, Nord e Ovest - possono avere un muro. Questo è l'approccio utilizzato da X-Com.
Martin Sojka,

@Martin Sojka che lascia un buco agli angoli sud-est. Tuttavia, può essere utile considerare il modello C in questo modo, ogni piastrella può avere una combinazione di tre diversi elementi di muro, noth, angolo ovest e nord-ovest.
aaaaaaaaaaaa,

Quindi i muri sono visibili, lo prendo? Non solo il blocco dei bordi delle piastrelle. Perché hai bisogno di due metà nell'opzione B? Perché non un solo muro, mezzo offset sull'altra piastrella?
Richard Marskell - Drackir,

@eBusiness, se permetti solo i muri a nord e ovest, puoi simulare i muri a sud e est semplicemente posizionando i muri a nord e ovest delle piastrelle sotto di loro.
Tetrad,

Suggerirei di andare con C. È quello che sto facendo in questo jemgine.omnisu.com/wp-content/uploads/2011/06/gnomecolony.png e funziona abbastanza bene. L'unico problema è il bordo sud / est della mappa. Dovrai fare qualcosa al riguardo.
Blecki,

Risposte:


14

Userei il tuo metodo "B".

Per evitare la necessità di "tappi", basta estendere ogni parete "1/2 spessore" in entrambe le direzioni. Questo creerà muri sovrapposti dove si incontrano, ma i tuoi diagrammi suggeriscono già che questo non è un problema.

Quindi, nel Metodo 'B', Figura 3, la parete orizzontale si estenderebbe leggermente a sinistra e la parete verticale si estenderebbe leggermente.

[Sono nuovo qui, appena registrato. Mi sto perdendo qualcosa, poiché non riesco a vedere il pulsante "Aggiungi commento" al tuo post originale. È un privilegio delle persone con una reputazione più alta? O sto trascurando l'ovvio? Ci scusiamo per averlo aggiunto come 'risposta'.]


1
Questa è una risposta e credo che sia un livello di reputazione 100 (?) Da commentare. Benvenuto in Gamedev SE! :)
L'anatra comunista il

2

Hai notato che un personaggio può stare su una tessera contenente un muro ma hai considerato di trattare ogni tessera come muro stesso? Anche mezza piastrella come un muro in modo orizzontale o verticale?

Pro: calcoli e posizionamenti sono banali, la collisione è banale in cui tutti i calcoli e le collisioni si basano solo sulle coordinate del posizionamento delle pareti.

Contro: potrebbe influire sull'intera implementazione, codice e grafica. Non vuoi nemmeno abbandonare totalmente il tuo metodo, vuoi comunque casi speciali in cui solo una parte di una tessera è muro (Link to the Past with cliffs).

In questo modo avrei basato la mia implementazione, andando avanti, sapendo che posso sempre fare riferimento a una tessera ed eseguire un calcolo su di essa a seconda della posizione dei miei personaggi e del tipo di tessera.

Un muro del castello ho potuto semplicemente eseguire un calcolo dal centro disegnando una scatola che non potevo attraversare o se è una roccia rotonda potrei fare lo stesso calcolo dal centro ma come un cerchio in modo che il mio personaggio possa muoversi come fosse arrotondato.


1

Mi dispiace dirlo, ma il terzo modo è davvero il modo di pensare, beh, hai già la possibilità di farlo, quindi andiamo avanti e pensiamo agli altri due!

Il fatto è che un muro ha una larghezza zero, due dimensioni tridimensionali (altezza * lunghezza, in un mondo 3D) che divide due scatole. Dovresti considerarli come tali ma potresti usare una soluzione più semplice come quando costruire il tuo dungeon (specialmente se altre persone potrebbero costruire parti).

Sembra che sia un gioco 2D top-down in cui i muri hanno "una larghezza", quindi hanno bisogno di quell'angolo (il tuo oggetto "berretto"). Questa è esclusivamente "grafica", quindi preferirei una sorta di:

Una mappa 2D con le tessere (es. Tipo di tessera e simili).

Una mappa 2D con 2 pareti, es. in basso e a destra (la parete sinistra sarà la 'parete destra' nella piastrella a sinistra da questa).

+ una logica che disegna tutte le pareti e 'tappi' ecc.

Separando così logica e grafica. Puoi fare una "interfaccia" occupandoti di cose come SetWall (ThisTile, LEFT, NOWALL) -> impostando la parete destra della piastrella a sinistra di ThisTile su "NOWALL" ...

Forse questo sembra sfocato ma il fatto è che dovresti sempre cercare di avere da un lato la logica (i dati effettivi, senza ridondanza) e dall'altro il "disegno dei dati" che calcola se è necessario un "limite" ' eccetera.

++

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.