Domanda

Ho voluto "emulare" un popolare gioco in flash, Chrontron, in C++ e bisogno di qualche aiuto per iniziare.(NOTA:Non per il rilascio, solo pratica per me)

Basics:
Player has a time machine. On each iteration of using the time machine, a parallel state
is created, co-existing with a previous state. One of the states must complete all the
objectives of the level before ending the stage. In addition, all the stages must be able
to end the stage normally, without causing a state paradox (wherein they should have
been able to finish the stage normally but, due to the interactions of another state,
were not).

Quindi, che tipo di spiega come funziona il gioco.Si dovrebbe giocare un po ' per davvero capire quale sia il mio problema.

Sto pensando un buon modo per risolvere questo sarebbe usare liste collegate al negozio ogni stato, che sarà probabilmente essere una mappa hash, in base al tempo, o una lista collegata che si ripeta in base al tempo.Io sono ancora incerti.

DOMANDA:

Ora che ho un po ' ruvido specifiche, ho bisogno di un po di aiuto per decidere su quali strutture dati da utilizzare per questo, e perché.Inoltre, voglio sapere cosa API Grafiche/Strato dovrei utilizzare per fare questo:SDL, OpenGL o DirectX (la mia scelta attuale è SDL).E come posso fare per realizzare il parallelo stati?Con fili paralleli?

EDIT (Per chiarire di più):
OS -- Windows (dato che questo è un hobby, può fare questo in Linux più tardi)
Grafica 2D -- Lingua -- C++ (deve essere C++ -- questa è la prassi per un corso del prossimo semestre)

Q-Senza Risposta:SDL :OpenGL :Direct X
Q-Hanno Risposto:Evitare Di Elaborazione Parallela
Q-Hanno Risposto:Utilizzare STL per implementare passo temporale azioni.

So far from what people have said, I should:
1. Use STL to store actions.
2. Iterate through actions based on time-step.
3. Forget parallel processing -- period. (But I'd still like some pointers as to how it
could be used and in what cases it should be used, since this is for practice).

Si allegano alla domanda, sono stato per lo più utilizzato C#, PHP, Java, quindi non vorrei descrivere me stesso come un hotshot programmatore.Cosa C++ specifiche conoscenze e contribuire a rendere questo progetto più facile per me?(ie.I vettori?)

È stato utile?

Soluzione

