I posted a topic about my code, but I found that I believe the solution can be found by asking this question instead of the other. Something is wrong with my transparency and I'm having a lot of problems with it.
I made the background of the screen white to show my problem. I tiled using this tileset:
http://img139.imageshack.us/img139/767/tiledu3.png
My grid is 3x3 using all of tile number 2 (The green one)
I then draw another tile to the screen coord (20, 20). This 2nd tile that I draw is tile 3 (the transparent one). Now this should just display the 3x3 grid of the green tiles.. because the tile drawn over them is transparent right? Well this is what I actually see:
{"name":"error2yd8.png","src":"\/\/djungxnpq2nug.cloudfront.net\/image\/cache\/c\/8\/c81a84b4d26c617e32aeccc19bf161fe.png","w":646,"h":512,"tn":"\/\/djungxnpq2nug.cloudfront.net\/image\/cache\/c\/8\/c81a84b4d26c617e32aeccc19bf161fe"}
Here is the relevant code:
Main:
| 1 | BITMAP *tile; |
| 2 | BITMAP* draw; |
| 3 | PALETTE palette; |
| 4 | set_palette(palette); |
| 5 | |
| 6 | cTile Tile; |
| 7 | Tile.LoadTileSet("tile.bmp", 64, 64, palette) |
| 8 | tile = create_bitmap(64, 64); |
| 9 | draw = create_bitmap(64,64); |
| 10 | draw = Tile.GetTile(3); |
| 11 | tile = Tile.GetTile(2); |
| 12 | while(!key[KEY_ESC]) |
| 13 | { |
| 14 | for(int y = 0; y < 3; y++) |
| 15 | { |
| 16 | for(int x = 0; x < 3; x++) |
| 17 | { |
| 18 | thescreen.DrawToBuffer(tile, 0, 0, tile->w * x, tile->h * y); |
| 19 | } |
| 20 | } |
| 21 | thescreen.DrawToBuffer(draw, 0, 0, 20, 20); |
| 22 | vsync(); |
| 23 | thescreen.Swap(); |
| 24 | } |
| 25 | destroy_bitmap(tile); |
| 26 | destroy_bitmap(draw); |
Tile:
| 1 | BOOL cTile::LoadTileSet(char* Filename, int TileWidth, int TileHeight, PALETTE Palette) |
| 2 | { |
| 3 | m_Filename = Filename; |
| 4 | m_TileSet = load_bitmap(Filename, Palette); |
| 5 | if(!m_TileSet) { return FALSE;} |
| 6 | if(TileWidth == 0 || TileHeight == 0) { return FALSE;} |
| 7 | m_TileWidth = TileWidth; |
| 8 | m_TileHeight = TileHeight; |
| 9 | if(m_TileSet->h % TileHeight != 0) { return FALSE;} |
| 10 | m_Rows = m_TileSet->h / TileHeight; |
| 11 | if(m_TileSet->w % TileWidth != 0) { return FALSE;} |
| 12 | m_Cols = m_TileSet->w / TileWidth; |
| 13 | return TRUE; |
| 14 | } |
| 15 | BITMAP* cTile::GetTile(int TileNum) |
| 16 | { |
| 17 | // Is the Tile Number in range? |
| 18 | if(TileNum > ((m_Cols * m_Rows) - 1)) |
| 19 | { |
| 20 | allegro_message("TileSet: %s\nTile: %d\nDoes not exhist!", m_Filename, TileNum); |
| 21 | TileNum = ((m_Cols * m_Rows) - 1); |
| 22 | allegro_message("Using Tile: %d", TileNum); |
| 23 | } |
| 24 | BITMAP* tile; |
| 25 | tile = create_bitmap(m_TileWidth, m_TileHeight); |
| 26 | int tilexpos = 0; |
| 27 | int tileypos = 0; |
| 28 | |
| 29 | tileypos = ((TileNum / m_Cols) * m_TileHeight); |
| 30 | tilexpos = ((TileNum % m_Cols) * m_TileWidth); |
| 31 | masked_blit(m_TileSet, tile, tilexpos, tileypos, 0, 0, m_TileWidth, m_TileHeight); |
| 32 | return tile; |
| 33 | } |
Screen:
| 1 | BOOL cScreen::Swap() |
| 2 | { |
| 3 | blit(BackBuffer, screen, 0, 0, 0, 0, BackBuffer->w, BackBuffer->h); |
| 4 | ClearBuffer(); |
| 5 | return TRUE; |
| 6 | } |
| 7 | |
| 8 | BOOL cScreen::ClearBuffer() |
| 9 | { |
| 10 | //clear_to_color(BackBuffer, bitmap_mask_color(BackBuffer)); |
| 11 | clear_to_color(BackBuffer, makecol(250, 250, 250)); |
| 12 | return TRUE; |
| 13 | } |
| 14 | |
| 15 | BOOL cScreen::DrawToBuffer(BITMAP* backbuf, int xpos, int ypos, int xdes = 0, int ydes = 0) |
| 16 | { |
| 17 | masked_blit(backbuf, BackBuffer, xpos, ypos, xdes, ydes, backbuf->w, backbuf->h); |
| 18 | return TRUE; |
| 19 | } |


EDIT: Well after thinking more about the knowledge miran gave me from my old post
You must not use masked_blit() when you copy the back buffer to the screen. ...
I went through and looked and I used masked_blit() in more than one place. I see that using this more than once on a given bitmap is not a good idea. I now have changed my GetTile() method to return a bit() of the tileset instead of a masked_blit. I am now only using masked_blit in the DrawToBuffer() method. I guess solving your own problems is always best sometimes.
EDIT: FIXED: FYI That means IT WORKS now.. and when I use
clear_to_color(BackBuffer, bitmap_mask_color(BackBuffer));
It actually draws the pink color instead of the black I was seeing.