SoloCodigo

Programación Específica => Programación de Videojuegos => Allegro => Mensaje iniciado por: plaf en Martes 9 de Septiembre de 2003, 03:54

Título: Re: mover sprite con allegro
Publicado por: plaf en Martes 9 de Septiembre de 2003, 03:54
holas, recien estoy empezando con allegro y necesito mover un mono sobre un fondo obviamente sin dejar huella. el mono es de forma irregular (tiene fondo transparente) asi q no me sirve blitearle rectangulos al lado, y si pesco el pedazo de fondo y lo pongo encima y despues dibujo el mono un poco mas alla, me parpadea la imagen...
probe con un for para ir pixel x pixel viendo si hay q borrarlo y anda LENNNNNTO... :hitcomp:

ojala me puedan ayudar, grax
Título: Re: mover sprite con allegro
Publicado por: plaf en Martes 9 de Septiembre de 2003, 05:04
jajaja me pastelee, en el for q hice tenia cambiados unos signos > por < y entraba siempre al if, por eso era tan horrible...
ahora lo arregle y anda CASI perfecto, el unico detalle es q a veces me deja unos pedazos por ahi...
he aca el codigo:

 
Código: Text
  1.  
  2.  
  3. void mover_mono(BITMAP *fondo, mono *m, int dx, int dy)
  4. {
  5.     int x,y;
  6.        
  7.     for(y=0; y<64; y++)
  8.     {
  9.         for(x=0; x<64; x++)
  10.         {   // si hay un pedazo de mono no-transparente  y  (     el mono se va a mover fuera de esa zona            o            el pixel q va a ir ahi va a ser transparente )
  11.             if(getpixel(m->bmp,x,y)!=MASK_COLOR_16 && ((dx>0 && x<dx) || (dy>0 && y<dy) || (dx<0 && x>64+dx) || (dy<0 && y>64+dy) || getpixel(m->bmp,x-dx,y-dy)==MASK_COLOR_16))
  12.                 putpixel(screen,m->x+x-dx,m->y+y-dy,getpixel(fondo,m->x+x-dx,m->y+y-dy));
  13.         }   // entonces en ese punto copio el pixel del fondo encima del resto de mono
  14.     }
  15.    
  16.     m->x += dx;
  17.     m->y += dy;
  18.    
  19.     draw_sprite(screen,m->bmp,m->x,m->y);
  20.    
  21.     if(key[KEY_ESC]) exit(0);
  22. }
  23.  
  24. void saltar(BITMAP *fondo,mono *m)
  25. {
  26.     float vy,vx;
  27.    
  28.     for(vy=-2.49;vy<=2.5;vy+=G)
  29.     {
  30.         if(key[KEY_LEFT] && !key[KEY_RIGHT]) vx=-1;
  31.         else if(key[KEY_RIGHT] && !key[KEY_LEFT]) vx=1;
  32.         else vx=0;
  33.         mover_mono(fondo,m,vx,vy);
  34.     }
  35. }
  36.  
  37.  

podria hacer q cuando salte no se mueva de a 1, pero eso es facil, lo raro es q me deja unas huellas raras...
Título: Re: mover sprite con allegro
Publicado por: JuanK en Martes 9 de Septiembre de 2003, 19:10
si aumentas el movimiento te dejara huellas porque estas redibujando sin borrar la posicion anterior, es decir estas redibujando encima.

la solucion... pueden haber dos caminos,
el primero, es si estas utilizando la tecnica de doble buffer, para lo cual no hay mayor problema, simplemente vuelves a dibujar todo el fondo encima y luego dibujas lo tuyo.
la segunda es con la tecnica de dirty rectangles, conesta es mas dificil pero puede ser mas eficiente,
deberas guardar lo que hay en el fondo antes de dibujar tu personaje, luego dibujas tu personaje, despues vuelves a dibujar el segmento de fondo donde estaba tu personaje, guardas la parte del fondo donde lo vas a dibujar nuevamente y asi sucesivamente se repite el ciclo...

Si quieres te puedo enviar ejemplos.

La tecnica que usas es ineficiente, porque si analisas tu dibujo, tiene en el contorno algunos pixeles transparantes, asi que cuando lo mueves solo de a un pixel te borra el dibujo entrior y asi pareciera que todo va bien, pero cuando lo desplazas de a mas pixeles, el propio bitmap no alcanza a borrarce a si mismo.

Juank
Título: Re: mover sprite con allegro
Publicado por: plaf en Miércoles 10 de Septiembre de 2003, 07:26
primero, gracias por la respuesta, y segundo, a veces me empiezo a volar con el codigo y no me lo entiende nadie...
estuve haciendo unos monitos en paint diagramando algunas cosas y me resulto eso, pero debo haber pasado por alto algun detalle q se me sigue pasando...
el q puse ahi si funcionaba, pero no perfecto, porque cuando hacia un "cambio de velocidad" dejaba un pedazo de huella. todavia no puedo arreglar eso, pero me rendi y busque un poco de info del doble buffer y lo hice asi (el codigo queda bastante mas lindo y es mas rapido q andar leyendo los pixeles...)
al final me quedo esto:

 
Código: Text
  1.  
  2. void mover_mono(BITMAP *fondo, mono *m, int dx, int dy)
  3. {
  4.     BITMAP *temp;
  5.     int izq,arr;
  6.    
  7.     if(dx<0) izq=m->x+dx;
  8.     else izq=m->x;
  9.     if(dy<0) arr=m->y+dy;
  10.     else arr=m->y;
  11.    
  12.     temp = create_bitmap(64+abs(dx),64+abs(dy));
  13.     blit(fondo,temp,izq,arr,0,0,64+abs(dx),64+abs(dy));
  14.     draw_sprite(temp,m->bmp,m->x+dx-izq,m->y+dy-arr);
  15.     draw_sprite(screen,temp,izq,arr);
  16.     destroy_bitmap(temp);
  17.     m->x+=dx;
  18.     m->y+=dy;
  19. }
  20.  
  21.  

despues si me sobra tiempo veo eso de los rectangulos cochinos...
Título: mover sprite con allegro
Publicado por: JuanK en Miércoles 10 de Septiembre de 2003, 14:17
bien por lo del dbuffer!!!
asi se arranca..
lo de los rectangulos cochinos(dirty rectangles) es mucho mejor pero debes tener en cuenta esto:

-si mueves muchas cosas en pantalla es mejor dbuffer, si quieres experimenta con los tiempos
-si mueves pocos objetos es mas eficiente el de los rectangulos
--hay otra tecnica llamada triple buffer,  pero nunca la he usado, por que ademas no muchas tarjetas la soportan.


Juank