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

Cita:
Iniciado por vosk Ver Mensaje
Prueba a bloquear el screen:

Código C:
Ver original
  1. void pantalla() {
  2.     acquire_screen();
  3.     blit(buffer, screen, 0, 0, 0, 0, ancho_pantalla, alto_pantalla);
  4.     release_screen();
  5. }

Saludos
vosk

Muchisisisisisimas gracias vosk por tu pronta respuesta pues acabo de probar lo de bloquear el screen y no me funciona no se por que y ahora es más extraño por que comente el "clear(buffer);" y apesar de ello me sigue limpiando la pantalla al correrlo y no se por quee :O anexo mi codigo que agregué algunas cosas para que lo puedan revisar:

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

#define ancho_pantalla 800
#define alto_pantalla 600

//------------------------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;
BITMAP *cielo_dia;

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

void dibujar_mapa(){
    blit(cielo_dia,buffer,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);
    cielo_dia = load_bitmap("recursos/cielo_dia.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);
        dibujar_mapa();

        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(40);
    }

    destroy_bitmap(buffer);

    return 0;
}
END_OF_MAIN();