Your codes is really hard to read because when you posted it, all the formatting got lost. Next time put your code between [ pascal ] [ /pascal ] (there's a button above the text field) to make sure the formatting is preserved.

A few things:
Using a TImage component as back-buffer is overkill. Use a TBitmap instead that you create dynamically in OnCreate and free in OnClose.

You will only need one target canvas (either that of a TPaintBox or even your form's canvas) and one back-buffer. You can have more than one buffer, but one is enough to get everything flicker free.

The mask-system to achieve transparency works but there's an easier method. Let's say Image1 holds a sprite that you want to be transparent. Then try this:

[pascal]
// Upon program initialization
Image1.TransparentColor := clFuchsia; //Whatever;
Image1.Transparent := True;

// Actual drawing
PaintBox1.Canvas.Draw(0, 0, Image1.Picture.Bitmap);[/pascal]

This will give you transparency without having to worry about masks.


The "proper" way of working with a back-buffer is:

1.) Clear the backbuffer (might not be necessary if tiles fill the entire buffer)
2.) Draw the tiles onto the buffer (back to front)
3.) Draw the sprites onto the buffer
4.) Draw the buffer onto the target-canvas