Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: anonimo12121 en 25 Agosto 2012, 11:12 am



Título: Que opinan sobre esta idea para el code de un juego.
Publicado por: anonimo12121 en 25 Agosto 2012, 11:12 am
Mira me explico. Estaba hoy trabajando en el sistema de colisiones de mi juego.
Que funciona de la siguiente manera, carga una imagen en blanco y negro el negro es colisión, entonces lo que hace cada vez que comprueba si hay colisión es comprobar si el color de la imagen es negro, si es negro colisiona, y he pensado si lo hiciera de esta otra forma en tiempo play iría más rápido, me explico:

1- Carga la imagen en blanco y negro, comprueba su resolución en pixels.
2- Creo un bucle que añade a un bool[][] true si hay colisión y false si no lo hay.

entonces la idea básica es que a la hora de cargar el mapa y todo eso es algo más lento quizás pero a la hora de jugar es más rápido, por que no hay que llamar a una función par comprobar el color de cierto pixel de la imagen.

Código
  1. for(int y=0;y<SizeMapY*32;y++){
  2.        for(int x=0;x<SizeMapX*32;x++){
  3.            if(IMap->getPixel(x,y) == sf::Color::Black)PixelMap[y][x]=true;
  4.            else PixelMap[y][x]=false;
  5.        }
  6.    }

El único inconveniente que le veo es a la hora de hacer mapa exagerados de quizás
Código
  1. bool map[1000000][1000000]
Los números son cada pixel, en este caso son 1000000 de ancho por alto. Una exageración pero bueno xD
Ustedes que opinan sobre esto?

Esto es una archivo de texto generado a partir de bucle.
http://img338.imageshack.us/img338/3791/mapmg.png


Título: Re: Que opinan sobre esta idea para el code de un juego.
Publicado por: do-while en 25 Agosto 2012, 16:07 pm
¡Buenas!

Anidar distintos bucles uno dentro de otro suele ser mas lento que ejecutar uno solo (por lo menos a mi me lo parece). Si tienes que recorrer una mtriz de n dimensiones, con rango Nn,...,N1 en cada una de ellas te basta con un solo bucle:

tipo matriz[Nn][Nn-1][N1];

for(i = 0 ; i < Nn * ... * N1 ; i++)

Teniendo esto, el subindice mas a la derecha sera: i % N1
Y yendo en orden hacia la izquierda, el subindice k sera: (i / (Nk-1 * ... * N1)) % Nk

En este caso tendrias:

Código
  1. for(i = 0 ; i < DIM_X * DIM_Y ; i++)
  2.    if(v[i / DIM_Y][i % DIM_Y] == loquesea)
  3.  

No se si te servira o no, ya te digo que no se si esto es mas rapido que anidar bucles. Lo pensare. Si alguno sabeis (con argumentos, claro esta) si es mas rapido esto que anidar bucles nos lo podriais contar...

¡Saludos!


Título: Re: Que opinan sobre esta idea para el code de un juego.
Publicado por: anonimo12121 en 25 Agosto 2012, 16:13 pm
Hombre si me dices que es más rápido lo hago así XD


Título: Re: Que opinan sobre esta idea para el code de un juego.
Publicado por: do-while en 25 Agosto 2012, 17:00 pm
Voy a hacer una prueba y te comento los resultados.

¡Hasta ahora!

XD, la prueba falla. Esto (la parte de los bucles anidados) me da falta de segmentacion:
Código
  1. #include <time.h>
  2.  
  3. #define DIM1 1000LU
  4. #define DIM2 1000LU
  5. #define DIM3 1000LU
  6.  
  7. int main(int argc, char *argv[])
  8. {
  9.    int v[DIM1][DIM2][DIM3];
  10.    unsigned long i,j,k,t;
  11.  
  12.    t = time(NULL);
  13.  
  14.    for(i = 0 ; i < DIM1 ; i++)
  15.        for(j = 0 ; j < DIM2 ; j++)
  16.            for(k = 0 ; k < DIM3 ; k++)
  17.                v[i][j][k] = i;
  18.  

Evidentemente no he puesto todo el codigo...

¿Os pasa lo mismo?

Compilado en ubuntu:

gcc -o ejecutable fuente

XD


Título: Re: Que opinan sobre esta idea para el code de un juego.
Publicado por: anonimo12121 en 25 Agosto 2012, 17:26 pm
Por que pones 1000LU y no 1000? no se que es eso de LU xD
Yo apuesto a que te sales de la memoria xDD


Título: Re: Que opinan sobre esta idea para el code de un juego.
Publicado por: do-while en 25 Agosto 2012, 17:48 pm
LU despues de una constante significa que es unsigned long.

Es posible que el desplazamiento generado sobre el puntero v se salga de rango... aunque cada una de las dimensiones esta dentro del rango de un unsigned long...

De todas formas, reduciendo el valor de las constantes, no da la falta, pero ambos bucles terminan en menos de un segundo, por lo que no puedo hacer las comparaciones...

¡Saludos!


Título: Re: Que opinan sobre esta idea para el code de un juego.
Publicado por: 0xDani en 25 Agosto 2012, 18:16 pm
Evidentemente los bucles no se salen del rango de v, pero quiza el sistema no te deja reservar tanta memoria. Quiza funcione si reduces el tamaño del array y pones otro bucle que incluya a los otros tres, haga un tratamiento de la informacion almacenada en el array y lo vuelva a rellenar. Es decir, que el array no llegue a contener toda la informacion, sino que lo llenas, lo tratas y lo vuelves a llenar.

Piensa que al hacer:
Código
  1. int v[DIM1][DIM2][DIM3];
Estas reservando 1000x1000x1000xsizeof(int) bytes.

Saludos.


Título: Re: Que opinan sobre esta idea para el code de un juego.
Publicado por: anonimo12121 en 25 Agosto 2012, 18:51 pm
Hay cosas como esos de 1000LU que en mi vida he visto en un tutorial ni manual ni nada, no se como aprendiste eso XD.
creo que 0xDani tiene razón a mi antes me ha pasado algo similar  haciendo lo de  bool x[1000000][100000] xD



Título: Re: Que opinan sobre esta idea para el code de un juego.
Publicado por: do-while en 25 Agosto 2012, 18:59 pm
Es cierto, el problema esta en la declaracion.

Suponiendo que gcc trabaja con ints de 4 bytes, con las constantes indicadas v ocuparia 3,725290298GB. Un poco demasiado, ¿no?  :xD

¡Saludos!


Título: Re: Que opinan sobre esta idea para el code de un juego.
Publicado por: 0xDani en 25 Agosto 2012, 19:17 pm
Cita de: Xafi
Hay cosas como esos de 1000LU que en mi vida he visto en un tutorial ni manual ni nada, no se como aprendiste eso XD.

En serio? Yo si recuerdo haberlo visto en el curso C++ con Clase, creo.



Título: Re: Que opinan sobre esta idea para el code de un juego.
Publicado por: anonimo12121 en 25 Agosto 2012, 21:54 pm
me saltaría esa clase xDDD jaja no se no me suena enserio