| Ver tema anterior :: Ver siguiente tema | | Autor | Mensaje |
|---|
Che_Quique
Registrado: 25 Oct 2006 Mensajes: 52 Ubicación: Lanus Este Bs As Argentina
| Publicado: 07/06/2007 6:43 am | | | Título: Necesito saber todo sobre doble Buffer |
| Pregunto, una vez que entendiera como funciona doble buffer, como se recuepra la imagen de fondo de un juego determinado? como una variable mas, que se imprime por doble buffer constantemente?
Si es posible, pasen ejemplo de la imprecion de una imagen pequeña en movimiento y como se recupera la imagen de fondo.
Saludos. _________________
"No experimentaremos una alegria miserable, sino una alegria que pertenecera a millones"
Che Quique. |
| | Volver arriba | |  | Killrazor
Registrado: 24 Ene 2006 Mensajes: 1182 Ubicación: Barcelona
| Publicado: 07/06/2007 7:31 am | | | Título: |
| Pero a ver, yo diria que aunque lo has comprendido, solo lo has hecho en teoria. Cada sistema grafico lo hace de una manera diferente. En los sistema de este siglo, es una funcion que llama a un mecanismo interno del API grafico, que a su vez activa este mecanismo dentro del hardware grafico. Para poner un ejemplo deberiamos hablar de assembler (o quizas algo peor) de targetas y la verdad como que no tngo ni idea.
En cambio, en sistemas del siglo pasado, los graficos iban en una zona de la memoria mapeada llamada memoria de video y lo que se hacia era un cambio de localizacion de puntero. Asi escribiamos en la zona oculta y mostrabamos la apuntada.
Y asi, con los datos que me das la verdad es que es lo unico que se me ocurre. _________________ I wanna heal i wanna feel like I'm close to something real. I wanna find something I've wanted all along somewhere i belong |
| | Volver arriba | |  | Che_Quique
Registrado: 25 Oct 2006 Mensajes: 52 Ubicación: Lanus Este Bs As Argentina
| Publicado: 07/06/2007 8:26 am | | | Título: Doble buffer en Allegro |
| Me refiero a doble buffer con Allegro. Si tengo que usarlo para cada variable grafica en movimiento, incluso para la imagen de fondo, constantemente para que el mismo se recupere.
De todos modos creo que debo empezar con un solo ejemplo sobre uan sola imagen, sobre una imagen de fondo y despues usar la teoria de la relatividad. ja! _________________
"No experimentaremos una alegria miserable, sino una alegria que pertenecera a millones"
Che Quique. |
| | Volver arriba | |  | | nwg
Registrado: 09 Ago 2006 Mensajes: 40
| Publicado: 07/06/2007 8:38 am | | | Título: |
| El doble buffer lo que hace es almacenar la imagen en otro buffer que no sea la pantalla y cuando este listo se intercambia con la pantalla.
El doble buffer sirve para que no se vea el pestañeo constante en una animacion.
No se como es en Allegro pero al iniciar el modo de video deberias tener una llamada al doble buffer y despues en las cargas de imagenes o animaciones tambien deberia de haber una llamada para el intercambio del buffer a la pantalla.
Hace unos dias te deje un link a una pagina de juegos en otro post, te reitero que tambien tiene tutoriales de allegro donde explican todo eso, primero lee y relee esos tutoriales para poder entender estas cosas.
Saludos |
| | Volver arriba | |  | Che_Quique
Registrado: 25 Oct 2006 Mensajes: 52 Ubicación: Lanus Este Bs As Argentina
| Publicado: 07/06/2007 4:59 pm | | | Título: Si me acuerdo |
| Si me acuerdo nwg, loserjuegos, pero en este instante estoy imprimiendo un turorial en castellano, excelente, elaborado por una universidad.
En cuanto este en carerra sigo preguntando, pero no viene mal algun ejemplo comentado de doble buffer en allegro, le que lo sepa.
Saludos a todos y gracias. _________________
"No experimentaremos una alegria miserable, sino una alegria que pertenecera a millones"
Che Quique. |
| | Volver arriba | |  | Che_Quique
Registrado: 25 Oct 2006 Mensajes: 52 Ubicación: Lanus Este Bs As Argentina
| Publicado: 08/06/2007 7:23 am | | | Título: Gracias de todos modos |
| Seguramente, no supe preguntar, por eso nadie me supo responder.
Segun la excelente introduccion de Allegro que tengo doble buffer es la creacion de un solo bitmap que contiene a todos los bitmap en aparente movimiento que se actualiza constantemente, llamado por el temporizador varias veces por segundo y para que la imagen no titilee.
Es asi o me equivoco en algo? Si es asi, no es tan dificil como para que algunos locos digan que para hacer un juego hay que saberse a Pitagoras y Newton de memoria.
Recomiendo leer el tutorial de allegro que tengo yo, al principiante que en c que rapidamente quiera entrar en el mundo de los videojuegos.
Que me lo pida por mail a _________________
"No experimentaremos una alegria miserable, sino una alegria que pertenecera a millones"
Che Quique. |
| | Volver arriba | |  | | Killrazor
Registrado: 24 Ene 2006 Mensajes: 1182 Ubicación: Barcelona
| Publicado: 08/06/2007 11:41 am | | | Título: |
| Es asi en 2D. Pero cuando hablan de bitmap se refieren a mapas de bits y no a bmps de windows. Se refieren a matrices de pixeles alojados en la memoria. En 3D es parecido al final, pero la idea es que los puntos se transforman para pasarlos a 2D. El problema de un juego viene con el 3D, por que requiere mucha matematica. Hacer un juego en 2D es sencillo si el juego es sencillo. _________________ I wanna heal i wanna feel like I'm close to something real. I wanna find something I've wanted all along somewhere i belong |
| | Volver arriba | |  | Che_Quique
Registrado: 25 Oct 2006 Mensajes: 52 Ubicación: Lanus Este Bs As Argentina
| Publicado: 11/06/2007 9:42 am | | | Título: Necsito saber esto.............. |
| Nesesitaria que alguien comente linea por linea este simple test de manejo de auto: ---------------------------------------------------------------------------
#include <allegro.h> #include "imageInfo.h" volatile long speedCounter = 0; void incrementSpeedCounter(); int main(int argc, char* argv[]) { allegro_init(); install_keyboard(); install_timer(); install_int_ex(incrementSpeedCounter, BPS_TO_TIMER(60)); set_color_depth(16); set_gfx_mode(GFX_AUTODETECT, 640, 480, 0, 0); BITMAP *image1; BITMAP *bg; BITMAP *buffer; BITMAP *boom; BITMAP *mine[4]; //cause im lazy  for(int i=0;i<4;i++) { mine[i]=load_bitmap("mine.bmp",NULL); } buffer=create_bitmap(640,480); image1=load_bitmap("square.bmp",NULL); bg=load_bitmap("background.bmp",NULL); boom=load_bitmap("boom.bmp",NULL); image cImage1; cImage1.xPos=2; cImage1.yPos=426; cImage1.bbLeft=cImage1.xPos; cImage1.bbTop=cImage1.yPos; cImage1.bbRight=(cImage1.xPos+image1->w); cImage1.bbBottom=(cImage1.yPos+image1->h); image mineCoords[4]; mineCoords[0].xPos=39; mineCoords[0].yPos=426; mineCoords[0].bbLeft=mineCoords[0].xPos; mineCoords[0].bbTop=mineCoords[0].yPos; mineCoords[0].bbRight=(mineCoords[0].xPos+mine[0]->h); mineCoords[0].bbBottom=(mineCoords[0].yPos+mine[0]->w); mineCoords[1].xPos=168; mineCoords[1].yPos=404; mineCoords[1].bbLeft=mineCoords[1].xPos; mineCoords[1].bbTop=mineCoords[1].yPos; mineCoords[1].bbRight=(mineCoords[1].xPos+mine[1]->h); mineCoords[1].bbBottom=(mineCoords[1].yPos+mine[1]->w); mineCoords[2].xPos=360; mineCoords[2].yPos=426; mineCoords[2].bbLeft=mineCoords[2].xPos; mineCoords[2].bbTop=mineCoords[2].yPos; mineCoords[2].bbRight=(mineCoords[2].xPos+mine[2]->h); mineCoords[2].bbBottom=(mineCoords[2].yPos+mine[2]->w); mineCoords[3].xPos=487; mineCoords[3].yPos=404; mineCoords[3].bbLeft=mineCoords[3].xPos; mineCoords[3].bbTop=mineCoords[3].yPos; mineCoords[3].bbRight=(mineCoords[3].xPos+mine[3]->h); mineCoords[3].bbBottom=(mineCoords[3].yPos+mine[3]->w);
while(!key[KEY_ESC]) {
while(speedCounter>0) { if(key[KEY_UP]) { cImage1.yPos--; } if(key[KEY_DOWN]) { cImage1.yPos++; } if(key[KEY_LEFT]) { cImage1.xPos--; } if(key[KEY_RIGHT]) { cImage1.xPos++; }
//Updating collison info cImage1.bbLeft=cImage1.xPos; cImage1.bbTop=cImage1.yPos; cImage1.bbRight=(cImage1.xPos+image1->w); cImage1.bbBottom=(cImage1.yPos+image1->h); //To keep image from going off the road if(cImage1.yPos<=397) { cImage1.yPos++; } if(cImage1.bbBottom>=435) { cImage1.yPos--; } if(cImage1.xPos<=0) { cImage1.xPos++; } //check to see if we made it to the end if(cImage1.bbRight>=640) { textout_ex(screen,font,"You Won", 1, 1, 10,-1); rest(200); return 0; } for(int i=0;i<4;i++) { bool image1Collison=cImage1.checkCollision(mineCoords[i].bbLeft,mineCoords[i].bbRight,mineCoords[i].bbTop,mineCoords[i].bbBottom); bool mineCollison=mineCoords[i].checkCollision(cImage1.bbLeft,cImage1.bbRight,cImage1.bbTop,cImage1.bbBottom); if(image1Collison) { clear_bitmap(buffer); blit(bg,buffer,0,0,0,0,640,480); draw_sprite(buffer,boom,mineCoords[i].xPos,mineCoords[i].yPos); blit(buffer,screen,0,0,0,0,640,480); textout_ex(screen,font,"You Blew UP", 1, 1, 30,-1); rest(2000); return 0; } if(mineCollison) { clear_bitmap(buffer); blit(bg,buffer,0,0,0,0,640,480); draw_sprite(buffer,boom,mineCoords[i].xPos,mineCoords[i].yPos); blit(buffer,screen,0,0,0,0,640,480); textout_ex(screen,font,"You Blew UP", 1, 1, 30,-1); rest(2000); return 0; } }
speedCounter--; } acquire_screen(); blit(bg,buffer,0,0,0,0,640,480); draw_sprite(buffer, image1, cImage1.xPos, cImage1.yPos); for(int i=0;i<4;i++) { draw_sprite(buffer,mine[i],mineCoords[i].xPos,mineCoords[i].yPos); } blit(buffer, screen, 0,0,0,0,640,480); clear_bitmap(buffer); release_screen(); } destroy_bitmap(image1); for(int i=0;i<4;i++) { destroy_bitmap(mine[i]); } destroy_bitmap(bg); destroy_bitmap(boom); destroy_bitmap(buffer); allegro_exit(); return 0; } END_OF_MAIN(); void incrementSpeedCounter() { speedCounter++; } END_OF_FUNCTION(incrementSpeedCounter);
-----------------------------------------------------------------------------
Por favor, que contiene imagen en movimiento y creo que doble buffer.
El que quiera todos los archivos del test que me lo pida. _________________
"No experimentaremos una alegria miserable, sino una alegria que pertenecera a millones"
Che Quique. |
| | Volver arriba | |  | | |
| No puede crear mensajes No puede responder temas No puede editar sus mensajes No puede borrar sus mensajes No puede votar en encuestas
|
|
| |