Ir al contenido

publicidad
publicidad

Foto

Curso MM: 21 Guardando puntuaciones


Este tema ha sido archivado. Esto significa que no puedes responder en este tema.
No hay respuestas en este tema

#1

Escrito 22 agosto 2009 - 17:51

Guardando una lista de puntuaciones

Guardando y recuperando los datos de puntuaciones

Las puntuaciones son una lista de números enteros que se van a guardar convertidas en texto de 5 caracteres.

La función que utilizaremos para tratar con archivos será CreateFile():

[code:1]HANDLE CreateFile(
LPCTSTR szFileName,
DWORD dwDesiredAccess,
DWORD dwShareMode,
LPSECURITY_ATTRIBUTES pSecurityAttributes,
DWORD dwCreationDisposition,
DWORD dwFlagsAndAttributes,
HANDLE hTemplateFile);[/code]


Ésta función sirve igual para abrir que para cerrar archivos. El primer argumento es el nombre del archivo, el segundo es el sistema de acceso al archivo, el quinto determina si queremos abrir un archivo o crear uno nuevo, el sexto permite añadir uno o varios atributos. Ahora vemos un ejemplo para crear un archivo nuevo para escribir:

[code:1]HANDLE hFile = CreateFile(TEXT("HiScores.dat"), GENERIC_WRITE, 0, NULL,
CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);[/code]


El archivo HiScores.dat se crea y se prepara para escribir. Ahora veamos cómo abrimos un archivo:

[code:1]HANDLE hFile = CreateFile(TEXT("HiScores.dat"), GENERIC_READ, 0, NULL,
OPEN_EXISTING, FILE_ATTRIBUTE_READONLY, NULL);[/code]


Ahora vemos que se trata de un archivo para leer y que debe existir. También indica que es de solo lectura.

Ahora veamos otra función:

[code:1]BOOL WriteFile(
HANDLE hFile,
LPCVOID pBuffer,
DWORD dwNumberOfBytesToWrite,
LPDWORD pNumberOfBytesWritten,
LPOVERLAPPED pOverlapped);[/code]


Ejemplo:
[code:1]DWORD dwBytesWritten;
WriteFile(hFile, &cData, 5, &dwBytesWritten, NULL);[/code]

Y la función para leer:

[code:1]BOOL ReadFile(
HANDLE hFile,
LPVOID pBuffer,
DWORD dwNumberOfBytesToRead,
LPDWORD pNumberOfBytesRead,
LPOVERLAPPED pOverlapped);[/code]


Ejemplo:
[code:1]char cData[6];
DWORD dwBytesRead;
ReadFile(hFile, &cData, 5, &dwBytesRead, NULL);[/code]

También hay que usar ésta otra: CloseHandle(hFile);

Construyendo el programa de ejemplo Space Out 4
SpaceOut.h , SpaceOut.cpp

Ésta es la versión final del juego que se crea en el libro. Incluye una lista de puntuaciones que se almacena en un archivo. Añadiremos a la cabecera una tabla de enteros que almacene las puntuaciones:

int _iHiScores[5];

Necesitaremos algunas funciones para actualizar, leer y escribir la lista:

[code:1]void UpdateHiScores();
BOOL ReadHiScores();
BOOL WriteHiScores();[/code]

La de actualizar determina si la puntuación obtenida entra dentro de los 5 mejores y entonces la inserta en el lugar adecuado. Las otras son para leer la lista y escribirla en el disco. A la función para leer la lista la llamaremos en GameStart() para que muestre la lista en la pantalla de presentación. En GameEnd() grabaremos la lista. En GamePaint() mostramos la lista si estamos en modo demo. Para actualizar la lista vemos que SpriteCollision() comprueba si el juego ha terminado y si lo ha hecho llamamos a UpdateHiScores(). Ésta función comprueba si la puntuación está entre las cinco mejores y si lo está la introduce y desplaza las demás hacia abajo. Ahora veamos WriteScores():

[code:1]1: BOOL WriteHiScores()
2: {
3: // Create the hi score file (HiScores.dat) for writing
4: HANDLE hFile = CreateFile(TEXT("HiScores.dat"), GENERIC_WRITE, 0, NULL,
5: CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
6: if (hFile == INVALID_HANDLE_VALUE)
7: // The hi score file couldn't be created, so bail
8: return FALSE;
9:
10: // Write the scores
11: for (int i = 0; i < 5; i++)
12: {
13: // Format each score for writing
14: CHAR cData[6];
15: wsprintf(cData, "%05d", _iHiScores[i]);
16:
17: // Write the score
18: DWORD dwBytesWritten;
19: if (!WriteFile(hFile, &cData, 5, &dwBytesWritten, NULL))
20: {
21: // Something went wrong, so close the file handle
22: CloseHandle(hFile);
23: return FALSE;
24: }
25: }
26:
27: // Close the file
28: return CloseHandle(hFile);
29: }[/code]


Y la función para leer:


[code:1]1: BOOL ReadHiScores()
2: {
3: // Open the hi score file (HiScores.dat)
4: HANDLE hFile = CreateFile(TEXT("HiScores.dat"), GENERIC_READ, 0, NULL,
5: OPEN_EXISTING, FILE_ATTRIBUTE_READONLY, NULL);
6: if (hFile == INVALID_HANDLE_VALUE)
7: {
8: // The hi score file doesn't exist, so initialize the scores to 0
9: for (int i = 0; i < 5; i++)
10: _iHiScores[i] = 0;
11: return FALSE;
12: }
13:
14: // Read the scores
15: for (int i = 0; i < 5; i++)
16: {
17: // Read the score
18: char cData[6];
19: DWORD dwBytesRead;
20: if (!ReadFile(hFile, &cData, 5, &dwBytesRead, NULL))
21: {
22: // Something went wrong, so close the file handle
23: CloseHandle(hFile);
24: return FALSE;
25: }
26:
27: // Extract each integer score from the score data
28: _iHiScores[i] = atoi(cData);
29: }
30:
31: // Close the file
32: return CloseHandle(hFile);
33: }[/code]


En GamePaint() si estamos en modo demo mostramos la lista de puntuaciones más altas:

[code:1] // Draw the hi scores
TCHAR szText[64];
RECT rect = { 275, 230, 325, 250};
SetBkMode(hDC, TRANSPARENT);
SetTextColor(hDC, RGB(255, 255, 255));
for (int i = 0; i < 5; i++)
{
wsprintf(szText, "%d", _iHiScores[i]);
DrawText(hDC, szText, -1, &rect, DT_SINGLELINE | DT_CENTER | DT_VCENTER);
rect.top += 20;
rect.bottom += 20;
}[/code]

Código fuente


Este tema ha sido archivado. Esto significa que no puedes responder en este tema.
publicidad
publicidad