Che cosa si dovrebbe fare, prima di leggere e comprendere il "tempo fisso-step" ciclo di gioco (Qui c'è una buona spiegazione: http://www.gaffer.org/game-physics/fix-your-timestep).

Quindi quello che devi fare è tenere un elenco di coppie di contatore di frame e di azione.STL esempio:

std::list<std::list<std::pair<unsigned long, Action> > > state;

O forse un vettore di liste di coppie.Per creare lo stato, per ogni azione (interazione del giocatore) si memorizza il numero di telaio e l'azione che viene eseguita, probabilmente si potrebbe ottenere i migliori risultati se l'azione era la "chiave <X> premuto" o "chiave <X> rilasciato":

state.back().push_back(std::make_pair(currentFrame, VK_LEFT | KEY_PRESSED));

Per riprodurre i precedente stati, è necessario reimpostare il contatore di frame ogni volta che il giocatore attiva la macchina del tempo e quindi scorrere la lista di stato per ogni stato precedente e vedere se corrisponde il fotogramma corrente.Se c'è, eseguire l'azione dello stato.Per ottimizzare la si potrebbe tenere un elenco di iteratori per cui si sono in ogni stato precedente elenco.Ecco alcuni pseudo-codice per che:

typedef std::list<std::pair<unsigned long, Action> > StateList;
std::list<StateList::iterator> stateIteratorList;
//
foreach(it in stateIteratorList)
{
  if(it->first == currentFrame)
  {
    performAction(it->second);
    ++it;
  }
}

Spero di aver reso l'idea...

Thread separati semplicemente complicare la questione notevolmente, in questo modo si ottiene lo stesso risultato ogni volta che è in grado di garantire, utilizzando diversi thread (non si può veramente vedere come sarà implementato) o un non-tempo fisso-step ciclo di gioco.

Quando si tratta di grafica API, mi piacerebbe andare con SDL come è probabilmente la cosa più semplice per iniziare.Puoi sempre utilizzare OpenGL da SDL in seguito, se si vuole andare in 3D.

Altri suggerimenti

Questo suona molto simile a Treccia.Davvero non vuoi elaborazione parallela per questo - programmazione parallela è difficile, e per qualcosa di simile a questo, le prestazioni non dovrebbero essere un problema.

Da quando il gioco è stato vector crescerà molto velocemente (probabilmente dell'ordine di alcuni kilobyte al secondo, a seconda del frame rate e la quantità di dati da memorizzare), non vuoi una lista collegata, che ha un sacco di overhead in termini di spazio, e possono introdurre grandi prestazioni sanzioni per cache miss, se si è disposti male).Per ogni parallelo timeline, si desidera un vettore di strutture dati.È possibile memorizzare ogni parallelo timeline in una lista collegata.Ogni linea temporale sa a che ora è cominciato.

Per eseguire il gioco, scorrere tutti attivi i limiti temporali e di eseguire una cornice vale la pena di azioni da ciascuno di essi di pari passo.Non necessario per l'elaborazione parallela.

Ho giocato a questo gioco prima.Non credo che l'elaborazione parallela è la strada da percorrere.Avete condiviso gli oggetti del gioco (leve, finestre, ascensori, ecc) che dovranno essere condivisi tra i processi, possibilmente con ogni delta, riducendo così l'efficacia del parallelismo.

Personalmente vorrei solo tenere un elenco di azioni, quindi per ogni successiva iterazione avviare l'interleaving insieme.Per esempio, se l'elenco è nel formato di <[iterazione.azione]> quindi il 3 ° tempo al vorresti eseguire azioni 1.1, 2.1, 3.1, 1.2, 2.2, 3.3, ecc.

Dopo una breve tacendo la descrizione, penso che tu abbia l'idea giusta, vorrei avere un oggetto che contiene i dati relativi allo stato, e posto in una lista collegata...non credo che avete bisogno di fili paralleli...

per quanto riguarda il graphics API, l'ho usato solo opengl, e posso dire che è molto potente e ha una buona C / C++ API opengl sarebbe anche più cross-platform come è possibile utilizzare la messa libreria su *Nix computer.

Un gioco molto interessante idea.Penso che hai ragione a dire che parrellel computing potrebbero essere benefiche per questo progetto, ma non più di altre risorse per il programma.

La questione è un po ' accostamento ambiguo.Vedo che si sta andando a scrivere in C++, ma che sistema operativo codifica per?Avete intenzione è cross platform e che tipo di grafica vuoi, ie 3D, 2D, di fascia alta, basato sul web.

Quindi, in pratica abbiamo bisogno di un sacco di informazioni in più.

L'elaborazione parallela non è la risposta.Si dovrebbe semplicemente "registrare" le azioni del giocatore per poi riprodurli per le "azioni"

Così si crea un vettore (lista concatenata) di vettori che detiene le azioni.Semplicemente memorizzare il numero di telaio che l'azione è stata presa (o delta) e completare l'azione sul "dummy " bot" che rappresenta il giocatore durante quella particolare istanza.Semplicemente loop attraverso gli stati e i trigger, uno dopo l'altro.

Si ottiene un effetto collaterale di facilmente "rompere" il gioco quando uno stato paradosso accade semplicemente perché l'azione successiva non riesce.

A meno che non siete disperati per utilizzare C++ per la propria formazione, si dovrebbe sicuramente guardare XNA per il tuo gioco e grafica quadro (utilizza C#).E ' completamente gratuito, si fa un sacco di cose per voi, e presto sarete in grado di vendere il tuo gioco su Xbox Live.

Per rispondere alla tua domanda principale, nulla che si può già fare in Flash sarebbe mai bisogno di utilizzare più di un thread.Basta memorizzare un elenco di posizioni in un array e il ciclo con un offset diverso per ogni robot.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top