Pregunta

Quería "emular" un popular juego flash, Chrontron, en C++ y necesitaba ayuda para empezar.(NOTA:No para liberarme, solo practicar para mí)

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

Entonces, eso explica en cierto modo cómo funciona el juego.Deberías jugar un poco para entender realmente cuál es mi problema.

Estoy pensando que una buena manera de resolver esto sería usar listas vinculadas para almacenar cada estado, que probablemente será un mapa hash, en función del tiempo o una lista vinculada que itera en función del tiempo.Todavía no estoy seguro.

PREGUNTA REAL:

Ahora que tengo algunas especificaciones aproximadas, necesito ayuda para decidir qué estructuras de datos usar para esto y por qué.Además, quiero saber qué API/capa de gráficos debo usar para hacer esto:SDL, OpenGL o DirectX (mi elección actual es SDL).¿Y cómo haría para implementar estados paralelos?¿Con hilos paralelos?

EDITAR (Para aclarar más):
Sistema operativo: Windows (dado que este es un proyecto de hobby, puede hacerlo en Linux más adelante)
Gráficos - Lenguaje 2D - C ++ (debe ser C ++ - Esto es práctica para un curso el próximo semestre)

P-Sin respuesta:SDL:OpenGL:X directo
Q-Respuesta:Evite el procesamiento paralelo
Q-Respuesta:Utilice STL para implementar acciones de paso de tiempo.

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

Además de la pregunta, he usado principalmente C#, PHP y Java antes, por lo que no me describiría como un programador experto.¿Qué conocimientos específicos de C++ me ayudarían a facilitar este proyecto?(es decir.¿Vectores?)

¿Fue útil?

Solución

Lo que debes hacer es primero leer y comprender el bucle del juego de "paso de tiempo fijo" (aquí tienes una buena explicación: http://www.gaffer.org/game-physics/fix-your-timestep).

Luego, lo que debe hacer es mantener una lista de pares de contador de fotogramas y acción.Ejemplo de STL:

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

O tal vez un vector de listas de pares.Para crear el estado, para cada acción (interacción del jugador) almacena el número de fotograma y la acción que se realiza; lo más probable es que obtenga los mejores resultados si la acción simplemente se "presiona la tecla <X>" o "se suelta la tecla <X>". ":

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

Para reproducir los estados anteriores, tendría que restablecer el contador de fotogramas cada vez que el jugador active la máquina del tiempo y luego recorrer la lista de estados para cada estado anterior y ver si alguno coincide con el fotograma actual.Si lo hay, realice la acción para ese estado.Para optimizar, puede mantener una lista de iteradores de dónde se encuentra en cada lista de estado anterior.aquí hay algunos pseudocódigo para eso:

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

Espero que captes la idea...

Los subprocesos separados simplemente complicarían enormemente el asunto, de esta manera obtendrás el mismo resultado cada vez, lo cual no puedes garantizar usando subprocesos separados (realmente no puedo ver cómo se implementaría) o un bucle de juego de paso de tiempo no fijo.

Cuando se trata de API de gráficos, elegiría SDL ya que probablemente sea la forma más fácil de comenzar.Siempre puedes usar OpenGL de SDL más adelante si quieres pasar al 3D.

Otros consejos

Esto suena muy parecido a Trenza.Realmente no quieres procesamiento paralelo para esto: la programación paralela es duro, y para algo como esto, el rendimiento no debería ser un problema.

Dado que el vector de estado del juego crecerá muy rápidamente (probablemente del orden de varios kilobytes por segundo, dependiendo de la velocidad de fotogramas y de la cantidad de datos que almacene), no querrás una lista vinculada, que tiene muchos gastos generales en términos de de espacio (y puede introducir grandes penalizaciones de rendimiento debido a errores de caché si está mal distribuido).Para cada línea de tiempo paralela, desea una estructura de datos vectoriales.Puede almacenar cada línea de tiempo paralela en una lista vinculada.Cada línea de tiempo sabe a qué hora comenzó.

Para ejecutar el juego, recorre todas las líneas de tiempo activas y realiza acciones de un fotograma desde cada una de ellas al mismo tiempo.No es necesario realizar procesamiento paralelo.

He jugado este juego antes.No creo necesariamente que el procesamiento paralelo sea el camino a seguir.Has compartido objetos en el juego (palancas, cajas, ascensores, etc.) que deberán compartirse entre procesos, posiblemente con cada delta, reduciendo así la efectividad del paralelismo.

Personalmente, simplemente mantendría una lista de acciones y luego, para cada iteración posterior, comenzaría a intercalarlas.Por ejemplo, si la lista tiene el formato <[iteración.acción]>, entonces la tercera vez se ejecutarían las acciones 1.1, 2.1, 3.1, 1.2, 2.2, 3.3, etc.

Después de repasar brevemente la descripción, creo que tienes la idea correcta: tendría un objeto de estado que contiene los datos de estado y lo colocaría en una lista vinculada... No creo que necesites hilos paralelos...

En cuanto a la API de gráficos, solo he usado opengl, y puedo decir que es bastante potente y tiene una buena API C/C++, opengl también sería más multiplataforma ya que puedes usar la biblioteca messa en computadoras *Nix.

Una idea de juego muy interesante.Creo que tiene razón en que la computación paralela sería beneficiosa para este diseño, pero no más que cualquier otro programa de altos recursos.

La pregunta es un poco ambigua.Veo que vas a escribir esto en C++ pero ¿para qué sistema operativo lo estás codificando?¿Tiene la intención de que sea multiplataforma y qué tipo de gráficos le gustaría, es decir, 3D, 2D, de alta gama, basados ​​en la web?

Básicamente necesitamos mucha más información.

El procesamiento paralelo no es la respuesta.Simplemente debes "grabar" las acciones de los jugadores y luego reproducirlas para las "acciones anteriores".

Entonces creas un vector (lista enlazada individualmente) de vectores que contiene las acciones.Simplemente almacene el número de fotograma en el que se realizó la acción (o el delta) y complete esa acción en el "bot ficticio" que representa al jugador durante esa instancia en particular.Simplemente recorre los estados y los activa uno tras otro.

Se obtiene el efecto secundario de "romper" fácilmente el juego cuando ocurre una paradoja de estado simplemente porque la siguiente acción falla.

A menos que estés desesperado por usar C++ para tu propia educación, definitivamente deberías mirar XNA para su marco de juegos y gráficos (usa C#).Es completamente gratis, hace muchas cosas por ti y pronto podrás vender tu juego en Xbox Live.

Para responder a su pregunta principal, nada de lo que ya pueda hacer en Flash necesitaría utilizar más de un hilo.Simplemente almacene una lista de posiciones en una matriz y recorra con un desplazamiento diferente para cada robot.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top