Frage

Ich wollte ein beliebtes Flash-Spiel, Chrontron, in C++ „emulieren“ und brauchte Hilfe beim Einstieg.(NOTIZ:Nicht zur Veröffentlichung, nur zum Üben für mich selbst)

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).

Das erklärt also in gewisser Weise, wie das Spiel funktioniert.Sie sollten es ein bisschen spielen, um wirklich zu verstehen, was mein Problem ist.

Ich denke, eine gute Möglichkeit, dies zu lösen, wäre, verknüpfte Listen zu verwenden, um jeden Status zu speichern. Dies wird wahrscheinlich entweder eine Hash -Karte sein, basierend auf der Zeit oder einer verknüpften Liste, die auf der Zeit iteriert.Ich bin immer noch unsicher.

TATSÄCHLICHE FRAGE:

Nachdem ich nun einige grobe Spezifikationen habe, benötige ich Hilfe bei der Entscheidung, welche Datenstrukturen ich dafür verwenden soll und warum.Außerdem möchte ich wissen, welche Grafik-API/-Ebene ich dafür verwenden sollte:SDL, OpenGL oder DirectX (meine aktuelle Wahl ist SDL).Und wie würde ich bei der Implementierung paralleler Zustände vorgehen?Mit parallelen Threads?

BEARBEITEN (Um mehr zu klären):
Betriebssystem – Windows (da es sich um ein Hobbyprojekt handelt, kann dies später unter Linux durchgeführt werden)
Grafik - 2D -Sprache - C ++ (Muss C ++ - Dies ist Übung für einen Kurs im nächsten Semester)

F-unbeantwortet:SDL:OpenGL:Direktes X
Q-Antwort:Vermeiden Sie Parallelverarbeitung
Q-Antwort:Verwenden Sie STL, um Zeitschrittaktionen zu implementieren.

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).

Im Anhang zur Frage habe ich bisher hauptsächlich C#, PHP und Java verwendet, sodass ich mich nicht als Spitzenprogrammierer bezeichnen würde.Welche C++-spezifischen Kenntnisse würden mir dieses Projekt erleichtern?(d. h.Vektoren?)

War es hilfreich?

Lösung

Was Sie tun sollten, ist zunächst die „feste Zeitschritt“ Spielschleife (Hier ist eine gute Erklärung zu lesen und zu verstehen: http://www.gaffer.org/game-physics/fix-your-timestep ).

Dann, was Sie tun, ist eine Liste der Liste von Paaren von Rahmenzählern und Aktion zu halten. STL-Beispiel:

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

Oder vielleicht ein Vektor von Listen von Paaren. Um den Status zu erstellen, für jede Aktion (Spieler-Interaktion) speichern Sie die Rahmennummer und welche Aktion ausgeführt wird, wahrscheinlich, um die besten Ergebnisse erzielen würde, wenn Aktion einfach ist „Taste gedrückt“ oder „Taste freigegeben „:

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

Um die vorherigen Zustände wiedergeben, dann würden Sie den Rahmenzähler jedes Mal, wenn der Spieler aktiviert die Zeitmaschine zurücksetzen und dann für jeden vorherigen Zustand durch die Zustandsliste durchlaufen und sehen, ob irgendwelche Übereinstimmungen der aktuelle Frame. Wenn ja, führen Sie die Aktion für diesen Zustand. Zur Optimierung können Sie eine Liste von Iteratoren zu halten, wo Sie in jeder vorherigen Zustand-Liste enthalten sind. Hier einige Pseudo-Code für das:

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;
  }
}

Ich hoffe, Sie bekommen die Idee ...

separate Threads würden einfach die Sache erheblich erschweren, auf diese Weise Sie das gleiche Ergebnis jedes Mal erhalten, die Sie nicht durch die Verwendung separate Threads garantieren können (kann nicht wirklich sehen, wie das wäre implementiert werden) oder einen nicht-festen Zeitschritt Spielschleife.

Wenn es um die Grafik-API kommt, würde ich mit SDL gehen, wie es ist wahrscheinlich die einfachste Sache, die Sie zu erhalten begonnen. Sie können später jederzeit auf OpenGL von SDL verwenden, wenn Sie 3D gehen wollen.

Andere Tipps

Das hört sich sehr ähnlich an Flechten.Sie wollen dafür wirklich keine parallele Verarbeitung – parallele Programmierung schon hart, und für so etwas sollte die Leistung kein Problem sein.

