21/11/2013, 13:25
|
| | Fecha de Ingreso: noviembre-2013
Mensajes: 5
Antigüedad: 11 años, 1 mes Puntos: 0 | |
Respuesta: no funciona doble buffering en allegro con c++ Cita:
Iniciado por vosk Prueba a bloquear el screen:
Código C:
Ver originalvoid pantalla() { acquire_screen(); blit(buffer, screen, 0, 0, 0, 0, ancho_pantalla, alto_pantalla); release_screen(); }
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();
|