Ver Mensaje Individual
  #1 (permalink)  
Antiguo 20/11/2013, 23:49
josnoc
 
Fecha de Ingreso: noviembre-2013
Mensajes: 5
Antigüedad: 10 años, 5 meses
Puntos: 0
no funciona doble buffering en allegro con c++

Pues de antemano muchas gracias por las respuestas que puedan solicitarme el problema es que no puedo realizar con exito el doble buffering pues al compilar el codigo que tengo parpadea demasiado porfavor ayuda y de antemano muchisimas gracias :P anexo mi codigo para que lo chequen:

Código:
#include <allegro.h>
#include "inicia.h"

#define ancho_pantalla 340
#define alto_pantalla 380

//------------------------POO----------------------------
class Personaje
{
    public:
        BITMAP *Personaj;
        BITMAP *buffer_pers;
        int ancho, alto, posx, posy, Estado, dir, contador, restador;
        Personaje(BITMAP *pers, BITMAP *mini_buffer);
        void Dibujar(BITMAP *buffer, BITMAP *izquierda);
        void Dibujar_accion(BITMAP *buffer, BITMAP *accion);
        void caminar();
        void Correr();
        void Saltar();
        void morir();
        void Agacharse();
        void Disparar();
        void Matar();
};

Personaje::Personaje(BITMAP *pers, BITMAP *mini_buffer){
    Personaj = pers;
    buffer_pers = mini_buffer;
    dir = 1;
    ancho = 37;
    alto = 37;
    posx = 0;
    posy = 100;
    contador = 0;
    Estado = 0;
    restador = 2;
}

void Personaje::Dibujar(BITMAP *buffer, BITMAP *izquierda){
    if (dir == 1){
        blit(Personaj,buffer_pers,0,0,0,0,37,37);
        draw_sprite(buffer,buffer_pers,posx,posy);
    }
    else{
        blit(izquierda,buffer_pers,0,0,0,0,37,37);
        draw_sprite(buffer,buffer_pers,posx,posy);
    }
}

void Personaje::Dibujar_accion(BITMAP *buffer, BITMAP *accion){
    if (Estado == 1){
        if (dir == 1){
            if (contador < 3){
                blit(accion,buffer_pers,contador*37,0,0,0,37,37);
                draw_sprite(buffer,buffer_pers,posx,posy);
                rest(80);
            }
            else{
                contador = 0;
            }
            contador++;
        }
        else{
            if (restador >= 0){
                blit(accion,buffer_pers,restador*37,0,0,0,37,37);
                draw_sprite(buffer,buffer_pers,posx,posy);
                rest(80);
            }
            else{
                restador = 2;
            }
            restador--;
        }
    }
}

void Personaje::caminar(){
    if (dir==1 and posx < ancho_pantalla-ancho){
        posx +=10;
    }
    else if(dir == -1 and posx >= 0){
        posx -= 10;
    }

}


//----------------------------struct--------------------------------

BITMAP *buffer;
BITMAP *mario_buffer;
BITMAP *mario_parado;
BITMAP *mario_paradoI;
BITMAP *mario_caminar;
BITMAP *mario_caminarI;

void pantalla(){
    blit(buffer,screen,0,0,0,0,ancho_pantalla,alto_pantalla);
}

int main()
{
    inicia_allegro(ancho_pantalla,alto_pantalla);
    inicia_audio(70,70);

    buffer = create_bitmap(ancho_pantalla, alto_pantalla);
    mario_buffer = create_bitmap(37,37);
    mario_parado = load_bitmap("recursos/parado.bmp",NULL);
    mario_paradoI = load_bitmap("recursos/parado_i.bmp",NULL);
    mario_caminar = load_bitmap("recursos/caminar_adelante.bmp",NULL);
    mario_caminarI = load_bitmap("recursos/caminar_atras.bmp",NULL);

    Personaje mario(mario_parado, mario_buffer);

    while (!key[KEY_ESC]){
        if (key[KEY_D]){
            mario.dir = 1;
            mario.Estado = 1;
            mario.caminar();
        }
        else if(key[KEY_A]){
            mario.dir = -1;
            mario.Estado = 1;
            mario.caminar();
        }
        else if (keypressed){
            mario.Estado = 0;
        }
        clear(buffer);
        if (mario.Estado == 0){
            if (mario.dir == 1){
                mario.Dibujar(buffer,NULL);
            }
            else{
                mario.Dibujar(buffer,mario_paradoI);
            }
        }
        else{
            if(mario.dir == 1) mario.Dibujar_accion(buffer,mario_caminar);
            else mario.Dibujar_accion(buffer,mario_caminarI);
        }
        pantalla();
        rest(30);
    }

    destroy_bitmap(buffer);

    return 0;
}
END_OF_MAIN();