2011-07-13 19 views
5

Estoy creando un juego 2D básico (bueno, un motor de juego) y actualmente estoy desarrollando los formatos de archivo para mis datos. Por supuesto, para que este juego se ejecute, necesitaré caché. Me parece bastante poco profesional dejar todos los datos para que el juego no esté en un solo archivo (bueno, no necesariamente, siempre y cuando los archivos estén en algún tipo de formato de caché).¿La mejor manera de almacenar datos para tu juego? (Imágenes, mapas, etc.)

Así que es por eso que he venido aquí para preguntar. Estaba pensando en hacer un archivo zip pero siento que esa no es la mejor manera. También estaba pensando en hacer otro escritor binario que tendrá encabezados (tipo de archivo, "ubicación") y una etiqueta adjunta para cada uno de los archivos para que sea fácil de interpretar. Pero sentí que eso era demasiado ineficiente.

Entonces, ¿tiene alguna idea?

Nota: Este motor de juego es realmente solo para fines de aprendizaje.

tl; dr Necesito una manera eficiente de almacenar datos como imágenes para mi juego que estoy haciendo.

+0

¿Desea escribir también en la memoria caché, o simplemente está preguntando acerca de cómo empacar todo su contenido estático? –

+0

Muchos juegos almacenan imágenes y sonidos como archivos de imagen y sonido básicos. Si realmente quieres hacer esto, agrégalo después de que finalice el juego; de lo contrario, va a ralentizar el desarrollo ya que tienes que compilar el código Y los activos. – thedaian

+0

@Dilum Ranatunga - También quiero poder escribir en el caché o, al menos, poder agregar contenido nuevo. – Fellixombc

Respuesta

7

Puede almacenar cualquier objeto como .dat file:

public class MyGame implements Serializable 
{ 
    private static void saveGame(ObjectType YourObject, String filePath) throws IOException 
    { 
     ObjectOutputStream outputStream = null; 
     try 
     { 
      outputStream = new ObjectOutputStream(new FileOutputStream(filePath)); 
      outputStream.writeObject(YourObject); 
     } 
     catch(FileNotFoundException ex) 
     { 
      ex.printStackTrace(); 
     } 
     catch(IOException ex) 
     { 
      ex.printStackTrace(); 
     } 
     finally 
     { 
      try 
      { 
       if(outputStream != null) 
       { 
        outputStream.flush(); 
        outputStream.close(); 
       } 
      } 
      catch(IOException ex) 
      { 
       ex.printStackTrace(); 
      } 
     } 
    } 

    public static ObjectType loadGame(String filePath) throws IOException 
    { 
     try 
     { 
      FileInputStream fileIn = new FileInputStream(filePath); 
      ObjectInputStream in = new ObjectInputStream(fileIn); 
      return (ObjectType) in.readObject(); 
     } 
     catch(FileNotFoundException ex) 
     { 
      ex.printStackTrace(); 
     } 
     catch(IOException ex) 
     { 
      ex.printStackTrace(); 
     } 
    } 
} 
+0

Ahh sí, lo usé para escribir y leer los archivos de mi mapa. Esta es una de las ideas que estaba considerando, pero ¿cómo podría almacenar y administrar archivos de imágenes? – Fellixombc

+0

@Fellixombc almacena las imágenes tal como están (jpg, gif, bmp, ... etc) –

+0

Oh, no me di cuenta de que podrías hacer eso. Gracias. – Fellixombc

2

No creo que la postal es el camino equivocado. Es una forma bastante buena. Simplemente ponga todo en un archivo jar. Incluso podrá usar un cargador de clases para cargarlo.

+0

+1: Jar es una mejor opción que Zip, y usar getResourceAsInputStream() para obtener cualquier recurso del cargador de clases significa que puede tener el archivo sin un directorio para desarrollo, más tarde en un contenedor sin cambiar el código –

+0

No puede escribir en un JAR que está vinculado por un cargador de clases. Entonces, esta solución fallaría como una memoria caché escribible. –

+0

Eso suena bastante interesante en realidad, y sería una buena experiencia de aprendizaje, ¡gracias! – Fellixombc

1

Por razones pragmáticas, recomendaría usar varios archivos pero ponerlos todos en un subdirectorio en temp.

Pero si parte de su ejercicio de aprendizaje está relacionado con este tema, aquí están mis sugerencias:

En primer lugar, se mantenga alejado de cualquier formato como ZIP, donde hay una fuerte penalización para eliminar, actualizar, añadir, saltando . Incluso con los archivos de índice de un JAR, son pobres para cualquier otra cosa que no sea la compresión.

Para que pueda leer en los sistemas de archivos. Básicamente, estás escribiendo un sistema de archivos donde el 'disco' es solo un archivo binario. Eso debería darle una idea de alto nivel de las tablas de asignación, etc. Para implementar dicho diseño, necesita acceso de lectura/escritura al archivo subyacente; mira java.io.RandomAccessFile

Finalmente, si estás dispuesto a usar Java7, puedes jugar con el nuevo filesystem SPIs.

+0

¡Muchas gracias!Seguiré adelante y veré el archivo RandomAccess y veré qué puedo hacer. Y sí, estoy intentando aprender nuevas formas de hacer las cosas junto con la exploración de Java un poco más. – Fellixombc

Cuestiones relacionadas