Have you guys seen this problem with Allegro before?

Started by
4 comments, last by markr 19 years, 1 month ago
I've got a program that loads a small grid and places some tiles in the grid (for a map editor) When the program loads (in fullscreen), I'll often get an image that is all messed up. (messedup.gif) If I run the program in windowed mode, or add a rest() to watch it display slowed down, the program displays everything just fine (normal.gif)). Have you guys seen this before?
Advertisement
It's unlikely that this is a problem with Allegro. My first guess is that you are doing something goofy either with setting up fullscreen mode or when you draw the tiles. But all I or anyone else can do is guess unless you show some code to help narrow it down.
You are using DirectDraw as the Allegro back-end, and you haven't read the documentation properly.

One of the "features" of DirectDraw is that it sometimes arbitarily throws your surface image data away. Allegro has a callback which will notify your program of this, but you can't do anything about it.

This is NOT a fault of Allegro, but a fact of the way DirectDraw works. Allegro does not automatically double-buffer your screen, so you have to do that yourself.

Bottom line: If you're not redrawing the entire screen each frame (for instance, if you're using dirty rectangles), you need to keep an eye out for this event, and once it is delivered, plan to redraw the entire screen soon.

This is in contrast from the other drivers (like the win32 GDI driver), which automatically save a copy of the "screen" bitmap so that it can be redrawn as necessary transparently to the app.

Mark
I've just assumed this was something that I'm not doing properly, so here are my functions (it's the whole source since main() is very short):

#include "allegro.h"   void drawMapGrid(){        line(screen, 0, 0, 340, 0, makecol(255, 255, 255));    for (int x=0; x<=340; x+=17){        line(screen, x, 0, x, 255, makecol(255, 255, 255));        //rest(50);    }        line(screen, 0, 255, 340, 255, makecol(255, 255, 255));    for (int y=0; y<=255; y+=17){        line(screen, 0, y, 340, y, makecol(255, 255, 255));        //rest(50);    }        return;}END_OF_FUNCTION(drawMapGrid); void loadTiles(){        BITMAP *mapTile = load_bitmap("tiles/grass.bmp", 0);        for (int y=1; y<255; y+=17){        for (int x=1; x<340; x+=17){            draw_sprite(screen, mapTile, x, y);        }        //rest(50);    }        return;}END_OF_FUNCTION(loadTiles);int main() {         // initialize allegro    allegro_init();     install_keyboard();    install_timer();    install_mouse();    set_color_depth(16);     set_gfx_mode(GFX_AUTODETECT, 640, 480, 0, 0);        // draw the map    drawMapGrid();        // load tiles    loadTiles();        show_mouse(screen);    poll_mouse();        // quit sequence    int doQuit = 0;         while (doQuit == 0) {          readkey();                  if(key[KEY_ESC]) {            doQuit=1;        }        }        return 0; } END_OF_MAIN();


drawMapGrid() always displays properly. It's my loadTiles() that doesn't display correctly.

Is there anything you can see that I am missing?
Sorry, I didn't see the post about needing to double buffer.
You don't need to double-buffer, but you do need to be aware of the need to redraw if Allegro tells you that you have to.

Double buffering might be an effective way of doing that, that's all.

DirectDraw will take the surface away (and fill it with black or white when it brings it back, typically). You will have to redraw.

Mark

This topic is closed to new replies.

Advertisement