2010-09-27 37 views
6

Estoy creando un juego de plataforma en JavaScript usando canvas que está basado completamente en mosaicos. ¿Cuál es el mejor método para almacenar los bloques de elementos en el juego (paredes, pisos, elementos)? La cosa es que cada azulejo se puede destruir o crear.Estructura de datos para niveles en juegos

Actualmente tengo una matriz en 2D, así que puedo verificar rápidamente si un elemento se encuentra en una posición específica X & Y. El problema con esto es cuando el usuario se mueve y el mapa necesita desplazarse, necesito reasignar cada bloque. ¿Y qué sucede cuando el artículo está en x = 0? No puedo usar índices negativos

Preferiría que el análogo en desplazamiento se aposte a un mosaico a la vez. También planeo generar mapas aleatoriamente a medida que el usuario se mueve y si no se ha generado previamente. Entonces, una vez que algo se genera, debe permanecer así para siempre.

Otro punto que debo mencionar es que también será multijugador. Así que fragmentar la pantalla es una gran idea hasta que los datos en caché se ensucien y necesite obtener lo último de la base de datos. Gah soy muy nuevo en todo esto; parece imposible, cualquier ayuda es muy apreciada.

+0

¿Su plataforma es infinitamente ancha en el eje x? ¿Por qué tienes un problema con x = 0? ¿Deberías simplemente bloquear el desplazamiento hacia la izquierda en ese caso? –

+1

Revisa http://www.youtube.com/watch?v=_RRnyChxijA – Sharun

+0

Es infinito. El usuario debería poder regresar a la izquierda con las mismas fichas. – Louis

Respuesta

4

Dado que tienes niveles infinitos, te sugeriría una estructura similar a la que ya tienes, con un ligero ajuste.

En lugar de almacenar todo en una gran matriz, mover cosas dentro de esa matriz cada vez que el usuario se mueve (ouch) almacenan 9 pedazos de mapa (cada uno tiene un tamaño tal que es aproximadamente el doble del tamaño de la pantalla) Cuando el usuario se acerca al borde del trozo actual, deseche los trozos que están fuera de pantalla, mueva todos los trozos a la izquierda y cargue los nuevos en el espacio.

Con suerte eso estaba claro, pero por si acaso, aquí es un diagrama:

Chunking

Los cuadrados con letras son los pedazos de mapa, y el cuadrado rojo es el acceso visual (lo dibujé un poco demasiado grande , recuerda que la ventana gráfica es más pequeña que los cuadrados negros). A medida que la ventana gráfica se mueve hacia la derecha, descarga los trozos A B y C, mueve todos los demás y carga los nuevos datos en los más correctos. Como un trozo tiene el doble del ancho de la pantalla, tiene el tiempo que le lleva al usuario cruzar la pantalla para generar/cargar el nivel en esos trozos. Si el usuario se mueve rápidamente por el mundo, puede tener un conjunto de 4x4 para agregar más memoria.

Para abordar el retorno a trozos anteriores del mapa.hay un par de maneras de hacer eso:

  • escribir los trozos en el disco duro cuando ya no están en uso (o cualquiera que sea el equivalente sería en javascript)
  • ampliar su trozo conjunto infinitamente en memoria. En lugar de una matriz de fragmentos, tiene una matriz asociativa que toma la posición x/y del fragmento y devuelve el fragmento (o nulo, que indica que el usuario nunca ha estado aquí antes y que necesita generarlo).
  • generan vista del procedimiento sus niveles, eso es complejo, pero significa que una vez que un trozo va fuera de la pantalla se puede simplemente lo disponga, y estar seguro de que puede regenerar exactamente el mismo trozo de nuevo más tarde
1

Obviamente, hay muchas formas de hacerlo.

Si los niveles no son demasiado grandes, puede mantener su diseño original de una matriz de 2d y usar una variable para almacenar la posición actual de desplazamiento x/y. Esto significa que almacena toda la información del mapa en la memoria en todo momento, y solo accede a las partes que necesita para mostrar en la pantalla.

Al pintar, averigüe qué mosaico está visible en la posición de desplazamiento actual x/y, cuántos mosaicos caben en la pantalla con el ancho de la pantalla actual y solo pinta los que necesita.

Si desplaza azulejos enteros a la vez, entonces es bastante fácil. Si se trata de un desplazamiento más analógico, necesitarás un control de grano más fino en el lugar en el que comiences a dibujar, o puedes hacer trampas y dibujar todo el conjunto de mosaicos en un mapa de bits en memoria y luego ajustarlo al dibujo con un negativo compensar.

1

Una vez definido esto mismo en XML y JSON ... Creo que la serialización JSON sería mucho más rápida y más eficiente (sin mencionar fácil) para trabajar con JavaScript, especialmente porque JSON se presta muy bien a las listas de longitud variable como lo requeriría para los niveles "N" en cada juego.

El uso de un formato estándar también lo haría más reutilizable y (idealmente) fomentaría una mayor colaboración (si eso es lo que está buscando). Puedes ver mi primer intento de crear un Video Game schema for level structure. Como fileoffset dice, hay muchas maneras de hacerlo, pero sugiero mantener sus datos de nivel (es decir, conceptos) separados de su representación (es decir, objetos en movimiento, rutas, velocidad, tiempo, x/y/z co -correspondiente posicionamiento, etc. ...).

Nuevamente, como el artículo decía que el área cambiaba más rápidamente, y no hay forma de saber si WebGL, SMIL + SVG, Canvas + Javascript, bueno ol 'Flash/Actionscript u otra cosa será la mejor ruta para usted, Dependiendo de sus necesidades y del tipo de juego que esté desarrollando.

Cuestiones relacionadas