¿Alguien me puede ayudar con mi juego? [C++]

E

Bueno, necesito a alguien que maneje de C++ punteros y tal.
El caso es que estoy haciendo un juego utilizando SDL, un clon del Pokémon azul de Game Boy (por ahora, una vez hecho entero pretendo ampliarlo).

Tengo ya "chicha" hecha, pero tengo un ligero problema.
El escenario, se guarda en un archivo de texto, del tipo:

100010111200310111101010100101010101010101010100212031021020120102102131001321

Que ahora mismo, tiene una longitud fija, esto se "parte" en trozos de longitud fija también:

1000101112003
1011110101010
0101010101010
1010101002120
3102102012010
2102131001321

y cada número indica el tipo de "casilla" que forma el mapa.

Ahora tengo el escenario en el programa como un Array del tipo casilla (longitud fija).
Y me gustaría almacenar el escenario con memoria dinámica, es decir, con punteros. Y que lo mismo puede haber un escenario de 20x20 como uno de 200x200 y que el juego lo cargue.

Lo he intentando pero he fracasado porque me he liado con los punteros.
¿Alguien sería capaz de ayudarme?
Si alguien se ofrece voluntario a echar un ojo al código y darme algunas pistas, le envío el resto de la información.

Un saludo!

MTX_Anubis

quieres un array dinámico imagino

hace mucho que no toco c++ pero sería como algo así

int mapa** = new int*[X];

for (int j =0; j<x; j++) {
mapa[j] = new int[Y];
}

Si no recuerdo mal era algo así, tampoco he entendido tu duda y si eso concretamente.

Buffoncete

Si vas a hacerlo con C++ lo mejor que puedes utilizar es la SDL con vectores.

vector<vector<int > > mapa;

Pero si te encabezonas en utilizar punteros no puedes hacer lo siguiente después de leer el número de columnas de un fichero, xq estos valores han de estar definidos en tiempo de compilación:

int ** mapa;
mapa = new int[NUM_COLUMNAS];
for(int i = 0; i < NUM_COLUMNAS; i++)
    mapa[i] = new int[NUM_FILAS];

Si estás haciendo un juego debes tener varios "estados" MENU, JUEGO, GAMEOVER, RANKING etc que cambian la presentación, si esta pantalla la haces por herencia puedes definir el alto y el ancho como variables locales, defines el vector entero

vector<int> mapa(WIDTH*HEIGHT);
_width = WIDTH;
_height = HEIGHT;

y luego hacerte una función para recorrerlo

int getElementAt(int x, int y)
{
    return mapa[x*_width + y];
}

Y para hacerlo más bonito lo haces con templates y así no lo ligas a un tipo de valor exclusivamente.

ChaRuu

joder menuda paranoia xd

MTX_Anubis

#3 what? Estás diciendo que esto, por ejemplo, da error de compilación?

int** hazArrayBidimensional(int n, int m) {
	int ** aux = new int*[n];

for(int i =0; i<n; i++){
	aux[i] = new int[m];
}

return aux;
}

void main(int argc,  char *argv[])
{
	int x, y;

cin >> x;
cin >> y;
int** c = hazArrayBidimensional(x,y);

    //Haces lo que te de la gana con c

}
E

Décimo edit... parece que las cosas funcionan... en breves sabré si lo he conseguido...

Buffoncete

#5 lo que estás haciendo es un fallo muy gordo de programación.

Das la responsabilidad a una función de guardar memoria sobre un objeto que acabará siendo global externamente, y lo haces en la pila no en el heap de memoria, es un fallo bastante gordo dado que cuando salga de la función esa porción de memoria puede quedar "afectada".

Para hacerlo bien debes declarar tu puntero a int static, para que el compilador sepa cómo se va a utilizar dicho array.

Para más información sobre best practices y como evitar pitfalls en C++ mírate este blog:

http://blog.copton.net/index.html

Edito xq no se entiende bien a lo que me refiero.

En el caso de #5 funciona correctamente, pero teniendo en cuenta sistemas distribuidos es un fallo de programación muy gordo. Más info en el link y sublinks de arriba.

E

Éxito chavales!!!
Al cambiar el escenario a memoria dinámica por algún motivo que desconozco, el resto de objetos, que eran estáticos, se rompieron y se les fueron a la mierda todos los parámetros iniciales.
Así que siguiendo una especie de "dominó", he tenido que cambiar casi todo el programa a memoria dinámica, llenarlo todo de punteros y de new's. Pero después de pegarme un poco con ello, ya tengo de vuelta lo que tenía antes hecho con memoria estática, y ahora el escenario se carga automáticamente, reservando la memoria que se requiera. Es decir, el tamaño del escenario lo determina (sin más límite que la memoria del pc), el tamaño del archivo :)

Un screen: http://img841.imageshack.us/img841/5346/exitoo.png

MTX_Anubis

#7 Yo no te digo que no sea un fallo, puse el ejemplo porque dijiste que crear arrays dinámicos da error de compilación xD.

Siempre me gusta leer esos consejos y de hecho tengo unos cuantos libros en pdf que de vez en cuando ojeo pero el problema es que en mi vida he programado para sistemas distribuidos, hace años que no programo en C++ y dudo que lo vuelva a hacer xD.

Gracias por los links :)

Usuarios habituales

  • MTX_Anubis
  • endless_dark
  • Buffoncete
  • ChaRuu