Da der Spielzustandsvektor sehr schnell anwächst (wahrscheinlich in der Größenordnung von mehreren Kilobyte pro Sekunde, abhängig von der Bildrate und der Menge der gespeicherten Daten), möchten Sie keine verknüpfte Liste, die einen großen Overhead mit sich bringt Speicherplatz (und kann aufgrund von Cache-Fehlern zu erheblichen Leistungseinbußen führen, wenn es schlecht angeordnet ist).Für jede parallele Zeitachse benötigen Sie eine Vektordatenstruktur.Sie können jede parallele Zeitleiste in einer verknüpften Liste speichern.Jede Zeitleiste weiß, zu welcher Zeit sie begann.

Um das Spiel auszuführen, durchlaufen Sie alle aktiven Zeitleisten und führen von jeder Zeitleiste im Gleichschritt Aktionen im Wert von einem Frame aus.Keine Parallelverarbeitung erforderlich.

Ich habe dieses Spiel vor gespielt. Ich glaube nicht notwendigerweise parallele Verarbeitung ist der Weg zu gehen. Sie haben Objekte im Spiel geteilt (Hebel, Kisten, Aufzüge, usw.), die mit jedem Delta zwischen Prozessen geteilt, möglicherweise werden müssen, wodurch die Wirksamkeit der Parallelität zu reduzieren.

Ich persönlich würde nur halten eine Liste der Aktionen, dann für jede nachfolgende Iteration beginnen sie zusammen Verschachtelung. Wenn zum Beispiel der Liste ist im Format <[iteration.action]> dann das dritte Mal durch würde ausführen Aktionen 1.1, 2.1, 3.1, 1.2, 2.2, 3.3, etc.

Nach einer kurzen Beschreibung zu beschönigen, ich glaube, Sie die richtige Idee haben, würde ich einen Zustand Objekt, das die Zustandsdaten hält, und legen Sie diese in einer verknüpften Liste ... Ich glaube nicht, Sie parallele Threads benötigen. ..

so weit wie die Grafik-API, habe ich nur opengl verwendet, und kann sagen, dass es ziemlich stark ist und habe einen guten C / C ++ API, opengl würde auch mehr Cross-Plattform sein, wie Sie die messa Bibliothek auf * Nichts verwenden können Computers.

Eine sehr interessante Spielidee. Ich glaube, Sie haben Recht, dass parrellel Computing diesen Entwurf hilfreich sein würde, aber nicht mehr als jedes anderes hohe Ressourcen Programm.

Die Frage ist ein wenig zweideutig. Ich sehe, dass Sie dies in C zu schreiben, gehen ++ aber was für OS codieren Sie es? ist Cross-Plattform Sind Sie auf sie beabsichtigen, und welche Art von Grafiken Sie möchten, dh 3D, 2D, High-End, webbasiert.

Also im Grunde brauchen wir viel mehr Informationen.

Die Parallelverarbeitung ist nicht die Antwort. Sie sollten „record“ die Spieler Aktionen sie dann einfach für die „vorherigen Aktionen“ abspielen

So können Sie einen Vektor erstellen (einzeln verknüpfte Liste) von Vektoren, die die Aktionen halten. Einfach zu speichern, die Rahmennummer, die die Aktion (oder Delta) und abschließen, die Einwirkung auf dem „dummy bietet“ genommen wurde, die die Spieler in diesem speziellen Fall darstellen. Sie einfach eine Schleife durch die Staaten und sie eine nach der anderen auslösen.

Sie erhalten einen Nebeneffekt leicht „Brechen“ das Spiel, wenn ein Staat Paradox einfach geschieht, weil die nächste Aktion fehlschlägt.

Wenn Sie verzweifelt sind C ++ für die eigene Bildung zu verwenden, sollten Sie schauen auf jeden Fall unter XNA für Ihre Spiel & Grafik-Framework (es verwendet C #). Es ist völlig kostenlos, es macht eine Menge Dinge für Sie, und bald werden Sie in der Lage sein, Ihr Spiel auf Xbox Live zu verkaufen.

Ihre wichtigste Frage zu beantworten, nichts, was Sie bereits in Flash tun können, würde jemals brauchen mehr als einen Thread zu verwenden. Speicher nur eine Liste von Positionen in einem Array und Schleife durch mit einem anderen für jeden Roboter versetzt.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top